Formatted code

Added Eclipse formatter and cleanup configuration
This commit is contained in:
Patrick Gotthard 2013-10-12 15:05:21 +02:00
parent a482dcb959
commit 12fa5bbab6
26 changed files with 1913 additions and 1491 deletions

56
cleanup.xml Normal file
View file

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="2">
<profile kind="CleanUpProfile" name="ROME" version="2">
<setting id="cleanup.remove_unused_private_fields" value="true"/>
<setting id="cleanup.always_use_parentheses_in_expressions" value="false"/>
<setting id="cleanup.never_use_blocks" value="false"/>
<setting id="cleanup.remove_unused_private_methods" value="true"/>
<setting id="cleanup.add_missing_deprecated_annotations" value="true"/>
<setting id="cleanup.convert_to_enhanced_for_loop" value="true"/>
<setting id="cleanup.remove_unnecessary_nls_tags" value="true"/>
<setting id="cleanup.sort_members" value="false"/>
<setting id="cleanup.remove_unused_local_variables" value="false"/>
<setting id="cleanup.never_use_parentheses_in_expressions" value="true"/>
<setting id="cleanup.remove_unused_private_members" value="false"/>
<setting id="cleanup.remove_unnecessary_casts" value="true"/>
<setting id="cleanup.make_parameters_final" value="true"/>
<setting id="cleanup.use_this_for_non_static_field_access" value="true"/>
<setting id="cleanup.remove_private_constructors" value="true"/>
<setting id="cleanup.use_blocks" value="true"/>
<setting id="cleanup.always_use_this_for_non_static_method_access" value="false"/>
<setting id="cleanup.remove_trailing_whitespaces_all" value="true"/>
<setting id="cleanup.always_use_this_for_non_static_field_access" value="false"/>
<setting id="cleanup.use_this_for_non_static_field_access_only_if_necessary" value="true"/>
<setting id="cleanup.add_default_serial_version_id" value="true"/>
<setting id="cleanup.make_type_abstract_if_missing_method" value="false"/>
<setting id="cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class" value="true"/>
<setting id="cleanup.make_variable_declarations_final" value="true"/>
<setting id="cleanup.add_missing_nls_tags" value="false"/>
<setting id="cleanup.format_source_code" value="true"/>
<setting id="cleanup.qualify_static_method_accesses_with_declaring_class" value="false"/>
<setting id="cleanup.add_missing_override_annotations" value="true"/>
<setting id="cleanup.remove_unused_private_types" value="true"/>
<setting id="cleanup.add_missing_methods" value="false"/>
<setting id="cleanup.make_local_variable_final" value="true"/>
<setting id="cleanup.correct_indentation" value="true"/>
<setting id="cleanup.add_missing_override_annotations_interface_methods" value="true"/>
<setting id="cleanup.remove_unused_imports" value="true"/>
<setting id="cleanup.remove_trailing_whitespaces_ignore_empty" value="false"/>
<setting id="cleanup.make_private_fields_final" value="true"/>
<setting id="cleanup.add_generated_serial_version_id" value="false"/>
<setting id="cleanup.organize_imports" value="true"/>
<setting id="cleanup.remove_trailing_whitespaces" value="true"/>
<setting id="cleanup.sort_members_all" value="false"/>
<setting id="cleanup.use_blocks_only_for_return_and_throw" value="false"/>
<setting id="cleanup.add_missing_annotations" value="true"/>
<setting id="cleanup.use_parentheses_in_expressions" value="true"/>
<setting id="cleanup.qualify_static_field_accesses_with_declaring_class" value="false"/>
<setting id="cleanup.use_this_for_non_static_method_access_only_if_necessary" value="true"/>
<setting id="cleanup.use_this_for_non_static_method_access" value="true"/>
<setting id="cleanup.qualify_static_member_accesses_through_instances_with_declaring_class" value="true"/>
<setting id="cleanup.add_serial_version_id" value="false"/>
<setting id="cleanup.format_source_code_changes_only" value="false"/>
<setting id="cleanup.qualify_static_member_accesses_with_declaring_class" value="true"/>
<setting id="cleanup.always_use_blocks" value="true"/>
</profile>
</profiles>

291
formatter.xml Normal file
View file

@ -0,0 +1,291 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="12">
<profile kind="CodeFormatterProfile" name="ROME" version="12">
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="160"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
</profile>
</profiles>

View file

