This commit is contained in:
Edward Capriolo
2016-04-29 13:35:51 -04:00
parent a040e2cd36
commit a7f90aae08
18 changed files with 674 additions and 356 deletions

291
eclipse_template.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="Apache UIMA Code Conventions" version="12">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" 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.insert_new_line_in_empty_annotation_declaration" 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.insert_space_before_at_in_annotation_type_declaration" 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_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<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.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<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_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" 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.insert_space_after_comma_in_for_increments" 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.insert_space_before_comma_in_for_inits" 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_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<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.comment.indent_root_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<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_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<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_brace_in_array_initializer" value="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_after_opening_paren_in_catch" value="do not 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_new_line_after_annotation_on_method" value="insert"/>
<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_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<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.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<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_question_in_wildcard" value="do not 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_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="100"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
<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_opening_brace_in_enum_constant" value="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_space_after_assignment_operator" value="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_opening_paren_in_for" 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_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<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.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<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_after_closing_angle_bracket_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
<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_before_comma_in_array_initializer" 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_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<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_after_comma_in_superinterfaces" 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_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<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_paren_in_catch" value="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.put_empty_statement_on_new_line" value="true"/>
<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_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<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_try" 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.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<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_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<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_after_colon_in_assert" value="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.insert_space_before_comma_in_type_arguments" 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_new_line_in_empty_type_declaration" value="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.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" 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_between_empty_parens_in_method_declaration" value="do not insert"/>
<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.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<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_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<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_opening_paren_in_if" value="insert"/>
<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_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<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.comment.format_header" value="false"/>
<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_method_invocation" 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.compiler.codegen.inlineJsrBytecode" value="enabled"/>
<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.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<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.indent_switchstatements_compare_to_cases" value="true"/>
<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.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<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_space_before_colon_in_for" value="insert"/>
<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="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
<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_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="2"/>
<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_comma_in_allocation_expression" value="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.insert_space_after_colon_in_conditional" value="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_brace_in_array_initializer" value="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_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<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_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not 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.insert_space_after_opening_brace_in_array_initializer" value="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.comment.format_html" value="true"/>
<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_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<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.insert_space_after_unary_operator" value="do not insert"/>
<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_arguments_in_annotation" value="0"/>
<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.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<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_before_assignment_operator" value="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.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<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_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" 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_before_comma_in_method_declaration_parameters" value="do not insert"/>
<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_closing_paren_in_cast" 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.blank_lines_before_member_type" value="1"/>
<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.insert_space_before_opening_bracket_in_array_type_reference" 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.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<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_new_line_in_empty_enum_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_before_closing_paren_in_method_declaration" 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.insert_space_before_semicolon" 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.insert_space_after_opening_paren_in_try" 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.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<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.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" 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_between_brackets_in_array_type_reference" value="do not 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.insert_space_before_semicolon_in_for" value="do not insert"/>
<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_opening_bracket_in_array_allocation_expression" 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.alignment_for_multiple_fields" value="16"/>
<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_before_prefix_operator" 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.wrap_before_binary_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="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.compiler.compliance" value="1.7"/>
<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_space_after_comma_in_annotation" value="insert"/>
<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_between_empty_braces_in_array_initializer" value="do not insert"/>
<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_before_comma_in_multiple_local_declarations" 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.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<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.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<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_before_opening_paren_in_synchronized" 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_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<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.insert_space_before_closing_paren_in_enum_constant" 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_closing_paren_in_annotation" 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.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="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.join_lines_in_comments" value="true"/>
<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_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
<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.tabulation.char" value="space"/>
<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.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="100"/>
<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.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile>
</profiles>

View File

@ -24,158 +24,176 @@ import org.json.JSONObject;
/** /**
* A abstract class representing a gossip member. * A abstract class representing a gossip member.
* *
* @author joshclemm, harmenw * @author joshclemm, harmenw
*/ */
public abstract class GossipMember implements Comparable<GossipMember>{ public abstract class GossipMember implements Comparable<GossipMember> {
public static final String JSON_HOST = "host"; public static final String JSON_HOST = "host";
public static final String JSON_PORT = "port";
public static final String JSON_HEARTBEAT = "heartbeat";
public static final String JSON_ID = "id";
public static final String JSON_CLUSTER = "cluster";
protected final String _host;
protected final int _port;
protected volatile long _heartbeat;
protected final String _clusterName;
/**
* The purpose of the id field is to be able for nodes to identify themselves beyond there host/port. For example
* an application might generate a persistent id so if they rejoin the cluster at a different host and port we
* are aware it is the same node.
*/
protected String _id;
/** public static final String JSON_PORT = "port";
* Constructor.
* @param host The hostname or IP address.
* @param port The port number.
* @param heartbeat The current heartbeat.
* @param id an id that may be replaced after contact
*/
public GossipMember(String clusterName, String host, int port, String id, long heartbeat) {
_clusterName = clusterName;
_host = host;
_port = port;
_id = id;
_heartbeat = heartbeat;
}
/** public static final String JSON_HEARTBEAT = "heartbeat";
* Get the name of the cluster the member belongs to.
*
* @return The cluster name
*/
public String getClusterName(){
return _clusterName;
}
/** public static final String JSON_ID = "id";
* Get the hostname or IP address of the remote gossip member.
* @return The hostname or IP address.
*/
public String getHost() {
return _host;
}
/** public static final String JSON_CLUSTER = "cluster";
* Get the port number of the remote gossip member.
* @return The port number.
*/
public int getPort() {
return _port;
}
/** protected final String host;
* The member address in the form IP/host:port
* Similar to the toString in {@link InetSocketAddress}
*/
public String getAddress() {
return _host+":"+_port;
}
/** protected final int port;
* Get the heartbeat of this gossip member.
* @return The current heartbeat.
*/
public long getHeartbeat() {
return _heartbeat;
}
/** protected volatile long heartbeat;
* Set the heartbeat of this gossip member.
* @param heartbeat The new heartbeat.
*/
public void setHeartbeat(long heartbeat) {
this._heartbeat = heartbeat;
}
protected final String clusterName;
public String getId() { /**
return _id; * The purpose of the id field is to be able for nodes to identify themselves beyond there
* host/port. For example an application might generate a persistent id so if they rejoin the
* cluster at a different host and port we are aware it is the same node.
*/
protected String id;
/**
* Constructor.
*
* @param host
* The hostname or IP address.
* @param port
* The port number.
* @param heartbeat
* The current heartbeat.
* @param id
* an id that may be replaced after contact
*/
public GossipMember(String clusterName, String host, int port, String id, long heartbeat) {
this.clusterName = clusterName;
this.host = host;
this.port = port;
this.id = id;
this.heartbeat = heartbeat;
}
/**
* Get the name of the cluster the member belongs to.
*
* @return The cluster name
*/
public String getClusterName() {
return clusterName;
}
/**
* Get the hostname or IP address of the remote gossip member.
*
* @return The hostname or IP address.
*/
public String getHost() {
return host;
}
/**
* Get the port number of the remote gossip member.
*
* @return The port number.
*/
public int getPort() {
return port;
}
/**
* The member address in the form IP/host:port Similar to the toString in
* {@link InetSocketAddress}
*/
public String getAddress() {
return host + ":" + port;
}
/**
* Get the heartbeat of this gossip member.
*
* @return The current heartbeat.
*/
public long getHeartbeat() {
return heartbeat;
}
/**
* Set the heartbeat of this gossip member.
*
* @param heartbeat
* The new heartbeat.
*/
public void setHeartbeat(long heartbeat) {
this.heartbeat = heartbeat;
}
public String getId() {
return id;
} }
public void setId(String _id) { public void setId(String _id) {
this._id = _id; this.id = _id;
} }
public String toString() { public String toString() {
return "Member [address=" + getAddress() + ", id=" + _id + ", heartbeat=" + _heartbeat + "]"; return "Member [address=" + getAddress() + ", id=" + id + ", heartbeat=" + heartbeat + "]";
} }
/** /**
* @see java.lang.Object#hashCode() * @see java.lang.Object#hashCode()
*/ */
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
String address = getAddress(); String address = getAddress();
result = prime * result result = prime * result + ((address == null) ? 0 : address.hashCode()) + clusterName == null ? 0
+ ((address == null) ? 0 : address.hashCode()) : clusterName.hashCode();
+ _clusterName == null ? 0 : _clusterName.hashCode(); return result;
return result; }
}
/** /**
* @see java.lang.Object#equals(java.lang.Object) * @see java.lang.Object#equals(java.lang.Object)
*/ */
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
return true; return true;
} }
if (obj == null) { if (obj == null) {
System.err.println("equals(): obj is null."); System.err.println("equals(): obj is null.");
return false; return false;
} }
if (! (obj instanceof GossipMember) ) { if (!(obj instanceof GossipMember)) {
System.err.println("equals(): obj is not of type GossipMember."); System.err.println("equals(): obj is not of type GossipMember.");
return false; return false;
} }
// The object is the same of they both have the same address (hostname and port). // The object is the same of they both have the same address (hostname and port).
return getAddress().equals(((LocalGossipMember) obj).getAddress()) && return getAddress().equals(((LocalGossipMember) obj).getAddress())
getClusterName().equals(((LocalGossipMember) obj).getClusterName()); && getClusterName().equals(((LocalGossipMember) obj).getClusterName());
} }
/** /**
* Get the JSONObject which is the JSON representation of this GossipMember. * Get the JSONObject which is the JSON representation of this GossipMember.
* @return The JSONObject of this GossipMember. *
*/ * @return The JSONObject of this GossipMember.
public JSONObject toJSONObject() { */
try { public JSONObject toJSONObject() {
JSONObject jsonObject = new JSONObject(); try {
jsonObject.put(JSON_CLUSTER, _clusterName); JSONObject jsonObject = new JSONObject();
jsonObject.put(JSON_HOST, _host); jsonObject.put(JSON_CLUSTER, clusterName);
jsonObject.put(JSON_PORT, _port); jsonObject.put(JSON_HOST, host);
jsonObject.put(JSON_ID, _id); jsonObject.put(JSON_PORT, port);
jsonObject.put(JSON_HEARTBEAT, _heartbeat); jsonObject.put(JSON_ID, id);
return jsonObject; jsonObject.put(JSON_HEARTBEAT, heartbeat);
} catch (JSONException e) { return jsonObject;
throw new RuntimeException(e); } catch (JSONException e) {
} throw new RuntimeException(e);
} }
}
public int compareTo(GossipMember other){ public int compareTo(GossipMember other) {
return this.getAddress().compareTo(other.getAddress()); return this.getAddress().compareTo(other.getAddress());
} }
} }