@ -16,22 +16,21 @@
*/ */
package org.rometools.fetcher; package org.rometools.fetcher;
import java.io.IOException;
import java.net.URL;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.FeedException; import com.sun.syndication.io.FeedException;
import java.io.IOException;
import java.net.URL;
public interface FeedFetcher { public interface FeedFetcher {
/** /**
* <p>The default user agent. It is not marked final so * <p>
* buggy java compiler will not write this string * The default user agent. It is not marked final so buggy java compiler will not write this string into all classes that reference it.
* into all classes that reference it.</p> * </p>
* *
* <p>http://tinyurl.com/64t5n points to https://rome.dev.java.net * <p>
* Some servers ban user agents with "Java" in the name.</p> * http://tinyurl.com/64t5n points to https://rome.dev.java.net Some servers ban user agents with "Java" in the name.
* </p>
* *
*/ */
public static String DEFAULT_USER_AGENT = "Rome Client (http://tinyurl.com/64t5n)"; public static String DEFAULT_USER_AGENT = "Rome Client (http://tinyurl.com/64t5n)";
@ -47,35 +46,48 @@ public interface FeedFetcher {
public abstract String getUserAgent(); public abstract String getUserAgent();
/** /**
* <p>Turn on or off rfc3229 delta encoding</p> * <p>
* Turn on or off rfc3229 delta encoding
* </p>
* *
* <p>See http://www.ietf.org/rfc/rfc3229.txt and http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html</p> * <p>
* See http://www.ietf.org/rfc/rfc3229.txt and http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html
* </p>
* *
* <p>NOTE: This is experimental and feedback is welcome!</p> * <p>
* NOTE: This is experimental and feedback is welcome!
* </p>
* *
* @param useDeltaEncoding * @param useDeltaEncoding
*/ */
public abstract void setUsingDeltaEncoding(boolean useDeltaEncoding); public abstract void setUsingDeltaEncoding(boolean useDeltaEncoding);
/** /**
* <p>Is this fetcher using rfc3229 delta encoding?</p> * <p>
* Is this fetcher using rfc3229 delta encoding?
* </p>
* *
* @return * @return
*/ */
public abstract boolean isUsingDeltaEncoding(); public abstract boolean isUsingDeltaEncoding();
/** /**
* <p>Add a FetcherListener.</p> * <p>
* Add a FetcherListener.
* </p>
* *
* <p>The FetcherListener will receive an FetcherEvent when * <p>
* a Fetcher event (feed polled, retrieved, etc) occurs</p> * The FetcherListener will receive an FetcherEvent when a Fetcher event (feed polled, retrieved, etc) occurs
* </p>
* *
* @param listener The FetcherListener to recieve the event * @param listener The FetcherListener to recieve the event
*/ */
public abstract void addFetcherEventListener(FetcherListener listener); public abstract void addFetcherEventListener(FetcherListener listener);
/** /**
* <p>Remove a FetcherListener</p> * <p>
* Remove a FetcherListener
* </p>
* *
* @param listener The FetcherListener to remove * @param listener The FetcherListener to remove
*/ */
@ -91,15 +103,13 @@ public interface FeedFetcher {
* @throws FeedException if the feed is not valid * @throws FeedException if the feed is not valid
* @throws FetcherException if a HTTP error occurred * @throws FetcherException if a HTTP error occurred
*/ */
public abstract SyndFeed retrieveFeed(URL feedUrl) public abstract SyndFeed retrieveFeed(URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException;
throws IllegalArgumentException, IOException, FeedException, FetcherException;
public SyndFeed retrieveFeed(String userAgent, URL url) public SyndFeed retrieveFeed(String userAgent, URL url) throws IllegalArgumentException, IOException, FeedException, FetcherException;
throws IllegalArgumentException, IOException, FeedException, FetcherException;
/** /**
* If set to true, the WireFeed will be made accessible from the SyndFeed object returned from the Fetcher * If set to true, the WireFeed will be made accessible from the SyndFeed object returned from the Fetcher via the originalWireFeed() method. Each Entry in
* via the originalWireFeed() method. Each Entry in the feed will have the corresponding wireEntry property set. * the feed will have the corresponding wireEntry property set.
*/ */
void setPreserveWireFeed(boolean preserveWireFeed); void setPreserveWireFeed(boolean preserveWireFeed);
} }

View file

@ -5,9 +5,8 @@ import java.util.EventObject;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;
/** /**
* Implementation note: FetcherEvent is not thread safe. Make sure that * Implementation note: FetcherEvent is not thread safe. Make sure that they are only ever accessed by one thread. If necessary, make all getters and setters
* they are only ever accessed by one thread. If necessary, make all getters * synchronized, or alternatively make all fields final.
* and setters synchronized, or alternatively make all fields final.
* *
* @author nl * @author nl
*/ */
@ -23,27 +22,27 @@ public class FetcherEvent extends EventObject {
private String urlString; private String urlString;
private SyndFeed feed; private SyndFeed feed;
public FetcherEvent(Object source) { public FetcherEvent(final Object source) {
super(source); super(source);
} }
public FetcherEvent(final Object source, final String urlStr, final String eventType) {
public FetcherEvent(Object source, String urlStr, String eventType) {
this(source); this(source);
setUrlString(urlStr); setUrlString(urlStr);
setEventType(eventType); setEventType(eventType);
} }
public FetcherEvent(Object source, String urlStr, String eventType, SyndFeed feed) { public FetcherEvent(final Object source, final String urlStr, final String eventType, final SyndFeed feed) {
this(source, urlStr, eventType); this(source, urlStr, eventType);
setFeed(feed); setFeed(feed);
} }
/** /**
* @return Returns the feed. * @return Returns the feed.
* *
* <p>The feed will only be set if the eventType is EVENT_TYPE_FEED_RETRIEVED</p> * <p>
* The feed will only be set if the eventType is EVENT_TYPE_FEED_RETRIEVED
* </p>
*/ */
public SyndFeed getFeed() { public SyndFeed getFeed() {
return feed; return feed;
@ -52,9 +51,11 @@ public class FetcherEvent extends EventObject {
/** /**
* @param feed The feed to set. * @param feed The feed to set.
* *
* <p>The feed will only be set if the eventType is EVENT_TYPE_FEED_RETRIEVED</p> * <p>
* The feed will only be set if the eventType is EVENT_TYPE_FEED_RETRIEVED
* </p>
*/ */
public void setFeed(SyndFeed feed) { public void setFeed(final SyndFeed feed) {
this.feed = feed; this.feed = feed;
} }
@ -64,22 +65,25 @@ public class FetcherEvent extends EventObject {
public String getEventType() { public String getEventType() {
return eventType; return eventType;
} }
/** /**
* @param eventType The eventType to set. * @param eventType The eventType to set.
*/ */
public void setEventType(String eventType) { public void setEventType(final String eventType) {
this.eventType = eventType; this.eventType = eventType;
} }
/** /**
* @return Returns the urlString. * @return Returns the urlString.
*/ */
public String getUrlString() { public String getUrlString() {
return urlString; return urlString;
} }
/** /**
* @param urlString The urlString to set. * @param urlString The urlString to set.
*/ */
public void setUrlString(String urlString) { public void setUrlString(final String urlString) {
this.urlString = urlString; this.urlString = urlString;
} }
} }

View file

@ -25,21 +25,21 @@ public class FetcherException extends Exception {
int responseCode; int responseCode;
public FetcherException(Throwable cause) { public FetcherException(final Throwable cause) {
super(); super();
initCause(cause); initCause(cause);
} }
public FetcherException(String message, Throwable cause) { public FetcherException(final String message, final Throwable cause) {
super(message); super(message);
initCause(cause); initCause(cause);
} }
public FetcherException(String message) { public FetcherException(final String message) {
super(message); super(message);
} }
public FetcherException(int responseCode, String message) { public FetcherException(final int responseCode, final String message) {
this(message); this(message);
this.responseCode = responseCode; this.responseCode = responseCode;
} }

View file

@ -2,11 +2,12 @@ package org.rometools.fetcher;
import java.util.EventListener; import java.util.EventListener;
public interface FetcherListener extends EventListener { public interface FetcherListener extends EventListener {
/** /**
* <p>Called when a fetcher event occurs</p> * <p>
* Called when a fetcher event occurs
* </p>
* *
* @param event the event that fired * @param event the event that fired
*/ */

View file

@ -26,12 +26,12 @@ import java.util.Iterator;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
import com.sun.syndication.feed.synd.SyndFeed;
import org.rometools.fetcher.FeedFetcher; import org.rometools.fetcher.FeedFetcher;
import org.rometools.fetcher.FetcherEvent; import org.rometools.fetcher.FetcherEvent;
import org.rometools.fetcher.FetcherException; import org.rometools.fetcher.FetcherException;
import org.rometools.fetcher.FetcherListener; import org.rometools.fetcher.FetcherListener;
import com.sun.syndication.feed.synd.SyndFeed;
public abstract class AbstractFeedFetcher implements FeedFetcher { public abstract class AbstractFeedFetcher implements FeedFetcher {
private final Set fetcherEventListeners; private final Set fetcherEventListeners;
@ -39,13 +39,11 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
private boolean usingDeltaEncoding; private boolean usingDeltaEncoding;
private boolean preserveWireFeed; private boolean preserveWireFeed;
public AbstractFeedFetcher() { public AbstractFeedFetcher() {
fetcherEventListeners = Collections.synchronizedSet(new HashSet()); fetcherEventListeners = Collections.synchronizedSet(new HashSet());
Properties props = new Properties(System.getProperties()); final Properties props = new Properties(System.getProperties());
String resourceName = "fetcher.properties"; final String resourceName = "fetcher.properties";
try { try {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resourceName); InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resourceName);
@ -59,18 +57,18 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
} else { } else {
System.err.println("Could not find " + resourceName + " on classpath"); System.err.println("Could not find " + resourceName + " on classpath");
} }
} catch (IOException e) { } catch (final IOException e) {
// do nothing - we don't want to fail just because we could not find the version // do nothing - we don't want to fail just because we could not find the version
System.err.println("Error reading " + resourceName + " from classpath: " + e.getMessage()); System.err.println("Error reading " + resourceName + " from classpath: " + e.getMessage());
} }
setUserAgent(DEFAULT_USER_AGENT + " Ver: " + System.getProperty("rome.fetcher.version", "UNKNOWN")); setUserAgent(DEFAULT_USER_AGENT + " Ver: " + System.getProperty("rome.fetcher.version", "UNKNOWN"));
} }
/** /**
* @return the User-Agent currently being sent to servers * @return the User-Agent currently being sent to servers
*/ */
@Override
public synchronized String getUserAgent() { public synchronized String getUserAgent() {
return userAgent; return userAgent;
} }
@ -78,7 +76,8 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
/** /**
* @param string The User-Agent to sent to servers * @param string The User-Agent to sent to servers
*/ */
public synchronized void setUserAgent(String string) { @Override
public synchronized void setUserAgent(final String string) {
userAgent = string; userAgent = string;
} }
@ -86,17 +85,16 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
* @param eventType The event type to fire * @param eventType The event type to fire
* @param connection the current connection * @param connection the current connection
*/ */
protected void fireEvent(String eventType, URLConnection connection) { protected void fireEvent(final String eventType, final URLConnection connection) {
fireEvent(eventType, connection.getURL().toExternalForm(), null); fireEvent(eventType, connection.getURL().toExternalForm(), null);
} }
/** /**
* @param eventType The event type to fire * @param eventType The event type to fire
* @param connection the current connection * @param connection the current connection
* @param feed The feed to pass to the event * @param feed The feed to pass to the event
*/ */
protected void fireEvent(String eventType, URLConnection connection, SyndFeed feed) { protected void fireEvent(final String eventType, final URLConnection connection, final SyndFeed feed) {
fireEvent(eventType, connection.getURL().toExternalForm(), feed); fireEvent(eventType, connection.getURL().toExternalForm(), feed);
} }
@ -104,7 +102,7 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
* @param eventType The event type to fire * @param eventType The event type to fire
* @param urlStr the current url as a string * @param urlStr the current url as a string
*/ */
protected void fireEvent(String eventType, String urlStr) { protected void fireEvent(final String eventType, final String urlStr) {
fireEvent(eventType, urlStr, null); fireEvent(eventType, urlStr, null);
} }
@ -113,12 +111,12 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
* @param urlStr the current url as a string * @param urlStr the current url as a string
* @param feed The feed to pass to the event * @param feed The feed to pass to the event
*/ */
protected void fireEvent(String eventType, String urlStr, SyndFeed feed) { protected void fireEvent(final String eventType, final String urlStr, final SyndFeed feed) {
FetcherEvent fetcherEvent = new FetcherEvent(this, urlStr, eventType, feed); final FetcherEvent fetcherEvent = new FetcherEvent(this, urlStr, eventType, feed);
synchronized (fetcherEventListeners) { synchronized (fetcherEventListeners) {
Iterator iter = fetcherEventListeners.iterator(); final Iterator iter = fetcherEventListeners.iterator();
while (iter.hasNext()) { while (iter.hasNext()) {
FetcherListener fetcherEventListener = (FetcherListener) iter.next(); final FetcherListener fetcherEventListener = (FetcherListener) iter.next();
fetcherEventListener.fetcherEvent(fetcherEvent); fetcherEventListener.fetcherEvent(fetcherEvent);
} }
} }
@ -127,7 +125,8 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
/** /**
* @see com.sun.syndication.fetcher.FeedFetcher#addFetcherEventListener(com.sun.syndication.fetcher.FetcherListener) * @see com.sun.syndication.fetcher.FeedFetcher#addFetcherEventListener(com.sun.syndication.fetcher.FetcherListener)
*/ */
public void addFetcherEventListener(FetcherListener listener) { @Override
public void addFetcherEventListener(final FetcherListener listener) {
if (listener != null) { if (listener != null) {
fetcherEventListeners.add(listener); fetcherEventListeners.add(listener);
} }
@ -137,7 +136,8 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
/** /**
* @see com.sun.syndication.fetcher.FeedFetcher#removeFetcherEventListener(com.sun.syndication.fetcher.FetcherListener) * @see com.sun.syndication.fetcher.FeedFetcher#removeFetcherEventListener(com.sun.syndication.fetcher.FetcherListener)
*/ */
public void removeFetcherEventListener(FetcherListener listener) { @Override
public void removeFetcherEventListener(final FetcherListener listener) {
if (listener != null) { if (listener != null) {
fetcherEventListeners.remove(listener); fetcherEventListeners.remove(listener);
} }
@ -146,23 +146,28 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
/** /**
* @return Returns the useDeltaEncoding. * @return Returns the useDeltaEncoding.
*/ */
@Override
public synchronized boolean isUsingDeltaEncoding() { public synchronized boolean isUsingDeltaEncoding() {
return usingDeltaEncoding; return usingDeltaEncoding;
} }
/** /**
* @param useDeltaEncoding The useDeltaEncoding to set. * @param useDeltaEncoding The useDeltaEncoding to set.
*/ */
public synchronized void setUsingDeltaEncoding(boolean useDeltaEncoding) { @Override
this.usingDeltaEncoding = useDeltaEncoding; public synchronized void setUsingDeltaEncoding(final boolean useDeltaEncoding) {
usingDeltaEncoding = useDeltaEncoding;
} }
/** /**
* <p>Handles HTTP error codes.</p> * <p>
* Handles HTTP error codes.
* </p>
* *
* @param responseCode the HTTP response code * @param responseCode the HTTP response code
* @throws FetcherException if response code is in the range 400 to 599 inclusive * @throws FetcherException if response code is in the range 400 to 599 inclusive
*/ */
protected void handleErrorCodes(int responseCode) throws FetcherException { protected void handleErrorCodes(final int responseCode) throws FetcherException {
// Handle 2xx codes as OK, so ignore them here // Handle 2xx codes as OK, so ignore them here
// 3xx codes are handled by the HttpURLConnection class // 3xx codes are handled by the HttpURLConnection class
if (responseCode == 403) { if (responseCode == 403) {
@ -175,25 +180,28 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
} }
} }
protected void throw4XXError(int responseCode) throws FetcherException { protected void throw4XXError(final int responseCode) throws FetcherException {
throw new FetcherException(responseCode, "The requested resource could not be found. HTTP Response code was:" + responseCode); throw new FetcherException(responseCode, "The requested resource could not be found. HTTP Response code was:" + responseCode);
} }
protected void throwAuthenticationError(int responseCode) throws FetcherException { protected void throwAuthenticationError(final int responseCode) throws FetcherException {
throw new FetcherException(responseCode, "Authentication required for that resource. HTTP Response code was:" + responseCode); throw new FetcherException(responseCode, "Authentication required for that resource. HTTP Response code was:" + responseCode);
} }
/** /**
* <p>Combine the entries in two feeds into a single feed.</p> * <p>
* Combine the entries in two feeds into a single feed.
* </p>
* *
* <p>The returned feed will have the same data as the newFeed parameter, with * <p>
* the entries from originalFeed appended to the end of its entries.</p> * The returned feed will have the same data as the newFeed parameter, with the entries from originalFeed appended to the end of its entries.
* </p>
* *
* @param originalFeed * @param originalFeed
* @param newFeed * @param newFeed
* @return * @return
*/ */
public static SyndFeed combineFeeds(SyndFeed originalFeed, SyndFeed newFeed) { public static SyndFeed combineFeeds(final SyndFeed originalFeed, final SyndFeed newFeed) {
SyndFeed result; SyndFeed result;
try { try {
result = (SyndFeed) newFeed.clone(); result = (SyndFeed) newFeed.clone();
@ -201,8 +209,8 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
result.getEntries().addAll(result.getEntries().size(), originalFeed.getEntries()); result.getEntries().addAll(result.getEntries().size(), originalFeed.getEntries());
return result; return result;
} catch (CloneNotSupportedException e) { } catch (final CloneNotSupportedException e) {
IllegalArgumentException iae = new IllegalArgumentException("Cannot clone feed"); final IllegalArgumentException iae = new IllegalArgumentException("Cannot clone feed");
iae.initCause(e); iae.initCause(e);
throw iae; throw iae;
} }
@ -212,7 +220,8 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
return preserveWireFeed; return preserveWireFeed;
} }
public void setPreserveWireFeed(boolean preserveWireFeed) { @Override
public void setPreserveWireFeed(final boolean preserveWireFeed) {
this.preserveWireFeed = preserveWireFeed; this.preserveWireFeed = preserveWireFeed;
} }

View file

@ -9,18 +9,19 @@ import org.rometools.fetcher.FetcherListener;
public class AbstractFeedFetcherBeanInfo extends SimpleBeanInfo { public class AbstractFeedFetcherBeanInfo extends SimpleBeanInfo {
@Override
public EventSetDescriptor[] getEventSetDescriptors() { public EventSetDescriptor[] getEventSetDescriptors() {
try { try {
Class clz = AbstractFeedFetcher.class; // get the class object which we'll describe final Class clz = AbstractFeedFetcher.class; // get the class object which we'll describe
Method addMethod = clz.getMethod("addFetcherEventListener", new Class[] { FetcherListener.class }); final Method addMethod = clz.getMethod("addFetcherEventListener", new Class[] { FetcherListener.class });
Method removeMethod = clz.getMethod("removeFetcherEventListener", new Class[] { FetcherListener.class }); final Method removeMethod = clz.getMethod("removeFetcherEventListener", new Class[] { FetcherListener.class });
Method listenerMethod = FetcherListener.class.getMethod("fetcherEvent", new Class[] { FetcherEvent.class }); final Method listenerMethod = FetcherListener.class.getMethod("fetcherEvent", new Class[] { FetcherEvent.class });
EventSetDescriptor est = new EventSetDescriptor("fetcherEvent", clz, new Method[] { listenerMethod }, addMethod, removeMethod); final EventSetDescriptor est = new EventSetDescriptor("fetcherEvent", clz, new Method[] { listenerMethod }, addMethod, removeMethod);
EventSetDescriptor[] results = new EventSetDescriptor[] { est }; final EventSetDescriptor[] results = new EventSetDescriptor[] { est };
return results; return results;
} catch (Exception e) { } catch (final Exception e) {
// IntrospectionException, SecurityException and/or NoSuchMethodException can be thrown here // IntrospectionException, SecurityException and/or NoSuchMethodException can be thrown here
// the best we can do is to convert them to runtime exceptions // the best we can do is to convert them to runtime exceptions
throw new RuntimeException(e); throw new RuntimeException(e);

View file

@ -23,8 +23,6 @@ import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; import java.io.ObjectOutputStream;
import java.net.URL; import java.net.URL;
import javax.swing.text.Utilities;
/** /**
* Disk based cache. * Disk based cache.
@ -32,53 +30,55 @@ import javax.swing.text.Utilities;
public class DiskFeedInfoCache implements FeedFetcherCache { public class DiskFeedInfoCache implements FeedFetcherCache {
protected String cachePath = null; protected String cachePath = null;
public DiskFeedInfoCache(String cachePath) {
public DiskFeedInfoCache(final String cachePath) {
this.cachePath = cachePath; this.cachePath = cachePath;
} }
public SyndFeedInfo getFeedInfo(URL url) {
@Override
public SyndFeedInfo getFeedInfo(final URL url) {
SyndFeedInfo info = null; SyndFeedInfo info = null;
String fileName = cachePath + File.separator + "feed_" final String fileName = cachePath + File.separator + "feed_" + replaceNonAlphanumeric(url.toString(), '_').trim();
+ replaceNonAlphanumeric(url.toString(),'_').trim();
FileInputStream fis; FileInputStream fis;
try { try {
fis = new FileInputStream(fileName); fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis); final ObjectInputStream ois = new ObjectInputStream(fis);
info = (SyndFeedInfo) ois.readObject(); info = (SyndFeedInfo) ois.readObject();
fis.close(); fis.close();
} catch (FileNotFoundException fnfe) { } catch (final FileNotFoundException fnfe) {
// That's OK, we'l return null // That's OK, we'l return null
} catch (ClassNotFoundException cnfe) { } catch (final ClassNotFoundException cnfe) {
// Error writing to cache is fatal // Error writing to cache is fatal
throw new RuntimeException("Attempting to read from cache", cnfe); throw new RuntimeException("Attempting to read from cache", cnfe);
} catch (IOException fnfe) { } catch (final IOException fnfe) {
// Error writing to cache is fatal // Error writing to cache is fatal
throw new RuntimeException("Attempting to read from cache", fnfe); throw new RuntimeException("Attempting to read from cache", fnfe);
} }
return info; return info;
} }
public void setFeedInfo(URL url, SyndFeedInfo feedInfo) { @Override
String fileName = cachePath + File.separator + "feed_" public void setFeedInfo(final URL url, final SyndFeedInfo feedInfo) {
+ replaceNonAlphanumeric(url.toString(),'_').trim(); final String fileName = cachePath + File.separator + "feed_" + replaceNonAlphanumeric(url.toString(), '_').trim();
FileOutputStream fos; FileOutputStream fos;
try { try {
fos = new FileOutputStream(fileName); fos = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fos); final ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(feedInfo); oos.writeObject(feedInfo);
fos.flush(); fos.flush();
fos.close(); fos.close();
} catch (Exception e) { } catch (final Exception e) {
// Error writing to cache is fatal // Error writing to cache is fatal
throw new RuntimeException("Attempting to write to cache", e); throw new RuntimeException("Attempting to write to cache", e);
} }
} }
public static String replaceNonAlphanumeric(String str, char subst) { public static String replaceNonAlphanumeric(final String str, final char subst) {
StringBuffer ret = new StringBuffer(str.length()); final StringBuffer ret = new StringBuffer(str.length());
char[] testChars = str.toCharArray(); final char[] testChars = str.toCharArray();
for (int i = 0; i < testChars.length; i++) { for (final char testChar : testChars) {
if (Character.isLetterOrDigit(testChars[i])) { if (Character.isLetterOrDigit(testChar)) {
ret.append(testChars[i]); ret.append(testChar);
} else { } else {
ret.append(subst); ret.append(subst);
} }
@ -89,15 +89,16 @@ public class DiskFeedInfoCache implements FeedFetcherCache {
/** /**
* Clear the cache. * Clear the cache.
*/ */
@Override
public synchronized void clear() { public synchronized void clear() {
final File file = new File(this.cachePath); final File file = new File(cachePath);
// only do the delete if the directory exists // only do the delete if the directory exists
if (file.exists() && file.canWrite()) { if (file.exists() && file.canWrite()) {
// make the directory empty // make the directory empty
final String[] files = file.list(); final String[] files = file.list();
final int len = files.length; final int len = files.length;
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
File deleteMe = new File(this.cachePath + File.separator + files[i]); final File deleteMe = new File(cachePath + File.separator + files[i]);
deleteMe.delete(); deleteMe.delete();
} }
@ -105,27 +106,27 @@ public class DiskFeedInfoCache implements FeedFetcherCache {
} }
} }
public SyndFeedInfo remove( URL url ) { @Override
public SyndFeedInfo remove(final URL url) {
SyndFeedInfo info = null; SyndFeedInfo info = null;
String fileName = cachePath + File.separator + "feed_" final String fileName = cachePath + File.separator + "feed_" + replaceNonAlphanumeric(url.toString(), '_').trim();
+ replaceNonAlphanumeric(url.toString(),'_').trim();
FileInputStream fis; FileInputStream fis;
try { try {
fis = new FileInputStream(fileName); fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis); final ObjectInputStream ois = new ObjectInputStream(fis);
info = (SyndFeedInfo) ois.readObject(); info = (SyndFeedInfo) ois.readObject();
fis.close(); fis.close();
File file = new File( fileName ); final File file = new File(fileName);
if (file.exists()) { if (file.exists()) {
file.delete(); file.delete();
} }
} catch (FileNotFoundException fnfe) { } catch (final FileNotFoundException fnfe) {
// That's OK, we'l return null // That's OK, we'l return null
} catch (ClassNotFoundException cnfe) { } catch (final ClassNotFoundException cnfe) {
// Error writing to cahce is fatal // Error writing to cahce is fatal
throw new RuntimeException("Attempting to read from cache", cnfe); throw new RuntimeException("Attempting to read from cache", cnfe);
} catch (IOException fnfe) { } catch (final IOException fnfe) {
// Error writing to cahce is fatal // Error writing to cahce is fatal
throw new RuntimeException("Attempting to read from cache", fnfe); throw new RuntimeException("Attempting to read from cache", fnfe);
} }

View file

@ -19,9 +19,10 @@ package org.rometools.fetcher.impl;
import java.net.URL; import java.net.URL;
/** /**
* <p>An interface to allow caching of feed details. Implementing this allows the * <p>
* {@link org.rometools.fetcher.io.HttpURLFeedFetcher} class to * An interface to allow caching of feed details. Implementing this allows the {@link org.rometools.fetcher.io.HttpURLFeedFetcher} class to enable conditional
* enable conditional gets</p> * gets
* </p>
* *
* @author Nick Lothian * @author Nick Lothian
* *
@ -50,6 +51,7 @@ public interface FeedFetcherCache {
/** /**
* Removes the SyndFeedInfo identified by the url from the cache. * Removes the SyndFeedInfo identified by the url from the cache.
*
* @return The removed SyndFeedInfo * @return The removed SyndFeedInfo
*/ */
public SyndFeedInfo remove(URL feedUrl); public SyndFeedInfo remove(URL feedUrl);

View file

@ -22,13 +22,15 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* <p>A very simple implementation of the {@link org.rometools.fetcher.impl.FeedFetcherCache} interface.</p> * <p>
* A very simple implementation of the {@link org.rometools.fetcher.impl.FeedFetcherCache} interface.
* </p>
* *
* <p>This implementation uses a HashMap to cache retrieved feeds. This implementation is * <p>
* most suitible for sort term (client aggregator?) use, as the memory usage will increase * This implementation uses a HashMap to cache retrieved feeds. This implementation is most suitible for sort term (client aggregator?) use, as the memory usage
* over time as the number of feeds in the cache increases.</p> * will increase over time as the number of feeds in the cache increases.
* </p>
* *
* @author Nick Lothian * @author Nick Lothian
* *
@ -41,10 +43,13 @@ public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
private Map infoCache; private Map infoCache;
/** /**
* <p>Constructor for HashMapFeedInfoCache</p> * <p>
* Constructor for HashMapFeedInfoCache
* </p>
* *
* <p>Only use this if you want multiple instances of the cache. * <p>
* Usually getInstance() is more appropriate.</p> * Only use this if you want multiple instances of the cache. Usually getInstance() is more appropriate.
* </p>
* *
*/ */
public HashMapFeedInfoCache() { public HashMapFeedInfoCache() {
@ -53,6 +58,7 @@ public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
/** /**
* Get the global instance of the cache * Get the global instance of the cache
*
* @return an implementation of FeedFetcherCache * @return an implementation of FeedFetcherCache
*/ */
public static synchronized FeedFetcherCache getInstance() { public static synchronized FeedFetcherCache getInstance() {
@ -63,29 +69,30 @@ public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
} }
protected Map createInfoCache() { protected Map createInfoCache() {
return (Collections.synchronizedMap(new HashMap())); return Collections.synchronizedMap(new HashMap());
} }
protected Object get(final Object key) {
protected Object get(Object key) {
return getInfoCache().get(key); return getInfoCache().get(key);
} }
/** /**
* @see extensions.io.FeedFetcherCache#getFeedInfo(java.net.URL) * @see extensions.io.FeedFetcherCache#getFeedInfo(java.net.URL)
*/ */
public SyndFeedInfo getFeedInfo(URL feedUrl) { @Override
public SyndFeedInfo getFeedInfo(final URL feedUrl) {
return (SyndFeedInfo) get(feedUrl.toString()); return (SyndFeedInfo) get(feedUrl.toString());
} }
protected void put(Object key, Object value) { protected void put(final Object key, final Object value) {
getInfoCache().put(key, value); getInfoCache().put(key, value);
} }
/** /**
* @see extensions.io.FeedFetcherCache#setFeedInfo(java.net.URL, extensions.io.SyndFeedInfo) * @see extensions.io.FeedFetcherCache#setFeedInfo(java.net.URL, extensions.io.SyndFeedInfo)
*/ */
public void setFeedInfo(URL feedUrl, SyndFeedInfo syndFeedInfo) { @Override
public void setFeedInfo(final URL feedUrl, final SyndFeedInfo syndFeedInfo) {
put(feedUrl.toString(), syndFeedInfo); put(feedUrl.toString(), syndFeedInfo);
} }
@ -94,19 +101,18 @@ public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
} }
/** /**
* The API of this class indicates that map must thread safe. In other * The API of this class indicates that map must thread safe. In other words, be sure to wrap it in a synchronized map unless you know what you are doing.
* words, be sure to wrap it in a synchronized map unless you know
* what you are doing.
* *
* @param map the map to use as the info cache. * @param map the map to use as the info cache.
*/ */
protected synchronized final void setInfoCache(Map map) { protected synchronized final void setInfoCache(final Map map) {
infoCache = map; infoCache = map;
} }
/** /**
* @see com.sun.syndication.fetcher.impl.FeedFetcherCache#clear() * @see com.sun.syndication.fetcher.impl.FeedFetcherCache#clear()
*/ */
@Override
public void clear() { public void clear() {
synchronized (infoCache) { synchronized (infoCache) {
infoCache.clear(); infoCache.clear();
@ -116,8 +122,11 @@ public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
/** /**
* @see com.sun.syndication.fetcher.impl.FeedFetcherCache#remove(java.net.URL) * @see com.sun.syndication.fetcher.impl.FeedFetcherCache#remove(java.net.URL)
*/ */
@Override
public SyndFeedInfo remove(final URL url) { public SyndFeedInfo remove(final URL url) {
if( url == null ) return null; if (url == null) {
return null;
}
return (SyndFeedInfo) infoCache.remove(url.toString()); return (SyndFeedInfo) infoCache.remove(url.toString());
} }

View file

@ -16,10 +16,12 @@
*/ */
package org.rometools.fetcher.impl; package org.rometools.fetcher.impl;
import com.sun.syndication.feed.synd.SyndFeed; import java.io.IOException;
import com.sun.syndication.io.FeedException; import java.io.InputStream;
import com.sun.syndication.io.SyndFeedInput; import java.net.HttpURLConnection;
import com.sun.syndication.io.XmlReader; import java.net.MalformedURLException;
import java.net.URL;
import java.util.zip.GZIPInputStream;
import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.Header;
@ -28,19 +30,13 @@ import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpClientParams; import org.apache.commons.httpclient.params.HttpClientParams;
import org.rometools.fetcher.FetcherEvent; import org.rometools.fetcher.FetcherEvent;
import org.rometools.fetcher.FetcherException; import org.rometools.fetcher.FetcherException;
import java.io.IOException; import com.sun.syndication.feed.synd.SyndFeed;
import java.io.InputStream; import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedInput;
import java.net.HttpURLConnection; import com.sun.syndication.io.XmlReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.zip.GZIPInputStream;
/** /**
* @author Nick Lothian * @author Nick Lothian
@ -59,39 +55,38 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
/** /**
* @param cache * @param cache
*/ */
public HttpClientFeedFetcher(FeedFetcherCache cache) { public HttpClientFeedFetcher(final FeedFetcherCache cache) {
this(); this();
setFeedInfoCache(cache); setFeedInfoCache(cache);
} }
public HttpClientFeedFetcher(FeedFetcherCache cache, CredentialSupplier credentialSupplier) { public HttpClientFeedFetcher(final FeedFetcherCache cache, final CredentialSupplier credentialSupplier) {
this(cache); this(cache);
setCredentialSupplier(credentialSupplier); setCredentialSupplier(credentialSupplier);
} }
/** /**
* @param timeout Sets the connect timeout for the HttpClient but using the URLConnection method name. * @param timeout Sets the connect timeout for the HttpClient but using the URLConnection method name. Uses the HttpClientParams method
* Uses the HttpClientParams method setConnectionManagerTimeout instead of setConnectTimeout * setConnectionManagerTimeout instead of setConnectTimeout
* *
*/ */
public synchronized void setConnectTimeout(int timeout) { public synchronized void setConnectTimeout(final int timeout) {
httpClientParams.setConnectionManagerTimeout(timeout); httpClientParams.setConnectionManagerTimeout(timeout);
} }
/** /**
* @return The currently used connect timeout for the HttpClient but using the URLConnection method name. * @return The currently used connect timeout for the HttpClient but using the URLConnection method name. Uses the HttpClientParams method
* Uses the HttpClientParams method getConnectionManagerTimeout instead of getConnectTimeout * getConnectionManagerTimeout instead of getConnectTimeout
* *
*/ */
public int getConnectTimeout() { public int getConnectTimeout() {
return (int) this.getHttpClientParams() return (int) getHttpClientParams().getConnectionManagerTimeout();
.getConnectionManagerTimeout();
} }
/** /**
* @param credentialSupplier The credentialSupplier to set. * @param credentialSupplier The credentialSupplier to set.
*/ */
public synchronized void setCredentialSupplier(CredentialSupplier credentialSupplier) { public synchronized void setCredentialSupplier(final CredentialSupplier credentialSupplier) {
this.credentialSupplier = credentialSupplier; this.credentialSupplier = credentialSupplier;
} }
@ -105,7 +100,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
/** /**
* @param feedInfoCache the feedInfoCache to set * @param feedInfoCache the feedInfoCache to set
*/ */
public synchronized void setFeedInfoCache(FeedFetcherCache feedInfoCache) { public synchronized void setFeedInfoCache(final FeedFetcherCache feedInfoCache) {
this.feedInfoCache = feedInfoCache; this.feedInfoCache = feedInfoCache;
} }
@ -116,7 +111,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
return feedInfoCache; return feedInfoCache;
} }
public synchronized void setHttpClientMethodCallback(HttpClientMethodCallbackIntf httpClientMethodCallback) { public synchronized void setHttpClientMethodCallback(final HttpClientMethodCallbackIntf httpClientMethodCallback) {
this.httpClientMethodCallback = httpClientMethodCallback; this.httpClientMethodCallback = httpClientMethodCallback;
} }
@ -127,7 +122,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
/** /**
* @param httpClientParams The httpClientParams to set. * @param httpClientParams The httpClientParams to set.
*/ */
public synchronized void setHttpClientParams(HttpClientParams httpClientParams) { public synchronized void setHttpClientParams(final HttpClientParams httpClientParams) {
this.httpClientParams = httpClientParams; this.httpClientParams = httpClientParams;
} }
@ -135,13 +130,13 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
* @return Returns the httpClientParams. * @return Returns the httpClientParams.
*/ */
public synchronized HttpClientParams getHttpClientParams() { public synchronized HttpClientParams getHttpClientParams() {
return this.httpClientParams; return httpClientParams;
} }
/** /**
* @return The currently used read timeout for the URLConnection, 0 is unlimited, i.e. no timeout * @return The currently used read timeout for the URLConnection, 0 is unlimited, i.e. no timeout
*/ */
public synchronized void setReadTimeout(int timeout) { public synchronized void setReadTimeout(final int timeout) {
httpClientParams.setSoTimeout(timeout); httpClientParams.setSoTimeout(timeout);
} }
@ -149,46 +144,43 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
* @return timeout the read timeout for the URLConnection to a specified timeout, in milliseconds. * @return timeout the read timeout for the URLConnection to a specified timeout, in milliseconds.
*/ */
public int getReadTimeout() { public int getReadTimeout() {
return (int) this.getHttpClientParams() return getHttpClientParams().getSoTimeout();
.getSoTimeout();
} }
public SyndFeed retrieveFeed(URL url) throws IllegalArgumentException, IOException, FeedException, FetcherException { @Override
return this.retrieveFeed(this.getUserAgent(), url); public SyndFeed retrieveFeed(final URL url) throws IllegalArgumentException, IOException, FeedException, FetcherException {
return this.retrieveFeed(getUserAgent(), url);
} }
/** /**
* @see org.rometools.fetcher.FeedFetcher#retrieveFeed(java.net.URL) * @see org.rometools.fetcher.FeedFetcher#retrieveFeed(java.net.URL)
*/ */
public SyndFeed retrieveFeed(String userAgent, URL feedUrl) @Override
throws IllegalArgumentException, IOException, FeedException, FetcherException { public SyndFeed retrieveFeed(final String userAgent, final URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException {
if (feedUrl == null) { if (feedUrl == null) {
throw new IllegalArgumentException("null is not a valid URL"); throw new IllegalArgumentException("null is not a valid URL");
} }
// TODO Fix this // TODO Fix this
// System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog"); // System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
HttpClient client = new HttpClient(httpClientParams); final HttpClient client = new HttpClient(httpClientParams);
if (getCredentialSupplier() != null) { if (getCredentialSupplier() != null) {
client.getState() client.getState().setAuthenticationPreemptive(true);
.setAuthenticationPreemptive(true);
// TODO what should realm be here? // TODO what should realm be here?
Credentials credentials = getCredentialSupplier() final Credentials credentials = getCredentialSupplier().getCredentials(null, feedUrl.getHost());
.getCredentials(null, feedUrl.getHost());
if (credentials != null) { if (credentials != null) {
client.getState() client.getState().setCredentials(null, feedUrl.getHost(), credentials);
.setCredentials(null, feedUrl.getHost(), credentials);
} }
} }
System.setProperty("httpclient.useragent", userAgent); System.setProperty("httpclient.useragent", userAgent);
String urlStr = feedUrl.toString(); final String urlStr = feedUrl.toString();
HttpMethod method = new GetMethod(urlStr); final HttpMethod method = new GetMethod(urlStr);
method.addRequestHeader("Accept-Encoding", "gzip"); method.addRequestHeader("Accept-Encoding", "gzip");
method.addRequestHeader("User-Agent", userAgent); method.addRequestHeader("User-Agent", userAgent);
method.setFollowRedirects(true); method.setFollowRedirects(true);
@ -199,7 +191,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
} }
} }
FeedFetcherCache cache = getFeedInfoCache(); final FeedFetcherCache cache = getFeedInfoCache();
if (cache != null) { if (cache != null) {
// retrieve feed // retrieve feed
@ -220,7 +212,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
} }
} }
int statusCode = client.executeMethod(method); final int statusCode = client.executeMethod(method);
fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, urlStr); fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, urlStr);
handleErrorCodes(statusCode); handleErrorCodes(statusCode);
@ -242,7 +234,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
} else { } else {
// cache is not in use // cache is not in use
try { try {
int statusCode = client.executeMethod(method); final int statusCode = client.executeMethod(method);
fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, urlStr); fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, urlStr);
handleErrorCodes(statusCode); handleErrorCodes(statusCode);
@ -254,15 +246,15 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
} }
} }
private SyndFeed getFeed(SyndFeedInfo syndFeedInfo, String urlStr, HttpMethod method, int statusCode) private SyndFeed getFeed(final SyndFeedInfo syndFeedInfo, final String urlStr, final HttpMethod method, final int statusCode) throws IOException,
throws IOException, HttpException, FetcherException, FeedException { HttpException, FetcherException, FeedException {
if ((statusCode == HttpURLConnection.HTTP_NOT_MODIFIED) && (syndFeedInfo != null)) { if (statusCode == HttpURLConnection.HTTP_NOT_MODIFIED && syndFeedInfo != null) {
fireEvent(FetcherEvent.EVENT_TYPE_FEED_UNCHANGED, urlStr); fireEvent(FetcherEvent.EVENT_TYPE_FEED_UNCHANGED, urlStr);
return syndFeedInfo.getSyndFeed(); return syndFeedInfo.getSyndFeed();
} }
SyndFeed feed = retrieveFeed(urlStr, method); final SyndFeed feed = retrieveFeed(urlStr, method);
fireEvent(FetcherEvent.EVENT_TYPE_FEED_RETRIEVED, urlStr, feed); fireEvent(FetcherEvent.EVENT_TYPE_FEED_RETRIEVED, urlStr, feed);
return feed; return feed;
@ -276,7 +268,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
* @return * @return
* @throws MalformedURLException * @throws MalformedURLException
*/ */
private SyndFeedInfo buildSyndFeedInfo(URL feedUrl, String urlStr, HttpMethod method, SyndFeed feed, int statusCode) private SyndFeedInfo buildSyndFeedInfo(final URL feedUrl, final String urlStr, final HttpMethod method, SyndFeed feed, final int statusCode)
throws MalformedURLException { throws MalformedURLException {
SyndFeedInfo syndFeedInfo; SyndFeedInfo syndFeedInfo;
syndFeedInfo = new SyndFeedInfo(); syndFeedInfo = new SyndFeedInfo();
@ -285,19 +277,18 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
syndFeedInfo.setUrl(new URL(urlStr)); syndFeedInfo.setUrl(new URL(urlStr));
syndFeedInfo.setId(feedUrl.toString()); syndFeedInfo.setId(feedUrl.toString());
Header imHeader = method.getResponseHeader("IM"); final Header imHeader = method.getResponseHeader("IM");
if ((imHeader != null) && (imHeader.getValue() if (imHeader != null && imHeader.getValue().indexOf("feed") >= 0 && isUsingDeltaEncoding()) {
.indexOf("feed") >= 0) && isUsingDeltaEncoding()) { final FeedFetcherCache cache = getFeedInfoCache();
FeedFetcherCache cache = getFeedInfoCache();
if ((cache != null) && (statusCode == 226)) { if (cache != null && statusCode == 226) {
// client is setup to use http delta encoding and the server supports it and has returned a delta encoded response // client is setup to use http delta encoding and the server supports it and has returned a delta encoded response
// This response only includes new items // This response only includes new items
SyndFeedInfo cachedInfo = cache.getFeedInfo(feedUrl); final SyndFeedInfo cachedInfo = cache.getFeedInfo(feedUrl);
if (cachedInfo != null) { if (cachedInfo != null) {
SyndFeed cachedFeed = cachedInfo.getSyndFeed(); final SyndFeed cachedFeed = cachedInfo.getSyndFeed();
// set the new feed to be the orginal feed plus the new items // set the new feed to be the orginal feed plus the new items
feed = combineFeeds(cachedFeed, feed); feed = combineFeeds(cachedFeed, feed);
@ -305,13 +296,13 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
} }
} }
Header lastModifiedHeader = method.getResponseHeader("Last-Modified"); final Header lastModifiedHeader = method.getResponseHeader("Last-Modified");
if (lastModifiedHeader != null) { if (lastModifiedHeader != null) {
syndFeedInfo.setLastModified(lastModifiedHeader.getValue()); syndFeedInfo.setLastModified(lastModifiedHeader.getValue());
} }
Header eTagHeader = method.getResponseHeader("ETag"); final Header eTagHeader = method.getResponseHeader("ETag");
if (eTagHeader != null) { if (eTagHeader != null) {
syndFeedInfo.setETag(eTagHeader.getValue()); syndFeedInfo.setETag(eTagHeader.getValue());
@ -332,12 +323,10 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
* @throws FetcherException * @throws FetcherException
* @throws FeedException * @throws FeedException
*/ */
private SyndFeed retrieveFeed(String urlStr, HttpMethod method) private SyndFeed retrieveFeed(final String urlStr, final HttpMethod method) throws IOException, HttpException, FetcherException, FeedException {
throws IOException, HttpException, FetcherException, FeedException {
InputStream stream = null; InputStream stream = null;
if ((method.getResponseHeader("Content-Encoding") != null) && if (method.getResponseHeader("Content-Encoding") != null && "gzip".equalsIgnoreCase(method.getResponseHeader("Content-Encoding").getValue())) {
("gzip".equalsIgnoreCase(method.getResponseHeader("Content-Encoding").getValue()))) {
stream = new GZIPInputStream(method.getResponseBodyAsStream()); stream = new GZIPInputStream(method.getResponseBodyAsStream());
} else { } else {
stream = method.getResponseBodyAsStream(); stream = method.getResponseBodyAsStream();
@ -352,7 +341,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
reader = new XmlReader(stream, true); reader = new XmlReader(stream, true);
} }
SyndFeedInput syndFeedInput = new SyndFeedInput(); final SyndFeedInput syndFeedInput = new SyndFeedInput();
syndFeedInput.setPreserveWireFeed(isPreserveWireFeed()); syndFeedInput.setPreserveWireFeed(isPreserveWireFeed());
return syndFeedInput.build(reader); return syndFeedInput.build(reader);
@ -369,9 +358,8 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
public interface HttpClientMethodCallbackIntf { public interface HttpClientMethodCallbackIntf {
/** /**
* Allows access to the underlying HttpClient HttpMethod object. * Allows access to the underlying HttpClient HttpMethod object. Note that in most cases, method.setRequestHeader(String, String) is what you want to do
* Note that in most cases, method.setRequestHeader(String, String) * (rather than method.addRequestHeader(String, String))
* is what you want to do (rather than method.addRequestHeader(String, String))
* *
* @param method * @param method
*/ */

View file

@ -24,23 +24,30 @@ import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import com.sun.syndication.feed.synd.SyndFeed;
import org.rometools.fetcher.FetcherEvent; import org.rometools.fetcher.FetcherEvent;
import org.rometools.fetcher.FetcherException; import org.rometools.fetcher.FetcherException;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.FeedException; import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedInput; import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader; import com.sun.syndication.io.XmlReader;
/** /**
* <p>Class to retrieve syndication files via HTTP.</p> * <p>
* Class to retrieve syndication files via HTTP.
* </p>
* *
* <p>If passed a {@link org.rometools.fetcher.impl.FeedFetcherCache} in the * <p>
* constructor it will use conditional gets to only retrieve modified content.</p> * If passed a {@link org.rometools.fetcher.impl.FeedFetcherCache} in the constructor it will use conditional gets to only retrieve modified content.
* </p>
* *
* <p>The class uses the Accept-Encoding: gzip header to retrieve gzipped feeds where * <p>
* supported by the server.</p> * The class uses the Accept-Encoding: gzip header to retrieve gzipped feeds where supported by the server.
* </p>
*
* <p>
* Simple usage:
* *
* <p>Simple usage:
* <pre> * <pre>
* // create the cache * // create the cache
* FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getFeedInfoCache(); * FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getFeedInfoCache();
@ -52,8 +59,10 @@ import com.sun.syndication.io.XmlReader;
* *
* </p> * </p>
* *
* @see <a href="http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers">http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers</a> * @see <a
* @see <a href="http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level">http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level</a> * href="http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers">http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers</a>
* @see <a
* href="http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level">http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level</a>
* @see <a href="http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html">http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html</a> * @see <a href="http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html">http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html</a>
* @author Nick Lothian * @author Nick Lothian
*/ */
@ -64,7 +73,6 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
private FeedFetcherCache feedInfoCache; private FeedFetcherCache feedInfoCache;
/** /**
* Constructor to use HttpURLFeedFetcher without caching of feeds * Constructor to use HttpURLFeedFetcher without caching of feeds
* *
@ -78,13 +86,14 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
* *
* @param feedCache - an instance of the FeedFetcherCache interface * @param feedCache - an instance of the FeedFetcherCache interface
*/ */
public HttpURLFeedFetcher(FeedFetcherCache feedInfoCache) { public HttpURLFeedFetcher(final FeedFetcherCache feedInfoCache) {
this(); this();
setFeedInfoCache(feedInfoCache); setFeedInfoCache(feedInfoCache);
} }
public SyndFeed retrieveFeed(URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException { @Override
return this.retrieveFeed(this.getUserAgent(), feedUrl); public SyndFeed retrieveFeed(final URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException {
return this.retrieveFeed(getUserAgent(), feedUrl);
} }
/** /**
@ -97,19 +106,20 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
* @throws FeedException if the feed is not valid * @throws FeedException if the feed is not valid
* @throws FetcherException if a HTTP error occurred * @throws FetcherException if a HTTP error occurred
*/ */
public SyndFeed retrieveFeed(String userAgent, URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException { @Override
public SyndFeed retrieveFeed(final String userAgent, final URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException {
if (feedUrl == null) { if (feedUrl == null) {
throw new IllegalArgumentException("null is not a valid URL"); throw new IllegalArgumentException("null is not a valid URL");
} }
URLConnection connection = feedUrl.openConnection(); final URLConnection connection = feedUrl.openConnection();
if (!(connection instanceof HttpURLConnection)) { if (!(connection instanceof HttpURLConnection)) {
throw new IllegalArgumentException(feedUrl.toExternalForm() + " is not a valid HTTP Url"); throw new IllegalArgumentException(feedUrl.toExternalForm() + " is not a valid HTTP Url");
} }
HttpURLConnection httpConnection = (HttpURLConnection)connection; final HttpURLConnection httpConnection = (HttpURLConnection) connection;
// httpConnection.setInstanceFollowRedirects(true); // this is true by default, but can be changed on a claswide basis // httpConnection.setInstanceFollowRedirects(true); // this is true by default, but can be changed on a claswide basis
FeedFetcherCache cache = getFeedInfoCache(); final FeedFetcherCache cache = getFeedInfoCache();
if (cache != null) { if (cache != null) {
SyndFeedInfo syndFeedInfo = cache.getFeedInfo(feedUrl); SyndFeedInfo syndFeedInfo = cache.getFeedInfo(feedUrl);
setRequestHeaders(connection, syndFeedInfo); setRequestHeaders(connection, syndFeedInfo);
@ -123,7 +133,7 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
retrieveAndCacheFeed(feedUrl, syndFeedInfo, httpConnection); retrieveAndCacheFeed(feedUrl, syndFeedInfo, httpConnection);
} else { } else {
// check the response code // check the response code
int responseCode = httpConnection.getResponseCode(); final int responseCode = httpConnection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_NOT_MODIFIED) { if (responseCode != HttpURLConnection.HTTP_NOT_MODIFIED) {
// the response code is not 304 NOT MODIFIED // the response code is not 304 NOT MODIFIED
// This is either because the feed server // This is either because the feed server
@ -151,7 +161,7 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
try { try {
inputStream = httpConnection.getInputStream(); inputStream = httpConnection.getInputStream();
return getSyndFeedFromStream(inputStream, connection); return getSyndFeedFromStream(inputStream, connection);
} catch (java.io.IOException e) { } catch (final java.io.IOException e) {
handleErrorCodes(((HttpURLConnection) connection).getResponseCode()); handleErrorCodes(((HttpURLConnection) connection).getResponseCode());
} finally { } finally {
if (inputStream != null) { if (inputStream != null) {
@ -164,11 +174,12 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
} }
} }
protected void retrieveAndCacheFeed(URL feedUrl, SyndFeedInfo syndFeedInfo, HttpURLConnection connection) throws IllegalArgumentException, FeedException, FetcherException, IOException { protected void retrieveAndCacheFeed(final URL feedUrl, final SyndFeedInfo syndFeedInfo, final HttpURLConnection connection)
throws IllegalArgumentException, FeedException, FetcherException, IOException {
handleErrorCodes(connection.getResponseCode()); handleErrorCodes(connection.getResponseCode());
resetFeedInfo(feedUrl, syndFeedInfo, connection); resetFeedInfo(feedUrl, syndFeedInfo, connection);
FeedFetcherCache cache = getFeedInfoCache(); final FeedFetcherCache cache = getFeedInfoCache();
// resetting feed info in the cache // resetting feed info in the cache
// could be needed for some implementations // could be needed for some implementations
// of FeedFetcherCache (eg, distributed HashTables) // of FeedFetcherCache (eg, distributed HashTables)
@ -177,7 +188,8 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
} }
} }
protected void resetFeedInfo(URL orignalUrl, SyndFeedInfo syndFeedInfo, HttpURLConnection connection) throws IllegalArgumentException, IOException, FeedException { protected void resetFeedInfo(final URL orignalUrl, final SyndFeedInfo syndFeedInfo, final HttpURLConnection connection) throws IllegalArgumentException,
IOException, FeedException {
// need to always set the URL because this may have changed due to 3xx redirects // need to always set the URL because this may have changed due to 3xx redirects
syndFeedInfo.setUrl(connection.getURL()); syndFeedInfo.setUrl(connection.getURL());
@ -197,15 +209,15 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
inputStream = connection.getInputStream(); inputStream = connection.getInputStream();
SyndFeed syndFeed = getSyndFeedFromStream(inputStream, connection); SyndFeed syndFeed = getSyndFeedFromStream(inputStream, connection);
String imHeader = connection.getHeaderField("IM"); final String imHeader = connection.getHeaderField("IM");
if (isUsingDeltaEncoding() && (imHeader!= null && imHeader.indexOf("feed") >= 0)) { if (isUsingDeltaEncoding() && imHeader != null && imHeader.indexOf("feed") >= 0) {
FeedFetcherCache cache = getFeedInfoCache(); final FeedFetcherCache cache = getFeedInfoCache();
if (cache != null && connection.getResponseCode() == 226) { if (cache != null && connection.getResponseCode() == 226) {
// client is setup to use http delta encoding and the server supports it and has returned a delta encoded response // client is setup to use http delta encoding and the server supports it and has returned a delta encoded response
// This response only includes new items // This response only includes new items
SyndFeedInfo cachedInfo = cache.getFeedInfo(orignalUrl); final SyndFeedInfo cachedInfo = cache.getFeedInfo(orignalUrl);
if (cachedInfo != null) { if (cachedInfo != null) {
SyndFeed cachedFeed = cachedInfo.getSyndFeed(); final SyndFeed cachedFeed = cachedInfo.getSyndFeed();
// set the new feed to be the orginal feed plus the new items // set the new feed to be the orginal feed plus the new items
syndFeed = combineFeeds(cachedFeed, syndFeed); syndFeed = combineFeeds(cachedFeed, syndFeed);
@ -222,17 +234,19 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
} }
/** /**
* <p>Set appropriate HTTP headers, including conditional get and gzip encoding headers</p> * <p>
* Set appropriate HTTP headers, including conditional get and gzip encoding headers
* </p>
* *
* @param connection A URLConnection * @param connection A URLConnection
* @param syndFeedInfo The SyndFeedInfo for the feed to be retrieved. May be null * @param syndFeedInfo The SyndFeedInfo for the feed to be retrieved. May be null
*/ */
protected void setRequestHeaders(URLConnection connection, SyndFeedInfo syndFeedInfo) { protected void setRequestHeaders(final URLConnection connection, final SyndFeedInfo syndFeedInfo) {
if (syndFeedInfo != null) { if (syndFeedInfo != null) {
// set the headers to get feed only if modified // set the headers to get feed only if modified
// we support the use of both last modified and eTag headers // we support the use of both last modified and eTag headers
if (syndFeedInfo.getLastModified() != null) { if (syndFeedInfo.getLastModified() != null) {
Object lastModified = syndFeedInfo.getLastModified(); final Object lastModified = syndFeedInfo.getLastModified();
if (lastModified instanceof Long) { if (lastModified instanceof Long) {
connection.setIfModifiedSince(((Long) syndFeedInfo.getLastModified()).longValue()); connection.setIfModifiedSince(((Long) syndFeedInfo.getLastModified()).longValue());
} }
@ -250,7 +264,8 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
} }
} }
private SyndFeed readSyndFeedFromStream(InputStream inputStream, URLConnection connection) throws IOException, IllegalArgumentException, FeedException { private SyndFeed readSyndFeedFromStream(final InputStream inputStream, final URLConnection connection) throws IOException, IllegalArgumentException,
FeedException {
BufferedInputStream is; BufferedInputStream is;
if ("gzip".equalsIgnoreCase(connection.getContentEncoding())) { if ("gzip".equalsIgnoreCase(connection.getContentEncoding())) {
// handle gzip encoded content // handle gzip encoded content
@ -270,15 +285,16 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
reader = new XmlReader(is, true); reader = new XmlReader(is, true);
} }
SyndFeedInput syndFeedInput = new SyndFeedInput(); final SyndFeedInput syndFeedInput = new SyndFeedInput();
syndFeedInput.setPreserveWireFeed(isPreserveWireFeed()); syndFeedInput.setPreserveWireFeed(isPreserveWireFeed());
return syndFeedInput.build(reader); return syndFeedInput.build(reader);
} }
private SyndFeed getSyndFeedFromStream(InputStream inputStream, URLConnection connection) throws IOException, IllegalArgumentException, FeedException { private SyndFeed getSyndFeedFromStream(final InputStream inputStream, final URLConnection connection) throws IOException, IllegalArgumentException,
SyndFeed feed = readSyndFeedFromStream(inputStream, connection); FeedException {
final SyndFeed feed = readSyndFeedFromStream(inputStream, connection);
fireEvent(FetcherEvent.EVENT_TYPE_FEED_RETRIEVED, connection, feed); fireEvent(FetcherEvent.EVENT_TYPE_FEED_RETRIEVED, connection, feed);
return feed; return feed;
} }
@ -293,7 +309,7 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
/** /**
* @param cache The cache to be used by this fetcher (pass null to stop using a cache) * @param cache The cache to be used by this fetcher (pass null to stop using a cache)
*/ */
public synchronized void setFeedInfoCache(FeedFetcherCache cache) { public synchronized void setFeedInfoCache(final FeedFetcherCache cache) {
feedInfoCache = cache; feedInfoCache = cache;
} }
} }

View file

@ -5,9 +5,13 @@ import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
/** /**
* <p>An implementation of the {@link org.rometools.fetcher.impl.FeedFetcherCache} interface.</p> * <p>
* An implementation of the {@link org.rometools.fetcher.impl.FeedFetcherCache} interface.
* </p>
* *
* <p>Unlike the HashMapFeedInfoCache this implementation will not grow unbound</p> * <p>
* Unlike the HashMapFeedInfoCache this implementation will not grow unbound
* </p>
* *
* @author Javier Kohen * @author Javier Kohen
* @author Nick Lothian * @author Nick Lothian
@ -21,7 +25,8 @@ public class LinkedHashMapFeedInfoCache extends HashMapFeedInfoCache {
super(16, 0.75F, true); super(16, 0.75F, true);
} }
protected boolean removeEldestEntry(Map.Entry eldest) { @Override
protected boolean removeEldestEntry(final Map.Entry eldest) {
return size() > getMaxEntries(); return size() > getMaxEntries();
} }
} }
@ -34,9 +39,9 @@ public class LinkedHashMapFeedInfoCache extends HashMapFeedInfoCache {
private final static LinkedHashMapFeedInfoCache _instance = new LinkedHashMapFeedInfoCache(); private final static LinkedHashMapFeedInfoCache _instance = new LinkedHashMapFeedInfoCache();
/** /**
* Get the global instance of the cache * Get the global instance of the cache
*
* @return an implementation of FeedFetcherCache * @return an implementation of FeedFetcherCache
*/ */
public static final FeedFetcherCache getInstance() { public static final FeedFetcherCache getInstance() {
@ -44,10 +49,13 @@ public class LinkedHashMapFeedInfoCache extends HashMapFeedInfoCache {
} }
/** /**
* <p>Constructor for HashMapFeedInfoCache</p> * <p>
* Constructor for HashMapFeedInfoCache
* </p>
* *
* <p>Only use this if you want multiple instances of the cache. * <p>
* Usually {@link #getInstance()} is more appropriate.</p> * Only use this if you want multiple instances of the cache. Usually {@link #getInstance()} is more appropriate.
* </p>
* *
* @see #getInstance() * @see #getInstance()
*/ */
@ -55,6 +63,7 @@ public class LinkedHashMapFeedInfoCache extends HashMapFeedInfoCache {
super(); super();
} }
@Override
protected Map createInfoCache() { protected Map createInfoCache() {
return Collections.synchronizedMap(new CacheImpl()); return Collections.synchronizedMap(new CacheImpl());
} }
@ -63,7 +72,7 @@ public class LinkedHashMapFeedInfoCache extends HashMapFeedInfoCache {
return maxEntries; return maxEntries;
} }
public synchronized final void setMaxEntries(int maxEntries) { public synchronized final void setMaxEntries(final int maxEntries) {
this.maxEntries = maxEntries; this.maxEntries = maxEntries;
} }

View file

@ -29,24 +29,25 @@ public class ResponseHandler {
private final static Pattern characterEncodingPattern = Pattern.compile("charset=([.[^; ]]*)"); private final static Pattern characterEncodingPattern = Pattern.compile("charset=([.[^; ]]*)");
public static String getCharacterEncoding(URLConnection connection) { public static String getCharacterEncoding(final URLConnection connection) {
return getCharacterEncoding(connection.getContentType()); return getCharacterEncoding(connection.getContentType());
} }
/** /**
* *
* <p>Gets the character encoding of a response. (Note that this is different to * <p>
* the content-encoding)</p> * Gets the character encoding of a response. (Note that this is different to the content-encoding)
* </p>
* *
* @param contentTypeHeader the value of the content-type HTTP header eg: text/html; charset=ISO-8859-4 * @param contentTypeHeader the value of the content-type HTTP header eg: text/html; charset=ISO-8859-4
* @return the character encoding, eg: ISO-8859-4 * @return the character encoding, eg: ISO-8859-4
*/ */
public static String getCharacterEncoding(String contentTypeHeader) { public static String getCharacterEncoding(final String contentTypeHeader) {
if (contentTypeHeader == null) { if (contentTypeHeader == null) {
return defaultCharacterEncoding; return defaultCharacterEncoding;
} }
Matcher m = characterEncodingPattern.matcher(contentTypeHeader); final Matcher m = characterEncodingPattern.matcher(contentTypeHeader);
// if (!m.matches()) { // if (!m.matches()) {
if (!m.find()) { if (!m.find()) {
return defaultCharacterEncoding; return defaultCharacterEncoding;

View file

@ -23,11 +23,13 @@ import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;
/** /**
* <p>A class to represent a {@link com.sun.syndication.feed.synd.SyndFeed} * <p>
* and some useful information about it.</p> * A class to represent a {@link com.sun.syndication.feed.synd.SyndFeed} and some useful information about it.
* </p>
* *
* <p>This class is thread safe, as expected by the different feed fetcher * <p>
* implementations.</p> * This class is thread safe, as expected by the different feed fetcher implementations.
* </p>
* *
* @author Nick Lothian * @author Nick Lothian
*/ */
@ -48,10 +50,12 @@ public class SyndFeedInfo implements Cloneable, Serializable {
/** /**
* Creates a deep 'bean' clone of the object. * Creates a deep 'bean' clone of the object.
* <p> * <p>
*
* @return a clone of the object. * @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned. * @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* *
*/ */
@Override
public Object clone() throws CloneNotSupportedException { public Object clone() throws CloneNotSupportedException {
return _objBean.clone(); return _objBean.clone();
} }
@ -59,11 +63,13 @@ public class SyndFeedInfo implements Cloneable, Serializable {
/** /**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method. * Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* <p> * <p>
*
* @param other he reference object with which to compare. * @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object. * @return <b>true</b> if 'this' object is equal to the 'other' object.
* *
*/ */
public boolean equals(Object other) { @Override
public boolean equals(final Object other) {
return _objBean.equals(other); return _objBean.equals(other);
} }
@ -72,9 +78,11 @@ public class SyndFeedInfo implements Cloneable, Serializable {
* <p> * <p>
* It follows the contract defined by the Object hashCode() method. * It follows the contract defined by the Object hashCode() method.
* <p> * <p>
*
* @return the hashcode of the bean object. * @return the hashcode of the bean object.
* *
*/ */
@Override
public int hashCode() { public int hashCode() {
return _objBean.hashCode(); return _objBean.hashCode();
} }
@ -82,14 +90,15 @@ public class SyndFeedInfo implements Cloneable, Serializable {
/** /**
* Returns the String representation for the object. * Returns the String representation for the object.
* <p> * <p>
*
* @return String representation for the object. * @return String representation for the object.
* *
*/ */
@Override
public String toString() { public String toString() {
return _objBean.toString(); return _objBean.toString();
} }
/** /**
* @return the ETag the feed was last retrieved with * @return the ETag the feed was last retrieved with
*/ */
@ -111,15 +120,15 @@ public class SyndFeedInfo implements Cloneable, Serializable {
return url; return url;
} }
public synchronized void setETag(String string) { public synchronized void setETag(final String string) {
eTag = string; eTag = string;
} }
public synchronized void setLastModified(Object o) { public synchronized void setLastModified(final Object o) {
lastModified = o; lastModified = o;
} }
public synchronized void setUrl(URL url) { public synchronized void setUrl(final URL url) {
this.url = url; this.url = url;
} }
@ -127,7 +136,7 @@ public class SyndFeedInfo implements Cloneable, Serializable {
return syndFeed; return syndFeed;
} }
public synchronized void setSyndFeed(SyndFeed feed) { public synchronized void setSyndFeed(final SyndFeed feed) {
syndFeed = feed; syndFeed = feed;
} }
@ -139,10 +148,9 @@ public class SyndFeedInfo implements Cloneable, Serializable {
} }
/** /**
* @param string A unique ID to identify the feed. Note that if the URL of the feed * @param string A unique ID to identify the feed. Note that if the URL of the feed changes this will remain the same
* changes this will remain the same
*/ */
public synchronized void setId(String string) { public synchronized void setId(final String string) {
id = string; id = string;
} }

View file

@ -21,19 +21,23 @@ import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import org.rometools.fetcher.FeedFetcher; import org.rometools.fetcher.FeedFetcher;
import org.rometools.fetcher.impl.FeedFetcherCache; import org.rometools.fetcher.impl.FeedFetcherCache;
import org.rometools.fetcher.impl.HashMapFeedInfoCache; import org.rometools.fetcher.impl.HashMapFeedInfoCache;
import org.rometools.fetcher.impl.HttpURLFeedFetcher; import org.rometools.fetcher.impl.HttpURLFeedFetcher;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.SyndFeedOutput; import com.sun.syndication.io.SyndFeedOutput;
/** /**
* <p>It aggregates a list of RSS/Atom feeds (they can be of different types) * <p>
* into a single feed of the specified type.</p> * It aggregates a list of RSS/Atom feeds (they can be of different types) into a single feed of the specified type.
* </p>
* *
* <p>Converted from the original FeedAggregator sample</p> * <p>
* Converted from the original FeedAggregator sample
* </p>
* *
* @author Alejandro Abdelnur * @author Alejandro Abdelnur
* @author Nick Lothian * @author Nick Lothian
@ -41,13 +45,13 @@ import com.sun.syndication.io.SyndFeedOutput;
*/ */
public class FeedAggregator { public class FeedAggregator {
public static void main(String[] args) { public static void main(final String[] args) {
boolean ok = false; boolean ok = false;
if (args.length >= 2) { if (args.length >= 2) {
try { try {
String outputType = args[0]; final String outputType = args[0];
SyndFeed feed = new SyndFeedImpl(); final SyndFeed feed = new SyndFeedImpl();
feed.setFeedType(outputType); feed.setFeedType(outputType);
feed.setTitle("Aggregated Feed"); feed.setTitle("Aggregated Feed");
@ -55,24 +59,23 @@ public class FeedAggregator {
feed.setAuthor("anonymous"); feed.setAuthor("anonymous");
feed.setLink("http://www.anonymous.com"); feed.setLink("http://www.anonymous.com");
List entries = new ArrayList(); final List entries = new ArrayList();
feed.setEntries(entries); feed.setEntries(entries);
FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance(); final FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance();
FeedFetcher feedFetcher = new HttpURLFeedFetcher(feedInfoCache); final FeedFetcher feedFetcher = new HttpURLFeedFetcher(feedInfoCache);
for (int i = 1; i < args.length; i++) { for (int i = 1; i < args.length; i++) {
URL inputUrl = new URL(args[i]); final URL inputUrl = new URL(args[i]);
SyndFeed inFeed = feedFetcher.retrieveFeed(inputUrl); final SyndFeed inFeed = feedFetcher.retrieveFeed(inputUrl);
entries.addAll(inFeed.getEntries()); entries.addAll(inFeed.getEntries());
} }
SyndFeedOutput output = new SyndFeedOutput(); final SyndFeedOutput output = new SyndFeedOutput();
output.output(feed, new PrintWriter(System.out)); output.output(feed, new PrintWriter(System.out));
ok = true; ok = true;
} } catch (final Exception ex) {
catch (Exception ex) {
System.out.println("ERROR: " + ex.getMessage()); System.out.println("ERROR: " + ex.getMessage());
ex.printStackTrace(); ex.printStackTrace();
} }

View file

@ -16,33 +16,36 @@
*/ */
package org.rometools.fetcher.samples; package org.rometools.fetcher.samples;
import java.net.URL; import java.net.URL;
import com.sun.syndication.feed.synd.SyndFeed;
import org.rometools.fetcher.FeedFetcher; import org.rometools.fetcher.FeedFetcher;
import org.rometools.fetcher.FetcherEvent; import org.rometools.fetcher.FetcherEvent;
import org.rometools.fetcher.FetcherListener; import org.rometools.fetcher.FetcherListener;
import org.rometools.fetcher.impl.FeedFetcherCache; import org.rometools.fetcher.impl.FeedFetcherCache;
import org.rometools.fetcher.impl.HashMapFeedInfoCache; import org.rometools.fetcher.impl.HashMapFeedInfoCache;
import org.rometools.fetcher.impl.HttpURLFeedFetcher; import org.rometools.fetcher.impl.HttpURLFeedFetcher;
import com.sun.syndication.feed.synd.SyndFeed;
/** /**
* Reads and prints any RSS/Atom feed type. Converted from the * Reads and prints any RSS/Atom feed type. Converted from the original Rome sample FeedReader
* original Rome sample FeedReader
* <p> * <p>
*
* @author Alejandro Abdelnur * @author Alejandro Abdelnur
* @author Nick Lothian * @author Nick Lothian
* *
*/ */
public class FeedReader { public class FeedReader {
public static void main(String[] args) { public static void main(final String[] args) {
boolean ok = false; boolean ok = false;
if (args.length == 1) { if (args.length == 1) {
try { try {
URL feedUrl = new URL(args[0]); final URL feedUrl = new URL(args[0]);
FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance(); final FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance();
FeedFetcher fetcher = new HttpURLFeedFetcher(feedInfoCache); final FeedFetcher fetcher = new HttpURLFeedFetcher(feedInfoCache);
FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); final FetcherEventListenerImpl listener = new FetcherEventListenerImpl();
fetcher.addFetcherEventListener(listener); fetcher.addFetcherEventListener(listener);
@ -50,7 +53,7 @@ public class FeedReader {
// Retrieve the feed. // Retrieve the feed.
// We will get a Feed Polled Event and then a // We will get a Feed Polled Event and then a
// Feed Retrieved event (assuming the feed is valid) // Feed Retrieved event (assuming the feed is valid)
SyndFeed feed = fetcher.retrieveFeed(feedUrl); final SyndFeed feed = fetcher.retrieveFeed(feedUrl);
System.err.println(feedUrl + " retrieved"); System.err.println(feedUrl + " retrieved");
System.err.println(feedUrl + " has a title: " + feed.getTitle() + " and contains " + feed.getEntries().size() + " entries."); System.err.println(feedUrl + " has a title: " + feed.getTitle() + " and contains " + feed.getEntries().size() + " entries.");
@ -58,12 +61,11 @@ public class FeedReader {
// and the server supports conditional gets, we will get a "Feed // and the server supports conditional gets, we will get a "Feed
// Unchanged" event after the Feed Polled event // Unchanged" event after the Feed Polled event
System.err.println("Polling " + feedUrl + " again to test conditional get support."); System.err.println("Polling " + feedUrl + " again to test conditional get support.");
SyndFeed feed2 = fetcher.retrieveFeed(feedUrl); final SyndFeed feed2 = fetcher.retrieveFeed(feedUrl);
System.err.println("If a \"Feed Unchanged\" event fired then the server supports conditional gets."); System.err.println("If a \"Feed Unchanged\" event fired then the server supports conditional gets.");
ok = true; ok = true;
} } catch (final Exception ex) {
catch (Exception ex) {
System.out.println("ERROR: " + ex.getMessage()); System.out.println("ERROR: " + ex.getMessage());
ex.printStackTrace(); ex.printStackTrace();
} }
@ -82,8 +84,9 @@ public class FeedReader {
/** /**
* @see com.sun.syndication.fetcher.FetcherListener#fetcherEvent(com.sun.syndication.fetcher.FetcherEvent) * @see com.sun.syndication.fetcher.FetcherListener#fetcherEvent(com.sun.syndication.fetcher.FetcherEvent)
*/ */
public void fetcherEvent(FetcherEvent event) { @Override
String eventType = event.getEventType(); public void fetcherEvent(final FetcherEvent event) {
final String eventType = event.getEventType();
if (FetcherEvent.EVENT_TYPE_FEED_POLLED.equals(eventType)) { if (FetcherEvent.EVENT_TYPE_FEED_POLLED.equals(eventType)) {
System.err.println("\tEVENT: Feed Polled. URL = " + event.getUrlString()); System.err.println("\tEVENT: Feed Polled. URL = " + event.getUrlString());
} else if (FetcherEvent.EVENT_TYPE_FEED_RETRIEVED.equals(eventType)) { } else if (FetcherEvent.EVENT_TYPE_FEED_RETRIEVED.equals(eventType)) {

1
src/main/resources/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
# needed to commit empty folder

View file

@ -16,8 +16,6 @@
*/ */
package org.rometools.test; package org.rometools.test;
import org.rometools.fetcher.impl.HashMapFeedInfoCache;
import org.rometools.fetcher.impl.FeedFetcherCache;
import java.net.URL; import java.net.URL;
import junit.framework.TestCase; import junit.framework.TestCase;
@ -31,14 +29,16 @@ import org.mortbay.http.SocketListener;
import org.mortbay.http.UserRealm; import org.mortbay.http.UserRealm;
import org.mortbay.http.handler.SecurityHandler; import org.mortbay.http.handler.SecurityHandler;
import org.mortbay.jetty.servlet.ServletHandler; import org.mortbay.jetty.servlet.ServletHandler;
import com.sun.syndication.feed.atom.Entry;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import org.rometools.fetcher.FeedFetcher; import org.rometools.fetcher.FeedFetcher;
import org.rometools.fetcher.FetcherEvent; import org.rometools.fetcher.FetcherEvent;
import org.rometools.fetcher.FetcherException; import org.rometools.fetcher.FetcherException;
import org.rometools.fetcher.FetcherListener; import org.rometools.fetcher.FetcherListener;
import org.rometools.fetcher.impl.FeedFetcherCache;
import org.rometools.fetcher.impl.HashMapFeedInfoCache;
import com.sun.syndication.feed.atom.Entry;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
/** /**
* @author nl * @author nl
@ -46,12 +46,12 @@ import org.rometools.fetcher.FetcherListener;
public abstract class AbstractJettyTest extends TestCase { public abstract class AbstractJettyTest extends TestCase {
private HttpServer server; private HttpServer server;
private int testPort = 8283; private final int testPort = 8283;
/** /**
* @param s * @param s
*/ */
public AbstractJettyTest(String s) { public AbstractJettyTest(final String s) {
super(s); super(s);
} }
@ -66,12 +66,13 @@ public abstract class AbstractJettyTest extends TestCase {
/** /**
* @see junit.framework.TestCase#setUp() * @see junit.framework.TestCase#setUp()
*/ */
@Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
setupServer(); setupServer();
HttpContext context = createContext(); final HttpContext context = createContext();
ServletHandler servlets = createServletHandler(); final ServletHandler servlets = createServletHandler();
context.addHandler(servlets); context.addHandler(servlets);
server.addContext(context); server.addContext(context);
@ -91,7 +92,7 @@ public abstract class AbstractJettyTest extends TestCase {
server = new HttpServer(); server = new HttpServer();
// Create a port listener // Create a port listener
SocketListener listener=new SocketListener(); final SocketListener listener = new SocketListener();
listener.setPort(testPort); listener.setPort(testPort);
server.addListener(listener); server.addListener(listener);
} }
@ -100,7 +101,7 @@ public abstract class AbstractJettyTest extends TestCase {
* @return * @return
*/ */
private ServletHandler createServletHandler() { private ServletHandler createServletHandler() {
ServletHandler servlets = new ServletHandler(); final ServletHandler servlets = new ServletHandler();
servlets.addServlet("FetcherTestServlet", FetcherTestServlet.SERVLET_MAPPING, "org.rometools.test.FetcherTestServlet"); servlets.addServlet("FetcherTestServlet", FetcherTestServlet.SERVLET_MAPPING, "org.rometools.test.FetcherTestServlet");
servlets.addServlet("FetcherTestServlet", FetcherTestServlet.SERVLET_MAPPING2, "org.rometools.test.FetcherTestServlet"); servlets.addServlet("FetcherTestServlet", FetcherTestServlet.SERVLET_MAPPING2, "org.rometools.test.FetcherTestServlet");
return servlets; return servlets;
@ -110,7 +111,7 @@ public abstract class AbstractJettyTest extends TestCase {
* @return * @return
*/ */
private HttpContext createContext() { private HttpContext createContext() {
HttpContext context = new HttpContext(); final HttpContext context = new HttpContext();
context.setContextPath("/rome/*"); context.setContextPath("/rome/*");
return context; return context;
} }
@ -118,6 +119,7 @@ public abstract class AbstractJettyTest extends TestCase {
/** /**
* @see junit.framework.TestCase#tearDown() * @see junit.framework.TestCase#tearDown()
*/ */
@Override
protected void tearDown() throws Exception { protected void tearDown() throws Exception {
if (server != null) { if (server != null) {
server.stop(); server.stop();
@ -140,8 +142,9 @@ public abstract class AbstractJettyTest extends TestCase {
/** /**
* @see com.sun.syndication.fetcher.FetcherListener#fetcherEvent(com.sun.syndication.fetcher.FetcherEvent) * @see com.sun.syndication.fetcher.FetcherListener#fetcherEvent(com.sun.syndication.fetcher.FetcherEvent)
*/ */
public void fetcherEvent(FetcherEvent event) { @Override
String eventType = event.getEventType(); public void fetcherEvent(final FetcherEvent event) {
final String eventType = event.getEventType();
if (FetcherEvent.EVENT_TYPE_FEED_POLLED.equals(eventType)) { if (FetcherEvent.EVENT_TYPE_FEED_POLLED.equals(eventType)) {
System.err.println("\tEVENT: Feed Polled. URL = " + event.getUrlString()); System.err.println("\tEVENT: Feed Polled. URL = " + event.getUrlString());
polled = true; polled = true;
@ -156,12 +159,12 @@ public abstract class AbstractJettyTest extends TestCase {
} }
public void testRetrieveFeed() { public void testRetrieveFeed() {
FeedFetcher feedFetcher = getFeedFetcher(); final FeedFetcher feedFetcher = getFeedFetcher();
try { try {
SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/"));
assertNotNull(feed); assertNotNull(feed);
assertEquals("atom_1.0.feed.title", feed.getTitle()); assertEquals("atom_1.0.feed.title", feed.getTitle());
} catch (Exception e) { } catch (final Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(e.getMessage()); fail(e.getMessage());
} }
@ -171,43 +174,41 @@ public abstract class AbstractJettyTest extends TestCase {
try { try {
setupServer(); setupServer();
HttpContext context = createContext(); final HttpContext context = createContext();
URL url = this.getClass().getResource("/testuser.properties"); final URL url = this.getClass().getResource("/testuser.properties");
UserRealm ur = new HashUserRealm("test", url.getFile()); final UserRealm ur = new HashUserRealm("test", url.getFile());
context.setRealm(ur); context.setRealm(ur);
BasicAuthenticator ba = new BasicAuthenticator(); final BasicAuthenticator ba = new BasicAuthenticator();
context.setAuthenticator(ba); context.setAuthenticator(ba);
SecurityHandler sh = new SecurityHandler(); final SecurityHandler sh = new SecurityHandler();
context.addHandler(sh); context.addHandler(sh);
SecurityConstraint sc = new SecurityConstraint(); final SecurityConstraint sc = new SecurityConstraint();
sc.setName("test"); sc.setName("test");
sc.addRole("*"); sc.addRole("*");
sc.setAuthenticate(true); sc.setAuthenticate(true);
context.addSecurityConstraint("/", sc); context.addSecurityConstraint("/", sc);
ServletHandler servlets = createServletHandler(); final ServletHandler servlets = createServletHandler();
context.addHandler(servlets); context.addHandler(servlets);
server.addContext(context); server.addContext(context);
server.start(); server.start();
FeedFetcher feedFetcher = getAuthenticatedFeedFetcher(); final FeedFetcher feedFetcher = getAuthenticatedFeedFetcher();
SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/"));
assertNotNull(feed); assertNotNull(feed);
assertEquals("atom_1.0.feed.title", feed.getTitle()); assertEquals("atom_1.0.feed.title", feed.getTitle());
} catch (final Exception e) {
} catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(e.getMessage()); fail(e.getMessage());
} }
} }
public abstract FeedFetcher getAuthenticatedFeedFetcher(); public abstract FeedFetcher getAuthenticatedFeedFetcher();
@ -217,12 +218,12 @@ public abstract class AbstractJettyTest extends TestCase {
* *
*/ */
public void testRetrieveRedirectedFeed() { public void testRetrieveRedirectedFeed() {
FeedFetcher feedFetcher = getFeedFetcher(); final FeedFetcher feedFetcher = getFeedFetcher();
try { try {
SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?redirect=TRUE")); final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet?redirect=TRUE"));
assertNotNull(feed); assertNotNull(feed);
assertEquals("atom_1.0.feed.title", feed.getTitle()); assertEquals("atom_1.0.feed.title", feed.getTitle());
} catch (Exception e) { } catch (final Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(e.getMessage()); fail(e.getMessage());
} }
@ -233,32 +234,32 @@ public abstract class AbstractJettyTest extends TestCase {
* *
*/ */
public void testErrorHandling() { public void testErrorHandling() {
FeedFetcher feedFetcher = getFeedFetcher(); final FeedFetcher feedFetcher = getFeedFetcher();
try { try {
SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?error=404")); final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet?error=404"));
fail("4xx error handling did not work correctly"); fail("4xx error handling did not work correctly");
} catch (FetcherException e) { } catch (final FetcherException e) {
// expect this exception // expect this exception
assertEquals(404, e.getResponseCode()); assertEquals(404, e.getResponseCode());
} catch (Exception e) { } catch (final Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(e.getMessage()); fail(e.getMessage());
} }
try { try {
SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?error=500")); final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet?error=500"));
fail("5xx error handling did not work correctly"); fail("5xx error handling did not work correctly");
} catch (FetcherException e) { } catch (final FetcherException e) {
// expect this exception // expect this exception
assertEquals(500, e.getResponseCode()); assertEquals(500, e.getResponseCode());
} catch (Exception e) { } catch (final Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(e.getMessage()); fail(e.getMessage());
} }
} }
public void testUserAgent() { public void testUserAgent() {
FeedFetcher feedFetcher = getFeedFetcher(); final FeedFetcher feedFetcher = getFeedFetcher();
// System.out.println(feedFetcher.getUserAgent()); // System.out.println(feedFetcher.getUserAgent());
// System.out.println(System.getProperty("rome.fetcher.version", "UNKNOWN")); // System.out.println(System.getProperty("rome.fetcher.version", "UNKNOWN"));
assertEquals("Rome Client (http://tinyurl.com/64t5n) Ver: " + System.getProperty("rome.fetcher.version", "UNKNOWN"), feedFetcher.getUserAgent()); assertEquals("Rome Client (http://tinyurl.com/64t5n) Ver: " + System.getProperty("rome.fetcher.version", "UNKNOWN"), feedFetcher.getUserAgent());
@ -269,8 +270,8 @@ public abstract class AbstractJettyTest extends TestCase {
* *
*/ */
public void testFetchEvents() { public void testFetchEvents() {
FeedFetcher feedFetcher = getFeedFetcher(); final FeedFetcher feedFetcher = getFeedFetcher();
FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); final FetcherEventListenerImpl listener = new FetcherEventListenerImpl();
feedFetcher.addFetcherEventListener(listener); feedFetcher.addFetcherEventListener(listener);
try { try {
SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/"));
@ -288,7 +289,7 @@ public abstract class AbstractJettyTest extends TestCase {
assertTrue(listener.retrieved); assertTrue(listener.retrieved);
assertFalse(listener.unchanged); assertFalse(listener.unchanged);
listener.reset(); listener.reset();
} catch (Exception e) { } catch (final Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(e.getMessage()); fail(e.getMessage());
} }
@ -299,9 +300,9 @@ public abstract class AbstractJettyTest extends TestCase {
* *
*/ */
public void testFetchEventsWithCache() { public void testFetchEventsWithCache() {
FeedFetcherCache feedInfoCache = new HashMapFeedInfoCache(); final FeedFetcherCache feedInfoCache = new HashMapFeedInfoCache();
FeedFetcher feedFetcher = getFeedFetcher(feedInfoCache); final FeedFetcher feedFetcher = getFeedFetcher(feedInfoCache);
FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); final FetcherEventListenerImpl listener = new FetcherEventListenerImpl();
feedFetcher.addFetcherEventListener(listener); feedFetcher.addFetcherEventListener(listener);
try { try {
SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/"));
@ -327,7 +328,7 @@ public abstract class AbstractJettyTest extends TestCase {
assertTrue(listener.retrieved); assertTrue(listener.retrieved);
assertFalse(listener.unchanged); assertFalse(listener.unchanged);
listener.reset(); listener.reset();
} catch (Exception e) { } catch (final Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(e.getMessage()); fail(e.getMessage());
} }
@ -338,19 +339,19 @@ public abstract class AbstractJettyTest extends TestCase {
* *
*/ */
public void testGZippedFeed() { public void testGZippedFeed() {
FeedFetcher feedFetcher = getFeedFetcher(); final FeedFetcher feedFetcher = getFeedFetcher();
try { try {
SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?gzipfeed=TRUE")); final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet?gzipfeed=TRUE"));
assertNotNull(feed); assertNotNull(feed);
assertEquals("atom_1.0.feed.title", feed.getTitle()); assertEquals("atom_1.0.feed.title", feed.getTitle());
} catch (Exception e) { } catch (final Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(e.getMessage()); fail(e.getMessage());
} }
} }
public void testPreserveWireFeed() throws Exception { public void testPreserveWireFeed() throws Exception {
FeedFetcher feedFetcher = getFeedFetcher(); final FeedFetcher feedFetcher = getFeedFetcher();
// first check we the WireFeed is not preserved by default // first check we the WireFeed is not preserved by default
SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/"));
@ -358,7 +359,7 @@ public abstract class AbstractJettyTest extends TestCase {
assertEquals("atom_1.0.feed.title", feed.getTitle()); assertEquals("atom_1.0.feed.title", feed.getTitle());
assertNull(feed.originalWireFeed()); assertNull(feed.originalWireFeed());
SyndEntry syndEntry = (SyndEntry)feed.getEntries().get(0); SyndEntry syndEntry = feed.getEntries().get(0);
assertNotNull(syndEntry); assertNotNull(syndEntry);
assertNull(syndEntry.getWireEntry()); assertNull(syndEntry.getWireEntry());
@ -370,11 +371,11 @@ public abstract class AbstractJettyTest extends TestCase {
assertEquals("atom_1.0.feed.title", feed.getTitle()); assertEquals("atom_1.0.feed.title", feed.getTitle());
assertNotNull(feed.originalWireFeed()); assertNotNull(feed.originalWireFeed());
syndEntry = (SyndEntry)feed.getEntries().get(0); syndEntry = feed.getEntries().get(0);
assertNotNull(syndEntry); assertNotNull(syndEntry);
assertNotNull(syndEntry.getWireEntry()); assertNotNull(syndEntry.getWireEntry());
Entry entry = (Entry) syndEntry.getWireEntry(); final Entry entry = (Entry) syndEntry.getWireEntry();
assertEquals("atom_1.0.feed.entry[0].rights", entry.getRights()); assertEquals("atom_1.0.feed.entry[0].rights", entry.getRights());
} finally { } finally {
@ -384,38 +385,39 @@ public abstract class AbstractJettyTest extends TestCase {
} }
public void testDeltaEncoding() { public void testDeltaEncoding() {
FeedFetcherCache feedInfoCache = new HashMapFeedInfoCache(); final FeedFetcherCache feedInfoCache = new HashMapFeedInfoCache();
FeedFetcher feedFetcher = getFeedFetcher(feedInfoCache); final FeedFetcher feedFetcher = getFeedFetcher(feedInfoCache);
try { try {
feedFetcher.setUsingDeltaEncoding(true); feedFetcher.setUsingDeltaEncoding(true);
// first retrieval should just grab the default feed // first retrieval should just grab the default feed
SyndFeed feed1 = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?deltaencode=TRUE&refreshfeed=TRUE")); final SyndFeed feed1 = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort
+ "/rome/FetcherTestServlet?deltaencode=TRUE&refreshfeed=TRUE"));
assertNotNull(feed1); assertNotNull(feed1);
assertEquals("atom_1.0.feed.title", feed1.getTitle()); assertEquals("atom_1.0.feed.title", feed1.getTitle());
assertEquals(2, feed1.getEntries().size()); assertEquals(2, feed1.getEntries().size());
SyndEntry entry1 = (SyndEntry) feed1.getEntries().get(0); SyndEntry entry1 = feed1.getEntries().get(0);
assertEquals("atom_1.0.feed.entry[0].title", entry1.getTitle()); assertEquals("atom_1.0.feed.entry[0].title", entry1.getTitle());
// second retrieval should get only the new item // second retrieval should get only the new item
/* /*
* This is breaking with Rome 0.5 ?? * This is breaking with Rome 0.5 ??
*/ */
SyndFeed feed2 = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?deltaencode=TRUE&refreshfeed=TRUE")); final SyndFeed feed2 = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort
+ "/rome/FetcherTestServlet?deltaencode=TRUE&refreshfeed=TRUE"));
assertNotNull(feed2); assertNotNull(feed2);
assertEquals(FetcherTestServlet.DELTA_FEED_TITLE, feed2.getTitle()); assertEquals(FetcherTestServlet.DELTA_FEED_TITLE, feed2.getTitle());
assertEquals(3, feed2.getEntries().size()); assertEquals(3, feed2.getEntries().size());
entry1 = (SyndEntry) feed2.getEntries().get(0); entry1 = feed2.getEntries().get(0);
assertEquals(FetcherTestServlet.DELTA_FEED_ENTRY_TITLE, entry1.getTitle()); assertEquals(FetcherTestServlet.DELTA_FEED_ENTRY_TITLE, entry1.getTitle());
SyndEntry entry2 = (SyndEntry) feed2.getEntries().get(1); final SyndEntry entry2 = feed2.getEntries().get(1);
assertEquals("atom_1.0.feed.entry[0].title", entry2.getTitle()); assertEquals("atom_1.0.feed.entry[0].title", entry2.getTitle());
} catch (Exception e) { } catch (final Exception e) {
e.printStackTrace(); e.printStackTrace();
fail(e.getMessage()); fail(e.getMessage());
} }
} }
} }

View file

@ -1,21 +1,23 @@
package org.rometools.test; package org.rometools.test;
import java.io.File;
import java.net.URL;
import junit.framework.TestCase;
import org.rometools.fetcher.impl.DiskFeedInfoCache; import org.rometools.fetcher.impl.DiskFeedInfoCache;
import org.rometools.fetcher.impl.SyndFeedInfo; import org.rometools.fetcher.impl.SyndFeedInfo;
import java.net.*;
import java.io.File;
import junit.framework.TestCase;
public class DiskFeedInfoCacheTest extends TestCase { public class DiskFeedInfoCacheTest extends TestCase {
public void testClear() throws Exception { public void testClear() throws Exception {
File cacheDir = new File("test-cache"); final File cacheDir = new File("test-cache");
cacheDir.mkdir(); cacheDir.mkdir();
cacheDir.deleteOnExit(); cacheDir.deleteOnExit();
final DiskFeedInfoCache cache = new DiskFeedInfoCache(cacheDir.getCanonicalPath()); final DiskFeedInfoCache cache = new DiskFeedInfoCache(cacheDir.getCanonicalPath());
SyndFeedInfo info = new SyndFeedInfo(); final SyndFeedInfo info = new SyndFeedInfo();
URL url = new URL("http://nowhere.com"); final URL url = new URL("http://nowhere.com");
cache.setFeedInfo(url, info); cache.setFeedInfo(url, info);
cache.clear(); cache.clear();
@ -24,18 +26,18 @@ public class DiskFeedInfoCacheTest extends TestCase {
} }
public void testRemove() throws Exception { public void testRemove() throws Exception {
File cacheDir = new File("test-cache"); final File cacheDir = new File("test-cache");
cacheDir.mkdir(); cacheDir.mkdir();
cacheDir.deleteOnExit(); cacheDir.deleteOnExit();
final DiskFeedInfoCache cache = new DiskFeedInfoCache(cacheDir.getCanonicalPath()); final DiskFeedInfoCache cache = new DiskFeedInfoCache(cacheDir.getCanonicalPath());
SyndFeedInfo info = new SyndFeedInfo(); final SyndFeedInfo info = new SyndFeedInfo();
URL url = new URL("http://nowhere.com"); final URL url = new URL("http://nowhere.com");
cache.setFeedInfo(url, info); cache.setFeedInfo(url, info);
SyndFeedInfo removedInfo = cache.remove( url ); final SyndFeedInfo removedInfo = cache.remove(url);
assertTrue(removedInfo.equals(info)); assertTrue(removedInfo.equals(info));
SyndFeedInfo shouldBeNull = cache.remove( url ); final SyndFeedInfo shouldBeNull = cache.remove(url);
assertTrue(null == shouldBeNull); assertTrue(null == shouldBeNull);
} }

View file

@ -1,11 +1,12 @@
package org.rometools.test; package org.rometools.test;
import org.rometools.fetcher.impl.HashMapFeedInfoCache;
import org.rometools.fetcher.impl.SyndFeedInfo;
import java.net.URL; import java.net.URL;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.rometools.fetcher.impl.HashMapFeedInfoCache;
import org.rometools.fetcher.impl.SyndFeedInfo;
public class HashMapFeedInfoCacheTest extends TestCase { public class HashMapFeedInfoCacheTest extends TestCase {
public void testRemove() throws Exception { public void testRemove() throws Exception {

View file

@ -16,39 +16,42 @@
*/ */
package org.rometools.test; package org.rometools.test;
import org.rometools.fetcher.impl.HttpClientFeedFetcher;
import org.rometools.fetcher.impl.FeedFetcherCache;
import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.rometools.fetcher.FeedFetcher; import org.rometools.fetcher.FeedFetcher;
import org.rometools.fetcher.impl.FeedFetcherCache;
import org.rometools.fetcher.impl.HttpClientFeedFetcher;
/** /**
* @author Nick Lothian * @author Nick Lothian
*/ */
public class HttpClientFeedFetcherTest extends AbstractJettyTest { public class HttpClientFeedFetcherTest extends AbstractJettyTest {
public HttpClientFeedFetcherTest(String s) { public HttpClientFeedFetcherTest(final String s) {
super(s); super(s);
} }
/** /**
* @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getFeedFetcher() * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getFeedFetcher()
*/ */
@Override
protected FeedFetcher getFeedFetcher() { protected FeedFetcher getFeedFetcher() {
return new HttpClientFeedFetcher(); return new HttpClientFeedFetcher();
} }
protected FeedFetcher getFeedFetcher(FeedFetcherCache cache) { @Override
protected FeedFetcher getFeedFetcher(final FeedFetcherCache cache) {
return new HttpClientFeedFetcher(cache); return new HttpClientFeedFetcher(cache);
} }
/** /**
* @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getAuthenticatedFeedFetcher() * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getAuthenticatedFeedFetcher()
*/ */
@Override
public FeedFetcher getAuthenticatedFeedFetcher() { public FeedFetcher getAuthenticatedFeedFetcher() {
return new HttpClientFeedFetcher(null, new HttpClientFeedFetcher.CredentialSupplier() { return new HttpClientFeedFetcher(null, new HttpClientFeedFetcher.CredentialSupplier() {
public Credentials getCredentials(String realm, String host) { @Override
public Credentials getCredentials(final String realm, final String host) {
if ("localhost".equals(host)) { if ("localhost".equals(host)) {
return new UsernamePasswordCredentials("username", "password"); return new UsernamePasswordCredentials("username", "password");
} else { } else {

View file

@ -16,40 +16,40 @@
*/ */
package org.rometools.test; package org.rometools.test;
import org.rometools.fetcher.impl.HttpURLFeedFetcher;
import org.rometools.fetcher.impl.FeedFetcherCache;
import org.rometools.fetcher.FeedFetcher; import org.rometools.fetcher.FeedFetcher;
import org.rometools.fetcher.impl.FeedFetcherCache;
import org.rometools.fetcher.impl.HttpURLFeedFetcher;
public class HttpURLFeedFetcherTest extends AbstractJettyTest { public class HttpURLFeedFetcherTest extends AbstractJettyTest {
public HttpURLFeedFetcherTest(String s) { public HttpURLFeedFetcherTest(final String s) {
super(s); super(s);
} }
/** /**
* @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getFeedFetcher() * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getFeedFetcher()
*/ */
@Override
protected FeedFetcher getFeedFetcher() { protected FeedFetcher getFeedFetcher() {
return new HttpURLFeedFetcher(); return new HttpURLFeedFetcher();
} }
protected FeedFetcher getFeedFetcher(FeedFetcherCache cache) { @Override
protected FeedFetcher getFeedFetcher(final FeedFetcherCache cache) {
return new HttpURLFeedFetcher(cache); return new HttpURLFeedFetcher(cache);
} }
/** /**
* @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getAuthenticatedFeedFetcher() * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getAuthenticatedFeedFetcher()
*/ */
@Override
public FeedFetcher getAuthenticatedFeedFetcher() { public FeedFetcher getAuthenticatedFeedFetcher() {
// setup the authenticator // setup the authenticator
java.net.Authenticator.setDefault(new TestBasicAuthenticator()); java.net.Authenticator.setDefault(new TestBasicAuthenticator());
FeedFetcher feedFetcher = getFeedFetcher(); final FeedFetcher feedFetcher = getFeedFetcher();
return feedFetcher; return feedFetcher;
} }
} }

View file

@ -16,16 +16,16 @@
*/ */
package org.rometools.test; package org.rometools.test;
import org.rometools.fetcher.impl.ResponseHandler;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.rometools.fetcher.impl.ResponseHandler;
public class ResponseHandlerTest extends TestCase { public class ResponseHandlerTest extends TestCase {
/** /**
* Constructor for ResponseHandlerTest. * Constructor for ResponseHandlerTest.
*/ */
public ResponseHandlerTest(String arg0) { public ResponseHandlerTest(final String arg0) {
super(arg0); super(arg0);
} }

View file

@ -27,6 +27,7 @@ public class TestBasicAuthenticator extends Authenticator {
/** /**
* @see java.net.Authenticator#getPasswordAuthentication() * @see java.net.Authenticator#getPasswordAuthentication()
*/ */
@Override
protected PasswordAuthentication getPasswordAuthentication() { protected PasswordAuthentication getPasswordAuthentication() {
if ("localhost".equals(getRequestingHost())) { if ("localhost".equals(getRequestingHost())) {
return new PasswordAuthentication("username", "password".toCharArray()); return new PasswordAuthentication("username", "password".toCharArray());