View File

@ -27,18 +27,15 @@ public class GossipRunner {
public static void main(String[] args) { public static void main(String[] args) {
File configFile; File configFile;
if (args.length == 1) { if (args.length == 1) {
configFile = new File("./" + args[0]); configFile = new File("./" + args[0]);
} else { } else {
configFile = new File("gossip.conf"); configFile = new File("gossip.conf");
} }
new GossipRunner(configFile); new GossipRunner(configFile);
} }
public GossipRunner(File configFile) { public GossipRunner(File configFile) {
if (configFile != null && configFile.exists()) { if (configFile != null && configFile.exists()) {
try { try {
System.out.println("Parsing the configuration file..."); System.out.println("Parsing the configuration file...");

View File

@ -29,57 +29,59 @@ import com.google.code.gossip.manager.random.RandomGossipManager;
/** /**
* This object represents the service which is responsible for gossiping with other gossip members. * This object represents the service which is responsible for gossiping with other gossip members.
* *
* @author joshclemm, harmenw * @author joshclemm, harmenw
*/ */
public class GossipService { public class GossipService {
public static final Logger LOGGER = Logger.getLogger(GossipService.class); public static final Logger LOGGER = Logger.getLogger(GossipService.class);
private GossipManager _gossipManager; private GossipManager gossipManager;
/** /**
* Constructor with the default settings. * Constructor with the default settings.
* *
* @throws InterruptedException * @throws InterruptedException
* @throws UnknownHostException * @throws UnknownHostException
*/ */
public GossipService(StartupSettings startupSettings) throws InterruptedException, public GossipService(StartupSettings startupSettings) throws InterruptedException,
UnknownHostException { UnknownHostException {
this(startupSettings.getCluster(), InetAddress.getLocalHost().getHostAddress(), startupSettings.getPort(), startupSettings.getId(), this(startupSettings.getCluster(), InetAddress.getLocalHost().getHostAddress(), startupSettings
startupSettings.getGossipMembers(), startupSettings .getPort(), startupSettings.getId(), startupSettings.getGossipMembers(),
.getGossipSettings(), null); startupSettings.getGossipSettings(), null);
} }
/** /**
* Setup the client's lists, gossiping parameters, and parse the startup config file. * Setup the client's lists, gossiping parameters, and parse the startup config file.
* *
* @throws InterruptedException * @throws InterruptedException
* @throws UnknownHostException * @throws UnknownHostException
*/ */
public GossipService(String cluster, String ipAddress, int port, String id, public GossipService(String cluster, String ipAddress, int port, String id,
List<GossipMember> gossipMembers, GossipSettings settings, GossipListener listener) List<GossipMember> gossipMembers, GossipSettings settings, GossipListener listener)
throws InterruptedException, UnknownHostException { throws InterruptedException, UnknownHostException {
_gossipManager = new RandomGossipManager(cluster, ipAddress, port, id, settings, gossipMembers, listener); gossipManager = new RandomGossipManager(cluster, ipAddress, port, id, settings, gossipMembers,
listener);
} }
public void start() { public void start() {
String address = get_gossipManager().getMyself().getHost() + ":" + get_gossipManager().getMyself().getPort(); String address = get_gossipManager().getMyself().getHost() + ":"
LOGGER.debug( "Starting: " + _gossipManager.getName() + " - " + address ); + get_gossipManager().getMyself().getPort();
LOGGER.debug("Starting: " + gossipManager.getName() + " - " + address);
_gossipManager.start(); gossipManager.start();
} }
public void shutdown() { public void shutdown() {
_gossipManager.shutdown(); gossipManager.shutdown();
} }
public GossipManager get_gossipManager() { public GossipManager get_gossipManager() {
return _gossipManager; return gossipManager;
} }
public void set_gossipManager(GossipManager _gossipManager) { public void set_gossipManager(GossipManager _gossipManager) {
this._gossipManager = _gossipManager; this.gossipManager = _gossipManager;
} }
} }

View File

@ -25,10 +25,10 @@ package com.google.code.gossip;
public class GossipSettings { public class GossipSettings {
/** Time between gossip'ing in ms. Default is 1 second. */ /** Time between gossip'ing in ms. Default is 1 second. */
private int _gossipInterval = 1000; private int gossipInterval = 1000;
/** Time between cleanups in ms. Default is 10 seconds. */ /** Time between cleanups in ms. Default is 10 seconds. */
private int _cleanupInterval = 10000; private int cleanupInterval = 10000;
/** /**
* Construct GossipSettings with default settings. * Construct GossipSettings with default settings.
@ -45,8 +45,8 @@ public class GossipSettings {
* The cleanup interval in ms. * The cleanup interval in ms.
*/ */
public GossipSettings(int gossipInterval, int cleanupInterval) { public GossipSettings(int gossipInterval, int cleanupInterval) {
_gossipInterval = gossipInterval; this.gossipInterval = gossipInterval;
_cleanupInterval = cleanupInterval; this.cleanupInterval = cleanupInterval;
} }
/** /**
@ -56,7 +56,7 @@ public class GossipSettings {
* The gossip interval in ms. * The gossip interval in ms.
*/ */
public void setGossipTimeout(int gossipInterval) { public void setGossipTimeout(int gossipInterval) {
_gossipInterval = gossipInterval; this.gossipInterval = gossipInterval;
} }
/** /**
@ -67,7 +67,7 @@ public class GossipSettings {
* The cleanup interval in ms. * The cleanup interval in ms.
*/ */
public void setCleanupInterval(int cleanupInterval) { public void setCleanupInterval(int cleanupInterval) {
_cleanupInterval = cleanupInterval; this.cleanupInterval = cleanupInterval;
} }
/** /**
@ -76,7 +76,7 @@ public class GossipSettings {
* @return The gossip interval in ms. * @return The gossip interval in ms.
*/ */
public int getGossipInterval() { public int getGossipInterval() {
return _gossipInterval; return gossipInterval;
} }
/** /**
@ -85,6 +85,6 @@ public class GossipSettings {
* @return The cleanup interval. * @return The cleanup interval.
*/ */
public int getCleanupInterval() { public int getCleanupInterval() {
return _cleanupInterval; return cleanupInterval;
} }
} }

View File

@ -26,17 +26,18 @@ import javax.management.timer.Timer;
* This object represents a timer for a gossip member. When the timer has elapsed without being * This object represents a timer for a gossip member. When the timer has elapsed without being
* reset in the meantime, it will inform the GossipService about this who in turn will put the * reset in the meantime, it will inform the GossipService about this who in turn will put the
* gossip member on the dead list, because it is apparantly not alive anymore. * gossip member on the dead list, because it is apparantly not alive anymore.
* *
* @author joshclemm, harmenw * @author joshclemm, harmenw
*/ */
public class GossipTimeoutTimer extends Timer { public class GossipTimeoutTimer extends Timer {
private final long _sleepTime; private final long sleepTime;
private final LocalGossipMember _source;
private final LocalGossipMember source;
/** /**
* Constructor. Creates a reset-able timer that wakes up after millisecondsSleepTime. * Constructor. Creates a reset-able timer that wakes up after millisecondsSleepTime.
* *
* @param millisecondsSleepTime * @param millisecondsSleepTime
* The time for this timer to wait before an event. * The time for this timer to wait before an event.
* @param notificationListener * @param notificationListener
@ -45,8 +46,8 @@ public class GossipTimeoutTimer extends Timer {
public GossipTimeoutTimer(long millisecondsSleepTime, NotificationListener notificationListener, public GossipTimeoutTimer(long millisecondsSleepTime, NotificationListener notificationListener,
LocalGossipMember member) { LocalGossipMember member) {
super(); super();
_sleepTime = millisecondsSleepTime; sleepTime = millisecondsSleepTime;
_source = member; source = member;
addNotificationListener(notificationListener, null, null); addNotificationListener(notificationListener, null, null);
} }
@ -63,15 +64,15 @@ public class GossipTimeoutTimer extends Timer {
*/ */
public void reset() { public void reset() {
removeAllNotifications(); removeAllNotifications();
setWakeupTime(_sleepTime); setWakeupTime(sleepTime);
} }
/** /**
* Adds a new wake-up time for this timer. * Adds a new wake-up time for this timer.
* *
* @param milliseconds * @param milliseconds
*/ */
private void setWakeupTime(long milliseconds) { private void setWakeupTime(long milliseconds) {
addNotification("type", "message", _source, new Date(System.currentTimeMillis() + milliseconds)); addNotification("type", "message", source, new Date(System.currentTimeMillis() + milliseconds));
} }
} }

View File

@ -22,7 +22,7 @@ import javax.management.NotificationListener;
/** /**
* This object represent a gossip member with the properties known locally. These objects are stored * This object represent a gossip member with the properties known locally. These objects are stored
* in the local list of gossip member.s * in the local list of gossip member.s
* *
* @author harmenw * @author harmenw
*/ */
public class LocalGossipMember extends GossipMember { public class LocalGossipMember extends GossipMember {
@ -31,7 +31,7 @@ public class LocalGossipMember extends GossipMember {
/** /**
* Constructor. * Constructor.
* *
* @param hostname * @param hostname
* The hostname or IP address. * The hostname or IP address.
* @param port * @param port
@ -43,28 +43,28 @@ public class LocalGossipMember extends GossipMember {
* @param cleanupTimeout * @param cleanupTimeout
* The cleanup timeout for this gossip member. * The cleanup timeout for this gossip member.
*/ */
public LocalGossipMember(String clusterName, String hostname, int port, String id, long heartbeat, public LocalGossipMember(String clusterName, String hostname, int port, String id,
NotificationListener notificationListener, int cleanupTimeout) { long heartbeat, NotificationListener notificationListener, int cleanupTimeout) {
super(clusterName, hostname, port, id, heartbeat); super(clusterName, hostname, port, id, heartbeat);
this.timeoutTimer = new GossipTimeoutTimer(cleanupTimeout, notificationListener, this); timeoutTimer = new GossipTimeoutTimer(cleanupTimeout, notificationListener, this);
} }
/** /**
* Start the timeout timer. * Start the timeout timer.
*/ */
public void startTimeoutTimer() { public void startTimeoutTimer() {
this.timeoutTimer.start(); timeoutTimer.start();
} }
/** /**
* Reset the timeout timer. * Reset the timeout timer.
*/ */
public void resetTimeoutTimer() { public void resetTimeoutTimer() {
this.timeoutTimer.reset(); timeoutTimer.reset();
} }
public void disableTimer() { public void disableTimer() {
this.timeoutTimer.removeAllNotifications(); timeoutTimer.removeAllNotifications();
} }
} }

View File

@ -20,14 +20,14 @@ package com.google.code.gossip;
/** /**
* The object represents a gossip member with the properties as received from a remote gossip * The object represents a gossip member with the properties as received from a remote gossip
* member. * member.
* *
* @author harmenw * @author harmenw
*/ */
public class RemoteGossipMember extends GossipMember { public class RemoteGossipMember extends GossipMember {
/** /**
* Constructor. * Constructor.
* *
* @param hostname * @param hostname
* The hostname or IP address. * The hostname or IP address.
* @param port * @param port
@ -41,7 +41,7 @@ public class RemoteGossipMember extends GossipMember {
/** /**
* Construct a RemoteGossipMember with a heartbeat of 0. * Construct a RemoteGossipMember with a heartbeat of 0.
* *
* @param hostname * @param hostname
* The hostname or IP address. * The hostname or IP address.
* @param port * @param port

View File

@ -32,29 +32,29 @@ import org.json.JSONObject;
/** /**
* This object represents the settings used when starting the gossip service. * This object represents the settings used when starting the gossip service.
* *
* @author harmenw * @author harmenw
*/ */
public class StartupSettings { public class StartupSettings {
private static final Logger log = Logger.getLogger(StartupSettings.class); private static final Logger log = Logger.getLogger(StartupSettings.class);
/** The id to use fo the service */ /** The id to use fo the service */
private String _id; private String id;
/** The port to start the gossip service on. */ /** The port to start the gossip service on. */
private int _port; private int port;
private String cluster; private String cluster;
/** The gossip settings used at startup. */ /** The gossip settings used at startup. */
private final GossipSettings _gossipSettings; private final GossipSettings gossipSettings;
/** The list with gossip members to start with. */ /** The list with gossip members to start with. */
private final List<GossipMember> _gossipMembers; private final List<GossipMember> gossipMembers;
/** /**
* Constructor. * Constructor.
* *
* @param id * @param id
* The id to be used for this service * The id to be used for this service
* @param port * @param port
@ -68,96 +68,96 @@ public class StartupSettings {
/** /**
* Constructor. * Constructor.
* *
* @param id * @param id
* The id to be used for this service * The id to be used for this service
* @param port * @param port
* The port to start the service on. * The port to start the service on.
*/ */
public StartupSettings(String id, int port, GossipSettings gossipSettings) { public StartupSettings(String id, int port, GossipSettings gossipSettings) {
_id = id; this.id = id;
_port = port; this.port = port;
_gossipSettings = gossipSettings; this.gossipSettings = gossipSettings;
_gossipMembers = new ArrayList<>(); gossipMembers = new ArrayList<>();
} }
public void setCluster(String cluster){ public void setCluster(String cluster) {
this.cluster = cluster; this.cluster = cluster;
} }
public String getCluster(){ public String getCluster() {
return this.cluster; return cluster;
} }
/** /**
* Set the id to be used for this service. * Set the id to be used for this service.
* *
* @param id * @param id
* The id for this service. * The id for this service.
*/ */
public void setId( String id ) { public void setId(String id) {
_id = id; this.id = id;
} }
/** /**
* Get the id for this service. * Get the id for this service.
* *
* @return the service's id. * @return the service's id.
*/ */
public String getId() { public String getId() {
return _id; return id;
} }
/** /**
* Set the port of the gossip service. * Set the port of the gossip service.
* *
* @param port * @param port
* The port for the gossip service. * The port for the gossip service.
*/ */
public void setPort(int port) { public void setPort(int port) {
_port = port; this.port = port;
} }
/** /**
* Get the port for the gossip service. * Get the port for the gossip service.
* *
* @return The port of the gossip service. * @return The port of the gossip service.
*/ */
public int getPort() { public int getPort() {
return _port; return port;
} }
/** /**
* Get the GossipSettings. * Get the GossipSettings.
* *
* @return The GossipSettings object. * @return The GossipSettings object.
*/ */
public GossipSettings getGossipSettings() { public GossipSettings getGossipSettings() {
return _gossipSettings; return gossipSettings;
} }
/** /**
* Add a gossip member to the list of members to start with. * Add a gossip member to the list of members to start with.
* *
* @param member * @param member
* The member to add. * The member to add.
*/ */
public void addGossipMember(GossipMember member) { public void addGossipMember(GossipMember member) {
_gossipMembers.add(member); gossipMembers.add(member);
} }
/** /**
* Get the list with gossip members. * Get the list with gossip members.
* *
* @return The gossip members. * @return The gossip members.
*/ */
public List<GossipMember> getGossipMembers() { public List<GossipMember> getGossipMembers() {
return _gossipMembers; return gossipMembers;
} }
/** /**
* Parse the settings for the gossip service from a JSON file. * Parse the settings for the gossip service from a JSON file.
* *
* @param jsonFile * @param jsonFile
* The file object which refers to the JSON config file. * The file object which refers to the JSON config file.
* @return The StartupSettings object with the settings from the config file. * @return The StartupSettings object with the settings from the config file.
@ -171,12 +171,14 @@ public class StartupSettings {
public static StartupSettings fromJSONFile(File jsonFile) throws JSONException, public static StartupSettings fromJSONFile(File jsonFile) throws JSONException,
FileNotFoundException, IOException { FileNotFoundException, IOException {
// Read the file to a String. // Read the file to a String.
BufferedReader br = new BufferedReader(new FileReader(jsonFile));
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
String line; try (BufferedReader br = new BufferedReader(new FileReader(jsonFile)) ){
while ((line = br.readLine()) != null) { String line;
buffer.append(line.trim()); while ((line = br.readLine()) != null) {
buffer.append(line.trim());
}
} }
// Lets parse the String as JSON. // Lets parse the String as JSON.
JSONObject jsonObject = new JSONArray(buffer.toString()).getJSONObject(0); JSONObject jsonObject = new JSONArray(buffer.toString()).getJSONObject(0);
@ -194,22 +196,22 @@ public class StartupSettings {
int cleanupInterval = jsonObject.getInt("cleanup_interval"); int cleanupInterval = jsonObject.getInt("cleanup_interval");
// Initiate the settings with the port number. // Initiate the settings with the port number.
StartupSettings settings = new StartupSettings(id, port, new GossipSettings( StartupSettings settings = new StartupSettings(id, port, new GossipSettings(gossipInterval,
gossipInterval, cleanupInterval)); cleanupInterval));
// Now iterate over the members from the config file and add them to the settings. // Now iterate over the members from the config file and add them to the settings.
String configMembersDetails = "Config-members ["; String configMembersDetails = "Config-members [";
JSONArray membersJSON = jsonObject.getJSONArray("members"); JSONArray membersJSON = jsonObject.getJSONArray("members");
for (int i = 0; i < membersJSON.length(); i++) { for (int i = 0; i < membersJSON.length(); i++) {
JSONObject memberJSON = membersJSON.getJSONObject(i); JSONObject memberJSON = membersJSON.getJSONObject(i);
RemoteGossipMember member = new RemoteGossipMember(memberJSON.getString("cluster"), memberJSON.getString("host"), RemoteGossipMember member = new RemoteGossipMember(memberJSON.getString("cluster"),
memberJSON.getInt("port"), ""); memberJSON.getString("host"), memberJSON.getInt("port"), "");
settings.addGossipMember(member); settings.addGossipMember(member);
configMembersDetails += member.getAddress(); configMembersDetails += member.getAddress();
if (i < (membersJSON.length() - 1)) if (i < (membersJSON.length() - 1))
configMembersDetails += ", "; configMembersDetails += ", ";
} }
log.info( configMembersDetails + "]" ); log.info(configMembersDetails + "]");
// Return the created settings object. // Return the created settings object.
return settings; return settings;

View File

@ -21,7 +21,7 @@ public enum GossipState {
UP("up"), DOWN("down"); UP("up"), DOWN("down");
private final String state; private final String state;
private GossipState(String state){ private GossipState(String state) {
this.state = state; this.state = state;
} }
} }

View File

@ -30,7 +30,7 @@ import com.google.code.gossip.RemoteGossipMember;
/** /**
* This class is an example of how one could use the gossip service. Here we start multiple gossip * This class is an example of how one could use the gossip service. Here we start multiple gossip
* clients on this host as specified in the config file. * clients on this host as specified in the config file.
* *
* @author harmenw * @author harmenw
*/ */
public class GossipExample extends Thread { public class GossipExample extends Thread {

View File

@ -31,31 +31,31 @@ import com.google.code.gossip.LocalGossipMember;
*/ */
abstract public class ActiveGossipThread implements Runnable { abstract public class ActiveGossipThread implements Runnable {
protected final GossipManager _gossipManager; protected final GossipManager gossipManager;
private final AtomicBoolean _keepRunning; private final AtomicBoolean keepRunning;
public ActiveGossipThread(GossipManager gossipManager) { public ActiveGossipThread(GossipManager gossipManager) {
_gossipManager = gossipManager; this.gossipManager = gossipManager;
_keepRunning = new AtomicBoolean(true); this.keepRunning = new AtomicBoolean(true);
} }
@Override @Override
public void run() { public void run() {
while (_keepRunning.get()) { while (keepRunning.get()) {
try { try {
TimeUnit.MILLISECONDS.sleep(_gossipManager.getSettings().getGossipInterval()); TimeUnit.MILLISECONDS.sleep(gossipManager.getSettings().getGossipInterval());
sendMembershipList(_gossipManager.getMyself(), _gossipManager.getMemberList()); sendMembershipList(gossipManager.getMyself(), gossipManager.getMemberList());
} catch (InterruptedException e) { } catch (InterruptedException e) {
GossipService.LOGGER.error(e); GossipService.LOGGER.error(e);
_keepRunning.set(false); keepRunning.set(false);
} }
} }
shutdown(); shutdown();
} }
public void shutdown() { public void shutdown() {
_keepRunning.set(false); keepRunning.set(false);
} }
/** /**
@ -67,7 +67,7 @@ abstract public class ActiveGossipThread implements Runnable {
/** /**
* Abstract method which should be implemented by a subclass. This method should return a member * Abstract method which should be implemented by a subclass. This method should return a member
* of the list to gossip with. * of the list to gossip with.
* *
* @param memberList * @param memberList
* The list of members which are stored in the local list of members. * The list of members which are stored in the local list of members.
* @return The chosen LocalGossipMember to gossip with. * @return The chosen LocalGossipMember to gossip with.

View File

@ -43,39 +43,50 @@ import com.google.code.gossip.event.GossipState;
public abstract class GossipManager extends Thread implements NotificationListener { public abstract class GossipManager extends Thread implements NotificationListener {
public static final Logger LOGGER = Logger.getLogger(GossipManager.class); public static final Logger LOGGER = Logger.getLogger(GossipManager.class);
public static final int MAX_PACKET_SIZE = 102400; public static final int MAX_PACKET_SIZE = 102400;
private final ConcurrentSkipListMap<LocalGossipMember,GossipState> members; private final ConcurrentSkipListMap<LocalGossipMember, GossipState> members;
private final LocalGossipMember _me;
private final GossipSettings _settings; private final LocalGossipMember me;
private final AtomicBoolean _gossipServiceRunning;
private final Class<? extends PassiveGossipThread> _passiveGossipThreadClass; private final GossipSettings settings;
private final Class<? extends ActiveGossipThread> _activeGossipThreadClass;
private final AtomicBoolean gossipServiceRunning;
private final Class<? extends PassiveGossipThread> passiveGossipThreadClass;
private final Class<? extends ActiveGossipThread> activeGossipThreadClass;
private final GossipListener listener; private final GossipListener listener;
private ActiveGossipThread activeGossipThread; private ActiveGossipThread activeGossipThread;
private PassiveGossipThread passiveGossipThread; private PassiveGossipThread passiveGossipThread;
private ExecutorService _gossipThreadExecutor;
private ExecutorService gossipThreadExecutor;
public GossipManager(Class<? extends PassiveGossipThread> passiveGossipThreadClass, public GossipManager(Class<? extends PassiveGossipThread> passiveGossipThreadClass,
Class<? extends ActiveGossipThread> activeGossipThreadClass, String cluster, String address, int port, Class<? extends ActiveGossipThread> activeGossipThreadClass, String cluster,
String id, GossipSettings settings, List<GossipMember> gossipMembers, String address, int port, String id, GossipSettings settings,
GossipListener listener) { List<GossipMember> gossipMembers, GossipListener listener) {
_passiveGossipThreadClass = passiveGossipThreadClass; this.passiveGossipThreadClass = passiveGossipThreadClass;
_activeGossipThreadClass = activeGossipThreadClass; this.activeGossipThreadClass = activeGossipThreadClass;
_settings = settings; this.settings = settings;
_me = new LocalGossipMember(cluster, address, port, id, System.currentTimeMillis(), this, settings.getCleanupInterval()); me = new LocalGossipMember(cluster, address, port, id, System.currentTimeMillis(), this,
settings.getCleanupInterval());
members = new ConcurrentSkipListMap<>(); members = new ConcurrentSkipListMap<>();
for (GossipMember startupMember : gossipMembers) { for (GossipMember startupMember : gossipMembers) {
if (!startupMember.equals(_me)) { if (!startupMember.equals(me)) {
LocalGossipMember member = new LocalGossipMember(startupMember.getClusterName(), startupMember.getHost(), LocalGossipMember member = new LocalGossipMember(startupMember.getClusterName(),
startupMember.getPort(), startupMember.getId(), System.currentTimeMillis(), this, startupMember.getHost(), startupMember.getPort(), startupMember.getId(),
settings.getCleanupInterval()); System.currentTimeMillis(), this, settings.getCleanupInterval());
members.put(member, GossipState.UP); members.put(member, GossipState.UP);
GossipService.LOGGER.debug(member); GossipService.LOGGER.debug(member);
} }
} }
_gossipThreadExecutor = Executors.newCachedThreadPool(); gossipThreadExecutor = Executors.newCachedThreadPool();
_gossipServiceRunning = new AtomicBoolean(true); gossipServiceRunning = new AtomicBoolean(true);
this.listener = listener; this.listener = listener;
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() { public void run() {
@ -98,9 +109,9 @@ public abstract class GossipManager extends Thread implements NotificationListen
} }
} }
public void revivieMember(LocalGossipMember m){ public void revivieMember(LocalGossipMember m) {
for ( Entry<LocalGossipMember, GossipState> it : this.members.entrySet()){ for (Entry<LocalGossipMember, GossipState> it : this.members.entrySet()) {
if (it.getKey().getId().equals(m.getId())){ if (it.getKey().getId().equals(m.getId())) {
it.getKey().disableTimer(); it.getKey().disableTimer();
} }
} }
@ -110,8 +121,8 @@ public abstract class GossipManager extends Thread implements NotificationListen
listener.gossipEvent(m, GossipState.UP); listener.gossipEvent(m, GossipState.UP);
} }
} }
public void createOrRevivieMember(LocalGossipMember m){ public void createOrRevivieMember(LocalGossipMember m) {
members.put(m, GossipState.UP); members.put(m, GossipState.UP);
if (listener != null) { if (listener != null) {
listener.gossipEvent(m, GossipState.UP); listener.gossipEvent(m, GossipState.UP);
@ -119,7 +130,7 @@ public abstract class GossipManager extends Thread implements NotificationListen
} }
public GossipSettings getSettings() { public GossipSettings getSettings() {
return _settings; return settings;
} }
/** /**
@ -128,8 +139,8 @@ public abstract class GossipManager extends Thread implements NotificationListen
*/ */
public List<LocalGossipMember> getMemberList() { public List<LocalGossipMember> getMemberList() {
List<LocalGossipMember> up = new ArrayList<>(); List<LocalGossipMember> up = new ArrayList<>();
for (Entry<LocalGossipMember, GossipState> entry : members.entrySet()){ for (Entry<LocalGossipMember, GossipState> entry : members.entrySet()) {
if (GossipState.UP.equals(entry.getValue())){ if (GossipState.UP.equals(entry.getValue())) {
up.add(entry.getKey()); up.add(entry.getKey());
} }
} }
@ -137,13 +148,13 @@ public abstract class GossipManager extends Thread implements NotificationListen
} }
public LocalGossipMember getMyself() { public LocalGossipMember getMyself() {
return _me; return me;
} }
public List<LocalGossipMember> getDeadList() { public List<LocalGossipMember> getDeadList() {
List<LocalGossipMember> up = new ArrayList<>(); List<LocalGossipMember> up = new ArrayList<>();
for (Entry<LocalGossipMember, GossipState> entry : members.entrySet()){ for (Entry<LocalGossipMember, GossipState> entry : members.entrySet()) {
if (GossipState.DOWN.equals(entry.getValue())){ if (GossipState.DOWN.equals(entry.getValue())) {
up.add(entry.getKey()); up.add(entry.getKey());
} }
} }
@ -156,23 +167,23 @@ public abstract class GossipManager extends Thread implements NotificationListen
*/ */
public void run() { public void run() {
for (LocalGossipMember member : members.keySet()) { for (LocalGossipMember member : members.keySet()) {
if (member != _me) { if (member != me) {
member.startTimeoutTimer(); member.startTimeoutTimer();
} }
} }
try { try {
passiveGossipThread = _passiveGossipThreadClass.getConstructor(GossipManager.class) passiveGossipThread = passiveGossipThreadClass.getConstructor(GossipManager.class)
.newInstance(this); .newInstance(this);
_gossipThreadExecutor.execute(passiveGossipThread); gossipThreadExecutor.execute(passiveGossipThread);
activeGossipThread = _activeGossipThreadClass.getConstructor(GossipManager.class) activeGossipThread = activeGossipThreadClass.getConstructor(GossipManager.class)
.newInstance(this); .newInstance(this);
_gossipThreadExecutor.execute(activeGossipThread); gossipThreadExecutor.execute(activeGossipThread);
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException | SecurityException e1) { | InvocationTargetException | NoSuchMethodException | SecurityException e1) {
throw new RuntimeException(e1); throw new RuntimeException(e1);
} }
GossipService.LOGGER.debug("The GossipService is started."); GossipService.LOGGER.debug("The GossipService is started.");
while (_gossipServiceRunning.get()) { while (gossipServiceRunning.get()) {
try { try {
// TODO // TODO
TimeUnit.MILLISECONDS.sleep(1); TimeUnit.MILLISECONDS.sleep(1);
@ -186,17 +197,17 @@ public abstract class GossipManager extends Thread implements NotificationListen
* Shutdown the gossip service. * Shutdown the gossip service.
*/ */
public void shutdown() { public void shutdown() {
_gossipServiceRunning.set(false); gossipServiceRunning.set(false);
_gossipThreadExecutor.shutdown(); gossipThreadExecutor.shutdown();
if (passiveGossipThread != null){ if (passiveGossipThread != null) {
passiveGossipThread.shutdown(); passiveGossipThread.shutdown();
} }
if (activeGossipThread != null){ if (activeGossipThread != null) {
activeGossipThread.shutdown(); activeGossipThread.shutdown();
} }
try { try {
boolean result = _gossipThreadExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS); boolean result = gossipThreadExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);
if (!result){ if (!result) {
LOGGER.error("executor shutdown timed out"); LOGGER.error("executor shutdown timed out");
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {

View File

@ -47,38 +47,38 @@ abstract public class PassiveGossipThread implements Runnable {
public static final Logger LOGGER = Logger.getLogger(PassiveGossipThread.class); public static final Logger LOGGER = Logger.getLogger(PassiveGossipThread.class);
/** The socket used for the passive thread of the gossip service. */ /** The socket used for the passive thread of the gossip service. */
private DatagramSocket _server; private DatagramSocket server;
private final GossipManager _gossipManager; private final GossipManager gossipManager;
private AtomicBoolean _keepRunning; private AtomicBoolean keepRunning;
private final String _cluster; private final String cluster;
public PassiveGossipThread(GossipManager gossipManager) { public PassiveGossipThread(GossipManager gossipManager) {
_gossipManager = gossipManager; this.gossipManager = gossipManager;
try { try {
SocketAddress socketAddress = new InetSocketAddress(_gossipManager.getMyself().getHost(), SocketAddress socketAddress = new InetSocketAddress(gossipManager.getMyself().getHost(),
_gossipManager.getMyself().getPort()); gossipManager.getMyself().getPort());
_server = new DatagramSocket(socketAddress); server = new DatagramSocket(socketAddress);
GossipService.LOGGER.debug("Gossip service successfully initialized on port " GossipService.LOGGER.debug("Gossip service successfully initialized on port "
+ _gossipManager.getMyself().getPort()); + gossipManager.getMyself().getPort());
GossipService.LOGGER.debug("I am " + _gossipManager.getMyself()); GossipService.LOGGER.debug("I am " + gossipManager.getMyself());
_cluster = _gossipManager.getMyself().getClusterName(); cluster = gossipManager.getMyself().getClusterName();
} catch (SocketException ex) { } catch (SocketException ex) {
GossipService.LOGGER.warn(ex); GossipService.LOGGER.warn(ex);
throw new RuntimeException(ex); throw new RuntimeException(ex);
} }
_keepRunning = new AtomicBoolean(true); keepRunning = new AtomicBoolean(true);
} }
@Override @Override
public void run() { public void run() {
while (_keepRunning.get()) { while (keepRunning.get()) {
try { try {
byte[] buf = new byte[_server.getReceiveBufferSize()]; byte[] buf = new byte[server.getReceiveBufferSize()];
DatagramPacket p = new DatagramPacket(buf, buf.length); DatagramPacket p = new DatagramPacket(buf, buf.length);
_server.receive(p); server.receive(p);
int packet_length = 0; int packet_length = 0;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
int shift = (4 - 1 - i) * 8; int shift = (4 - 1 - i) * 8;
@ -98,7 +98,8 @@ abstract public class PassiveGossipThread implements Runnable {
JSONArray jsonArray = new JSONArray(receivedMessage); JSONArray jsonArray = new JSONArray(receivedMessage);
for (int i = 0; i < jsonArray.length(); i++) { for (int i = 0; i < jsonArray.length(); i++) {
JSONObject memberJSONObject = jsonArray.getJSONObject(i); JSONObject memberJSONObject = jsonArray.getJSONObject(i);
if (memberJSONObject.length() == 5 && _cluster.equals(memberJSONObject.get(GossipMember.JSON_CLUSTER))) { if (memberJSONObject.length() == 5
&& cluster.equals(memberJSONObject.get(GossipMember.JSON_CLUSTER))) {
RemoteGossipMember member = new RemoteGossipMember( RemoteGossipMember member = new RemoteGossipMember(
memberJSONObject.getString(GossipMember.JSON_CLUSTER), memberJSONObject.getString(GossipMember.JSON_CLUSTER),
memberJSONObject.getString(GossipMember.JSON_HOST), memberJSONObject.getString(GossipMember.JSON_HOST),
@ -112,7 +113,7 @@ abstract public class PassiveGossipThread implements Runnable {
senderMember = member; senderMember = member;
} }
remoteGossipMembers.add(member); remoteGossipMembers.add(member);
} else if(memberJSONObject.length() == 5) { } else if (memberJSONObject.length() == 5) {
GossipService.LOGGER.warn("The member object does not belong to this cluster."); GossipService.LOGGER.warn("The member object does not belong to this cluster.");
} else { } else {
GossipService.LOGGER GossipService.LOGGER
@ -121,7 +122,7 @@ abstract public class PassiveGossipThread implements Runnable {
} }
} }
mergeLists(_gossipManager, senderMember, remoteGossipMembers); mergeLists(gossipManager, senderMember, remoteGossipMembers);
} catch (JSONException e) { } catch (JSONException e) {
GossipService.LOGGER GossipService.LOGGER
.error("The received message is not well-formed JSON. The following message has been dropped:\n" .error("The received message is not well-formed JSON. The following message has been dropped:\n"
@ -137,7 +138,7 @@ abstract public class PassiveGossipThread implements Runnable {
} catch (IOException e) { } catch (IOException e) {
GossipService.LOGGER.error(e); GossipService.LOGGER.error(e);
System.out.println(e); System.out.println(e);
_keepRunning.set(false); keepRunning.set(false);
} }
} }
shutdown(); shutdown();
@ -145,13 +146,14 @@ abstract public class PassiveGossipThread implements Runnable {
public void shutdown() { public void shutdown() {
try { try {
_server.close(); server.close();
} catch (RuntimeException ex){ } } catch (RuntimeException ex) {
}
} }
/** /**
* Abstract method for merging the local and remote list. * Abstract method for merging the local and remote list.
* *
* @param gossipManager * @param gossipManager
* The GossipManager for retrieving the local members and dead members list. * The GossipManager for retrieving the local members and dead members list.
* @param senderMember * @param senderMember
@ -165,11 +167,9 @@ abstract public class PassiveGossipThread implements Runnable {
} }
/* /*
* random comments * random comments // Check whether the package is smaller than the maximal packet length. // A
* // Check whether the package is smaller than the maximal packet length. * package larger than this would not be possible to be send from a GossipService, // since this is
// A package larger than this would not be possible to be send from a GossipService, * check before sending the message. // This could normally only occur when the list of members is
// since this is check before sending the message. * very big, // or when the packet is malformed, and the first 4 bytes is not the right in anymore.
// This could normally only occur when the list of members is very big, * // For this reason we regards the message.
// or when the packet is malformed, and the first 4 bytes is not the right in anymore. */
// For this reason we regards the message.
* */

View File

@ -36,7 +36,7 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
* Merge remote list (received from peer), and our local member list. Simply, we must update the * Merge remote list (received from peer), and our local member list. Simply, we must update the
* heartbeats that the remote list has with our list. Also, some additional logic is needed to * heartbeats that the remote list has with our list. Also, some additional logic is needed to
* make sure we have not timed out a member and then immediately received a list with that member. * make sure we have not timed out a member and then immediately received a list with that member.
* *
* @param gossipManager * @param gossipManager
* @param senderMember * @param senderMember
* @param remoteList * @param remoteList
@ -44,13 +44,14 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
protected void mergeLists(GossipManager gossipManager, RemoteGossipMember senderMember, protected void mergeLists(GossipManager gossipManager, RemoteGossipMember senderMember,
List<GossipMember> remoteList) { List<GossipMember> remoteList) {
//if the person sending to us is in the dead list consider them up // if the person sending to us is in the dead list consider them up
for (LocalGossipMember i : gossipManager.getDeadList()){ for (LocalGossipMember i : gossipManager.getDeadList()) {
if (i.getId().equals(senderMember.getId())){ if (i.getId().equals(senderMember.getId())) {
System.out.println(gossipManager.getMyself() +" caught a live one!"); System.out.println(gossipManager.getMyself() + " caught a live one!");
LocalGossipMember newLocalMember = new LocalGossipMember(senderMember.getClusterName(), senderMember.getHost(), LocalGossipMember newLocalMember = new LocalGossipMember(senderMember.getClusterName(),
senderMember.getPort(), senderMember.getId(), senderMember.getHeartbeat(), senderMember.getHost(), senderMember.getPort(), senderMember.getId(),
gossipManager, gossipManager.getSettings().getCleanupInterval()); senderMember.getHeartbeat(), gossipManager, gossipManager.getSettings()
.getCleanupInterval());
gossipManager.revivieMember(newLocalMember); gossipManager.revivieMember(newLocalMember);
newLocalMember.startTimeoutTimer(); newLocalMember.startTimeoutTimer();
} }
@ -58,7 +59,7 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
for (GossipMember remoteMember : remoteList) { for (GossipMember remoteMember : remoteList) {
if (remoteMember.getId().equals(gossipManager.getMyself().getId())) { if (remoteMember.getId().equals(gossipManager.getMyself().getId())) {
continue; continue;
} }
if (gossipManager.getMemberList().contains(remoteMember)) { if (gossipManager.getMemberList().contains(remoteMember)) {
LocalGossipMember localMember = gossipManager.getMemberList().get( LocalGossipMember localMember = gossipManager.getMemberList().get(
gossipManager.getMemberList().indexOf(remoteMember)); gossipManager.getMemberList().indexOf(remoteMember));
@ -66,11 +67,12 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
localMember.setHeartbeat(remoteMember.getHeartbeat()); localMember.setHeartbeat(remoteMember.getHeartbeat());
localMember.resetTimeoutTimer(); localMember.resetTimeoutTimer();
} }
} else if (!gossipManager.getMemberList().contains(remoteMember) } else if (!gossipManager.getMemberList().contains(remoteMember)
&& !gossipManager.getDeadList().contains(remoteMember) ){ && !gossipManager.getDeadList().contains(remoteMember)) {
LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getClusterName(), remoteMember.getHost(), LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getClusterName(),
remoteMember.getPort(), remoteMember.getId(), remoteMember.getHeartbeat(), remoteMember.getHost(), remoteMember.getPort(), remoteMember.getId(),
gossipManager, gossipManager.getSettings().getCleanupInterval()); remoteMember.getHeartbeat(), gossipManager, gossipManager.getSettings()
.getCleanupInterval());
gossipManager.createOrRevivieMember(newLocalMember); gossipManager.createOrRevivieMember(newLocalMember);
newLocalMember.startTimeoutTimer(); newLocalMember.startTimeoutTimer();
} else { } else {
@ -78,9 +80,10 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
LocalGossipMember localDeadMember = gossipManager.getDeadList().get( LocalGossipMember localDeadMember = gossipManager.getDeadList().get(
gossipManager.getDeadList().indexOf(remoteMember)); gossipManager.getDeadList().indexOf(remoteMember));
if (remoteMember.getHeartbeat() > localDeadMember.getHeartbeat()) { if (remoteMember.getHeartbeat() > localDeadMember.getHeartbeat()) {
LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getClusterName(), remoteMember.getHost(), LocalGossipMember newLocalMember = new LocalGossipMember(remoteMember.getClusterName(),
remoteMember.getPort(), remoteMember.getId(), remoteMember.getHeartbeat(), remoteMember.getHost(), remoteMember.getPort(), remoteMember.getId(),
gossipManager, gossipManager.getSettings().getCleanupInterval()); remoteMember.getHeartbeat(), gossipManager, gossipManager.getSettings()
.getCleanupInterval());
gossipManager.revivieMember(newLocalMember); gossipManager.revivieMember(newLocalMember);
newLocalMember.startTimeoutTimer(); newLocalMember.startTimeoutTimer();
GossipService.LOGGER.debug("Removed remote member " + remoteMember.getAddress() GossipService.LOGGER.debug("Removed remote member " + remoteMember.getAddress()
@ -98,7 +101,7 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
GossipService.LOGGER.debug("remote " + remoteList); GossipService.LOGGER.debug("remote " + remoteList);
GossipService.LOGGER.debug("live " + gossipManager.getMemberList()); GossipService.LOGGER.debug("live " + gossipManager.getMemberList());
GossipService.LOGGER.debug("dead " + gossipManager.getDeadList()); GossipService.LOGGER.debug("dead " + gossipManager.getDeadList());
//throw new IllegalArgumentException("wtf"); // throw new IllegalArgumentException("wtf");
} }
} }
} }
@ -107,25 +110,19 @@ public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread
} }
/** /**
old comment section: * old comment section: // If a member is restarted the heartbeat will restart from 1, so we should
// If a member is restarted the heartbeat will restart from 1, so we should check * check // that here. // So a member can become from the dead when it is either larger than a
// that here. * previous // heartbeat (due to network failure) // or when the heartbeat is 1 (after a restart of
// So a member can become from the dead when it is either larger than a previous * the service). // TODO: What if the first message of a gossip service is sent to a dead node? The
// heartbeat (due to network failure) * // second member will receive a heartbeat of two. // TODO: The above does happen. Maybe a special
// or when the heartbeat is 1 (after a restart of the service). * message for a revived member? // TODO: Or maybe when a member is declared dead for more than //
// TODO: What if the first message of a gossip service is sent to a dead node? The * _settings.getCleanupInterval() ms, reset the heartbeat to 0. // It will then accept a revived
// second member will receive a heartbeat of two. * member. // The above is now handle by checking whether the heartbeat differs //
// TODO: The above does happen. Maybe a special message for a revived member? * _settings.getCleanupInterval(), it must be restarted.
// TODO: Or maybe when a member is declared dead for more than */
// _settings.getCleanupInterval() ms, reset the heartbeat to 0.
// It will then accept a revived member.
// The above is now handle by checking whether the heartbeat differs
// _settings.getCleanupInterval(), it must be restarted.
*/
/* /*
// The remote member is back from the dead. * // The remote member is back from the dead. // Remove it from the dead list. //
// Remove it from the dead list. * gossipManager.getDeadList().remove(localDeadMember); // Add it as a new member and add it to the
// gossipManager.getDeadList().remove(localDeadMember); * member list.
// Add it as a new member and add it to the member list. */
*/

View File

@ -47,8 +47,8 @@ abstract public class SendMembersActiveGossipThread extends ActiveGossipThread {
if (member == null) { if (member == null) {
return; return;
} }
try (DatagramSocket socket = new DatagramSocket()){ try (DatagramSocket socket = new DatagramSocket()) {
socket.setSoTimeout(_gossipManager.getSettings().getGossipInterval()); socket.setSoTimeout(gossipManager.getSettings().getGossipInterval());
InetAddress dest = InetAddress.getByName(member.getHost()); InetAddress dest = InetAddress.getByName(member.getHost());
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
jsonArray.put(me.toJSONObject()); jsonArray.put(me.toJSONObject());
@ -60,8 +60,7 @@ abstract public class SendMembersActiveGossipThread extends ActiveGossipThread {
int packet_length = json_bytes.length; int packet_length = json_bytes.length;
if (packet_length < GossipManager.MAX_PACKET_SIZE) { if (packet_length < GossipManager.MAX_PACKET_SIZE) {
byte[] buf = createBuffer(packet_length, json_bytes); byte[] buf = createBuffer(packet_length, json_bytes);
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, dest, DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, dest, member.getPort());
member.getPort());
socket.send(datagramPacket); socket.send(datagramPacket);
} else { } else {
GossipService.LOGGER.error("The length of the to be send message is too large (" GossipService.LOGGER.error("The length of the to be send message is too large ("
@ -71,8 +70,8 @@ abstract public class SendMembersActiveGossipThread extends ActiveGossipThread {
GossipService.LOGGER.warn(e1); GossipService.LOGGER.warn(e1);
} }
} }
private byte[] createBuffer(int packetLength, byte [] jsonBytes){ private byte[] createBuffer(int packetLength, byte[] jsonBytes) {
byte[] lengthBytes = new byte[4]; byte[] lengthBytes = new byte[4];
lengthBytes[0] = (byte) (packetLength >> 24); lengthBytes[0] = (byte) (packetLength >> 24);
lengthBytes[1] = (byte) ((packetLength << 8) >> 24); lengthBytes[1] = (byte) ((packetLength << 8) >> 24);
@ -84,5 +83,5 @@ abstract public class SendMembersActiveGossipThread extends ActiveGossipThread {
byte[] buf = byteBuffer.array(); byte[] buf = byteBuffer.array();
return buf; return buf;
} }
} }

View File

@ -28,23 +28,23 @@ import com.google.code.gossip.manager.impl.SendMembersActiveGossipThread;
public class RandomActiveGossipThread extends SendMembersActiveGossipThread { public class RandomActiveGossipThread extends SendMembersActiveGossipThread {
/** The Random used for choosing a member to gossip with. */ /** The Random used for choosing a member to gossip with. */
private final Random _random; private final Random random;
public RandomActiveGossipThread(GossipManager gossipManager) { public RandomActiveGossipThread(GossipManager gossipManager) {
super(gossipManager); super(gossipManager);
_random = new Random(); random = new Random();
} }
/** /**
* [The selectToSend() function.] Find a random peer from the local membership list. In the case * [The selectToSend() function.] Find a random peer from the local membership list. In the case
* where this client is the only member in the list, this method will return null. * where this client is the only member in the list, this method will return null.
* *
* @return Member random member if list is greater than 1, null otherwise * @return Member random member if list is greater than 1, null otherwise
*/ */
protected LocalGossipMember selectPartner(List<LocalGossipMember> memberList) { protected LocalGossipMember selectPartner(List<LocalGossipMember> memberList) {
LocalGossipMember member = null; LocalGossipMember member = null;
if (memberList.size() > 0) { if (memberList.size() > 0) {
int randomNeighborIndex = _random.nextInt(memberList.size()); int randomNeighborIndex = random.nextInt(memberList.size());
member = memberList.get(randomNeighborIndex); member = memberList.get(randomNeighborIndex);
} else { } else {
GossipService.LOGGER.debug("I am alone in this world."); GossipService.LOGGER.debug("I am alone in this world.");

View File

@ -26,9 +26,9 @@ import com.google.code.gossip.manager.impl.OnlyProcessReceivedPassiveGossipThrea
import java.util.List; import java.util.List;
public class RandomGossipManager extends GossipManager { public class RandomGossipManager extends GossipManager {
public RandomGossipManager(String cluster, String address, int port, String id, GossipSettings settings, public RandomGossipManager(String cluster, String address, int port, String id,
List<GossipMember> gossipMembers, GossipListener listener) { GossipSettings settings, List<GossipMember> gossipMembers, GossipListener listener) {
super(OnlyProcessReceivedPassiveGossipThread.class, RandomActiveGossipThread.class, cluster, address, super(OnlyProcessReceivedPassiveGossipThread.class, RandomActiveGossipThread.class, cluster,
port, id, settings, gossipMembers, listener); address, port, id, settings, gossipMembers, listener);
} }
} }