You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ma...@apache.org on 2010/08/19 23:25:22 UTC

svn commit: r987314 [8/16] - in /hadoop/zookeeper/trunk: ./ src/contrib/hedwig/ src/contrib/hedwig/client/ src/contrib/hedwig/client/src/ src/contrib/hedwig/client/src/main/ src/contrib/hedwig/client/src/main/cpp/ src/contrib/hedwig/client/src/main/cpp...

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/formatter.xml
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/formatter.xml?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/formatter.xml (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/formatter.xml Thu Aug 19 21:25:13 2010
@@ -0,0 +1,286 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="11">
+<profile kind="CodeFormatterProfile" name="Hedwig" version="11">
+<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_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.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.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="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.5"/>
+<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.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
+<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.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+<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.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.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_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.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.insert_space_before_closing_paren_in_method_invocation" 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_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<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="false"/>
+<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.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.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<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.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_after_comma_in_superinterfaces" 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_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_after_opening_paren_in_if" 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.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.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.5"/>
+<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_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.put_empty_statement_on_new_line" value="true"/>
+<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.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.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<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.5"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member" value="insert"/>
+<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.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_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>

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/pom.xml
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/pom.xml?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/pom.xml (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/pom.xml Thu Aug 19 21:25:13 2010
@@ -0,0 +1,68 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.hedwig</groupId>
+  <version>1.0-SNAPSHOT</version>
+  <artifactId>hedwig</artifactId>
+  <packaging>pom</packaging>
+  <name>hedwig</name>
+  <modules>
+    <module>client</module>
+    <module>server</module>
+    <module>protocol</module>
+  </modules>
+  <repositories>
+  </repositories>
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jxr-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>findbugs-maven-plugin</artifactId>
+        <version>2.1</version>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <version>2.3</version>
+        <configuration>
+          <linkXref>true</linkXref>
+          <targetJdk>1.6</targetJdk>
+        </configuration>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/Makefile
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/Makefile?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/Makefile (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/Makefile Thu Aug 19 21:25:13 2010
@@ -0,0 +1,26 @@
+TARGET_DIR = target/generated-sources/cpp
+PROTO_DIR = src/main/protobuf
+
+INCLUDES = -I$(TARGET_DIR) 
+
+CXX = g++
+CXXFLAGS = -g $(INCLUDES)
+
+#-----File Dependencies----------------------
+PROTO = PubSubProtocol.proto
+SRC = $(TARGET_DIR)/$/$(PROTO_DIR)/$(addsuffix .pb.cc, $(basename $(PROTO)))
+OBJ = $(addsuffix .o, $(basename $(SRC)))
+
+all: $(OBJ)
+
+$(SRC):
+	mkdir -p $(TARGET_DIR); protoc --cpp_out=$(TARGET_DIR) $(PROTO_DIR)/$(PROTO)
+
+$(OBJ): $(SRC)
+	$(CXX) $(CXXFLAGS) -c $< -o $(OBJ)
+
+
+clean:
+	rm -rf $(TARGET_DIR)
+
+

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/pom.xml
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/pom.xml?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/pom.xml (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/pom.xml Thu Aug 19 21:25:13 2010
@@ -0,0 +1,77 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.hedwig</groupId>
+    <artifactId>hedwig</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <groupId>org.apache.hedwig</groupId>
+  <artifactId>protocol</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>protocol</name>
+  <url>http://maven.apache.org</url>
+  <dependencies>
+    <dependency>
+      <groupId>com.google.protobuf</groupId>
+      <artifactId>protobuf-java</artifactId>
+      <version>2.3.0</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <repositories>
+  </repositories>
+  <build>
+    <defaultGoal>install</defaultGoal>
+    <plugins>
+      <plugin>
+        <artifactId>maven-antrun-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>generate-sources</id>
+            <phase>generate-sources</phase>
+            <configuration>
+              <tasks>
+                <mkdir dir="target/generated-sources/java" />
+                <mkdir dir="target/generated-sources/cpp" />
+                <exec executable="protoc" failonerror="true">
+                  <arg value="--java_out=target/generated-sources/java" />
+                  <arg value="--cpp_out=target/generated-sources/cpp" />
+                  <arg value="src/main/protobuf/PubSubProtocol.proto" />
+                </exec>
+              </tasks>
+              <sourceRoot>target/generated-sources/java</sourceRoot>
+            </configuration>
+            <goals>
+              <goal>run</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/exceptions/PubSubException.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/exceptions/PubSubException.java?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/exceptions/PubSubException.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/exceptions/PubSubException.java Thu Aug 19 21:25:13 2010
@@ -0,0 +1,162 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hedwig.exceptions;
+
+import java.util.Collection;
+
+import org.apache.hedwig.protocol.PubSubProtocol.StatusCode;
+
+@SuppressWarnings("serial")
+public abstract class PubSubException extends Exception {
+    protected StatusCode code;
+
+    protected PubSubException(StatusCode code, String msg) {
+        super(msg);
+        this.code = code;
+    }
+
+    protected PubSubException(StatusCode code, Exception e) {
+        super(e);
+        this.code = code;
+    }
+
+    public static PubSubException create(StatusCode code, String msg) {
+        if (code == StatusCode.CLIENT_ALREADY_SUBSCRIBED) {
+            return new ClientAlreadySubscribedException(msg);
+        } else if (code == StatusCode.CLIENT_NOT_SUBSCRIBED) {
+            return new ClientNotSubscribedException(msg);
+        } else if (code == StatusCode.MALFORMED_REQUEST) {
+            return new MalformedRequestException(msg);
+        } else if (code == StatusCode.NO_SUCH_TOPIC) {
+            return new NoSuchTopicException(msg);
+        } else if (code == StatusCode.NOT_RESPONSIBLE_FOR_TOPIC) {
+            return new ServerNotResponsibleForTopicException(msg);
+        } else if (code == StatusCode.SERVICE_DOWN) {
+            return new ServiceDownException(msg);
+        } else if (code == StatusCode.COULD_NOT_CONNECT) {
+            return new CouldNotConnectException(msg);
+        }
+        /*
+         * Insert new ones here
+         */
+        else if (code == StatusCode.UNCERTAIN_STATE) {
+            return new UncertainStateException(msg);
+        }
+        // Finally the catch all exception (for unexpected error conditions)
+        else {
+            return new UnexpectedConditionException("Unknow status code:" + code.getNumber() + ", msg: " + msg);
+        }
+    }
+
+    public StatusCode getCode() {
+        return code;
+    }
+
+    public static class ClientAlreadySubscribedException extends PubSubException {
+        public ClientAlreadySubscribedException(String msg) {
+            super(StatusCode.CLIENT_ALREADY_SUBSCRIBED, msg);
+        }
+    }
+
+    public static class ClientNotSubscribedException extends PubSubException {
+        public ClientNotSubscribedException(String msg) {
+            super(StatusCode.CLIENT_NOT_SUBSCRIBED, msg);
+        }
+    }
+
+    public static class MalformedRequestException extends PubSubException {
+        public MalformedRequestException(String msg) {
+            super(StatusCode.MALFORMED_REQUEST, msg);
+        }
+    }
+
+    public static class NoSuchTopicException extends PubSubException {
+        public NoSuchTopicException(String msg) {
+            super(StatusCode.NO_SUCH_TOPIC, msg);
+        }
+    }
+
+    public static class ServerNotResponsibleForTopicException extends PubSubException {
+        // Note the exception message serves as the name of the responsible host
+        public ServerNotResponsibleForTopicException(String responsibleHost) {
+            super(StatusCode.NOT_RESPONSIBLE_FOR_TOPIC, responsibleHost);
+        }
+    }
+
+    public static class TopicBusyException extends PubSubException {
+        public TopicBusyException(String msg) {
+            super(StatusCode.TOPIC_BUSY, msg);
+        }
+    }
+
+    public static class ServiceDownException extends PubSubException {
+        public ServiceDownException(String msg) {
+            super(StatusCode.SERVICE_DOWN, msg);
+        }
+
+        public ServiceDownException(Exception e) {
+            super(StatusCode.SERVICE_DOWN, e);
+        }
+    }
+
+    public static class CouldNotConnectException extends PubSubException {
+        public CouldNotConnectException(String msg) {
+            super(StatusCode.COULD_NOT_CONNECT, msg);
+        }
+    }
+
+    /*
+     * Insert new ones here
+     */
+    public static class UncertainStateException extends PubSubException {
+        public UncertainStateException(String msg) {
+            super(StatusCode.UNCERTAIN_STATE, msg);
+        }
+    }
+
+    // The catch all exception (for unexpected error conditions)
+    public static class UnexpectedConditionException extends PubSubException {
+        public UnexpectedConditionException(String msg) {
+            super(StatusCode.UNEXPECTED_CONDITION, msg);
+        }
+    }
+    
+    // The composite exception (for concurrent operations).
+    public static class CompositeException extends PubSubException {
+        private final Collection<PubSubException> exceptions;
+        public CompositeException(Collection<PubSubException> exceptions) {
+            super(StatusCode.COMPOSITE, "composite exception");
+            this.exceptions = exceptions;
+        }
+        public Collection<PubSubException> getExceptions() {
+            return exceptions;
+        }
+        @Override
+        public String toString() {
+            StringBuilder builder = new StringBuilder();
+            builder.append(super.toString()).append('\n');
+            for (PubSubException exception : exceptions)
+                builder.append(exception).append('\n');
+            return builder.toString();
+        }
+    }
+
+    public static class ClientNotSubscribedRuntimeException extends RuntimeException {
+    }
+
+}

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/MessageIdUtils.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/MessageIdUtils.java?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/MessageIdUtils.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/MessageIdUtils.java Thu Aug 19 21:25:13 2010
@@ -0,0 +1,153 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hedwig.protoextensions;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.google.protobuf.ByteString;
+import org.apache.hedwig.protocol.PubSubProtocol.Message;
+import org.apache.hedwig.exceptions.PubSubException.UnexpectedConditionException;
+import org.apache.hedwig.protocol.PubSubProtocol.MessageSeqId;
+import org.apache.hedwig.protocol.PubSubProtocol.RegionSpecificSeqId;
+
+public class MessageIdUtils {
+
+    public static String msgIdToReadableString(MessageSeqId seqId) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("local:");
+        sb.append(seqId.getLocalComponent());
+
+        String separator = ";";
+        for (RegionSpecificSeqId regionId : seqId.getRemoteComponentsList()) {
+            sb.append(separator);
+            sb.append(regionId.getRegion().toStringUtf8());
+            sb.append(':');
+            sb.append(regionId.getSeqId());
+        }
+        return sb.toString();
+    }
+
+    public static Map<ByteString, RegionSpecificSeqId> inMapForm(MessageSeqId msi) {
+        Map<ByteString, RegionSpecificSeqId> map = new HashMap<ByteString, RegionSpecificSeqId>();
+
+        for (RegionSpecificSeqId lmsid : msi.getRemoteComponentsList()) {
+            map.put(lmsid.getRegion(), lmsid);
+        }
+
+        return map;
+    }
+
+    public static boolean areEqual(MessageSeqId m1, MessageSeqId m2) {
+
+        if (m1.getLocalComponent() != m2.getLocalComponent()) {
+            return false;
+        }
+
+        if (m1.getRemoteComponentsCount() != m2.getRemoteComponentsCount()) {
+            return false;
+        }
+
+        Map<ByteString, RegionSpecificSeqId> m2map = inMapForm(m2);
+
+        for (RegionSpecificSeqId lmsid1 : m1.getRemoteComponentsList()) {
+            RegionSpecificSeqId lmsid2 = m2map.get(lmsid1.getRegion());
+            if (lmsid2 == null) {
+                return false;
+            }
+            if (lmsid1.getSeqId() != lmsid2.getSeqId()) {
+                return false;
+            }
+        }
+
+        return true;
+
+    }
+
+    public static Message mergeLocalSeqId(Message.Builder messageBuilder, long localSeqId) {
+        MessageSeqId.Builder msidBuilder = MessageSeqId.newBuilder(messageBuilder.getMsgId());
+        msidBuilder.setLocalComponent(localSeqId);
+        messageBuilder.setMsgId(msidBuilder);
+        return messageBuilder.build();
+    }
+
+    public static Message mergeLocalSeqId(Message orginalMessage, long localSeqId) {
+        return mergeLocalSeqId(Message.newBuilder(orginalMessage), localSeqId);
+    }
+
+    /**
+     * Compares two seq numbers represented as lists of longs.
+     * 
+     * @param l1
+     * @param l2
+     * @return 1 if the l1 is greater, 0 if they are equal, -1 if l2 is greater
+     * @throws UnexpectedConditionException
+     *             If the lists are of unequal length
+     */
+    public static int compare(List<Long> l1, List<Long> l2) throws UnexpectedConditionException {
+        if (l1.size() != l2.size()) {
+            throw new UnexpectedConditionException("Seq-ids being compared have different sizes: " + l1.size()
+                    + " and " + l2.size());
+        }
+
+        for (int i = 0; i < l1.size(); i++) {
+            long v1 = l1.get(i);
+            long v2 = l2.get(i);
+
+            if (v1 == v2) {
+                continue;
+            }
+
+            return v1 > v2 ? 1 : -1;
+        }
+
+        // All components equal
+        return 0;
+    }
+
+    /**
+     * Returns the element-wise vector maximum of the two vectors id1 and id2,
+     * if we imagine them to be sparse representations of vectors.
+     */
+    public static void takeRegionMaximum(MessageSeqId.Builder newIdBuilder, MessageSeqId id1, MessageSeqId id2) {
+        Map<ByteString, RegionSpecificSeqId> id2Map = MessageIdUtils.inMapForm(id2);
+
+        for (RegionSpecificSeqId rrsid1 : id1.getRemoteComponentsList()) {
+            ByteString region = rrsid1.getRegion();
+
+            RegionSpecificSeqId rssid2 = id2Map.get(region);
+
+            if (rssid2 == null) {
+                newIdBuilder.addRemoteComponents(rrsid1);
+                continue;
+            }
+
+            newIdBuilder.addRemoteComponents((rrsid1.getSeqId() > rssid2.getSeqId()) ? rrsid1 : rssid2);
+
+            // remove from map
+            id2Map.remove(region);
+        }
+
+        // now take the remaining components in the map and add them
+        for (RegionSpecificSeqId rssid2 : id2Map.values()) {
+            newIdBuilder.addRemoteComponents(rssid2);
+        }
+
+    }
+}

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/PubSubResponseUtils.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/PubSubResponseUtils.java?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/PubSubResponseUtils.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/PubSubResponseUtils.java Thu Aug 19 21:25:13 2010
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hedwig.protoextensions;
+
+import org.apache.hedwig.exceptions.PubSubException;
+import org.apache.hedwig.protocol.PubSubProtocol.ProtocolVersion;
+import org.apache.hedwig.protocol.PubSubProtocol.PubSubResponse;
+import org.apache.hedwig.protocol.PubSubProtocol.StatusCode;
+
+public class PubSubResponseUtils {
+
+    /**
+     * Change here if bumping up the version number that the server sends back
+     */
+    protected static ProtocolVersion serverVersion = ProtocolVersion.VERSION_ONE;
+
+    static PubSubResponse.Builder getBasicBuilder(StatusCode status) {
+        return PubSubResponse.newBuilder().setProtocolVersion(serverVersion).setStatusCode(status);
+    }
+
+    public static PubSubResponse getSuccessResponse(long txnId) {
+        return getBasicBuilder(StatusCode.SUCCESS).setTxnId(txnId).build();
+    }
+
+    public static PubSubResponse getResponseForException(PubSubException e, long txnId) {
+        return getBasicBuilder(e.getCode()).setStatusMsg(e.getMessage()).setTxnId(txnId).build();
+    }
+}

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/SubscriptionStateUtils.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/SubscriptionStateUtils.java?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/SubscriptionStateUtils.java (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/java/org/apache/hedwig/protoextensions/SubscriptionStateUtils.java Thu Aug 19 21:25:13 2010
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hedwig.protoextensions;
+
+import com.google.protobuf.ByteString;
+import org.apache.hedwig.protocol.PubSubProtocol.SubscriptionState;
+
+public class SubscriptionStateUtils {
+
+    // For now, to differentiate hub subscribers from local ones, the
+    // subscriberId will be prepended with a hard-coded prefix. Local
+    // subscribers will validate that the subscriberId used cannot start with
+    // this prefix. This is only used internally by the hub subscribers.
+    public static final String HUB_SUBSCRIBER_PREFIX = "__";
+
+    public static String toString(SubscriptionState state) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("consumeSeqId: " + MessageIdUtils.msgIdToReadableString(state.getMsgId()));
+        return sb.toString();
+    }
+
+    public static boolean isHubSubscriber(ByteString subscriberId) {
+        return subscriberId.toStringUtf8().startsWith(HUB_SUBSCRIBER_PREFIX);
+    }
+    
+}

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/protobuf/PubSubProtocol.proto
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/protobuf/PubSubProtocol.proto?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/protobuf/PubSubProtocol.proto (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/protocol/src/main/protobuf/PubSubProtocol.proto Thu Aug 19 21:25:13 2010
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+option java_package = "org.apache.hedwig.protocol";
+option optimize_for = SPEED;
+package Hedwig; 
+
+enum ProtocolVersion{
+    VERSION_ONE = 1;
+}
+
+/*
+ * this is the structure that will be serialized
+ */
+message Message {
+    required bytes body = 1;
+    optional bytes srcRegion = 2;
+    optional MessageSeqId msgId = 3;
+}
+
+message RegionSpecificSeqId {
+    required bytes region = 1;
+    required uint64 seqId = 2;
+}
+    
+message MessageSeqId{
+    optional uint64 localComponent = 1;
+    repeated RegionSpecificSeqId remoteComponents = 2;    
+}
+
+enum OperationType{
+    PUBLISH = 0;
+    SUBSCRIBE = 1;
+    CONSUME = 2;
+    UNSUBSCRIBE = 3;
+    
+    //the following two are only used for the hedwig proxy
+    START_DELIVERY = 4;
+    STOP_DELIVERY = 5;
+}
+
+/* A PubSubRequest is just a union of the various request types, with
+ * an enum telling us which type it is. The same can also be done through 
+ * extensions. We need one request type that we will deserialize into on 
+ * the server side.
+ */
+message PubSubRequest{
+    
+    required ProtocolVersion protocolVersion = 1;
+    required OperationType type = 2;
+    repeated bytes triedServers = 3;
+    required uint64 txnId = 4;
+    optional bool shouldClaim = 5;
+    required bytes topic = 6;
+    //any authentication stuff and other general stuff here
+    
+    
+    /* one entry for each type of request */
+    optional PublishRequest publishRequest = 52; 
+    optional SubscribeRequest subscribeRequest = 53;
+    optional ConsumeRequest consumeRequest = 54;
+    optional UnsubscribeRequest unsubscribeRequest = 55;
+    optional StopDeliveryRequest stopDeliveryRequest = 56;
+    optional StartDeliveryRequest startDeliveryRequest = 57;
+}
+
+
+
+message PublishRequest{
+    required Message msg = 2;
+}
+
+message SubscribeRequest{
+    required bytes subscriberId = 2;
+	
+	enum CreateOrAttach{
+	    CREATE = 0;
+	    ATTACH = 1;
+	    CREATE_OR_ATTACH = 2;
+	};
+	optional CreateOrAttach createOrAttach = 3 [default = CREATE_OR_ATTACH];
+	
+	// wait for cross-regional subscriptions to be established before returning
+	optional bool synchronous = 4 [default = false];
+}
+
+message ConsumeRequest{
+    required bytes subscriberId = 2;    
+    required MessageSeqId msgId = 3;
+    //the msgId is cumulative: all messages up to this id are marked as consumed
+}
+
+message UnsubscribeRequest{
+    required bytes subscriberId = 2;
+}
+
+
+message StopDeliveryRequest{
+    required bytes subscriberId = 2;
+}
+
+message StartDeliveryRequest{
+    required bytes subscriberId = 2;
+}
+
+message PubSubResponse{
+    required ProtocolVersion protocolVersion = 1;
+    required StatusCode statusCode = 2;
+    required uint64 txnId = 3;
+    
+    
+    optional string statusMsg = 4;
+    //in case of a status code of NOT_RESPONSIBLE_FOR_TOPIC, the status
+    //message will contain the name of the host actually responsible 
+    //for the topic
+    
+    //the following fields are sent in delivered messages
+    optional Message message = 5;
+    optional bytes topic = 6;
+    optional bytes subscriberId = 7;
+}
+
+
+enum StatusCode{
+    SUCCESS = 0;
+    
+    //client-side errors (4xx)
+    MALFORMED_REQUEST = 401;
+    NO_SUCH_TOPIC = 402;
+    CLIENT_ALREADY_SUBSCRIBED = 403;
+    CLIENT_NOT_SUBSCRIBED = 404;
+    COULD_NOT_CONNECT = 405;
+    TOPIC_BUSY = 406;
+    
+    //server-side errors (5xx)
+    NOT_RESPONSIBLE_FOR_TOPIC = 501;
+    SERVICE_DOWN = 502;
+    UNCERTAIN_STATE = 503;
+    
+    //For all unexpected error conditions
+    UNEXPECTED_CONDITION = 600;
+    
+    COMPOSITE = 700;
+}
+  
+//What follows is not the server client protocol, but server-internal structures that are serialized in ZK  
+//They should eventually be moved into the server 
+    
+message SubscriptionState {
+    required MessageSeqId msgId = 1;
+}
+
+message LedgerRange{
+    required uint64 ledgerId = 1;
+    optional MessageSeqId endSeqIdIncluded = 2;
+}
+
+message LedgerRanges{
+    repeated LedgerRange ranges = 1;
+}
+

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/scripts/README.txt
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/scripts/README.txt?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/scripts/README.txt (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/scripts/README.txt Thu Aug 19 21:25:13 2010
@@ -0,0 +1,39 @@
+To start up a Hedwig server, you can make use of the scripts in this directory.
+The hw.bash script is used to setup a Hedwig region cluster on remote boxes.
+It contains methods that allow the user to start up a ZooKeeper server
+(currently only a single quorum) and also any number of Bookkeeper servers.
+It can also startup any number of Hedwig server hubs that point to this
+ZooKeeper/Bookkeeper setup.
+
+To simplify and generalize things, the hwServer.sh script is used to start
+up a single Hedwig server hub on the current local machine. It assumes that
+the ZooKeeper and Bookkeeper servers are setup and running already. The order
+of operations prior to starting up the Hedwig server hub(s) is:
+
+1. Startup a quorum of ZooKeeper servers (could be a single one).
+2. Using a ZooKeeper client to connect to the servers, create the following 
+ZK nodes to be used by Bookkeeper as directory path nodes.
+	/ledgers and /ledgers/available
+3. Startup Bookkeeper servers pointing them to this ZooKeeper quorum.
+4. For each machine you want to run a Hedwig server hub on, the Hedwig code
+needs to be there. Compile/build it from the top level with the command: 
+	mvn install -Dmaven.test.skip=true
+In the server/target directory, this creates the following fat jar that
+contains all dependencies the Hedwig server needs to run:
+	server-1.0-SNAPSHOT-jar-with-dependencies.jar
+5. Define your Hedwig server configuration before you start the server. The
+default location and file for this is: 
+	conf/hw_server.conf
+However, you can override this by setting the appropriate environment
+variables or passing in your config file directly when invoking the
+hwServer.sh script. A sample config file is available for you at:
+	conf/hw_server_sample.conf
+The important config parameter is the "zk_host" one which will point the
+Hedwig server hub to the ZooKeeper quorum which manages and coordinates all of
+the hubs.
+6. Run the hwServer.sh script to start up the server:
+	scripts/hwServer.sh start
+OR	scripts/hwServer.sh start <path to your Hedwig server config file>
+7. Stop or restart the Hedwig server hub using the following commands:
+	scripts/hwServer.sh stop
+	scripts/hwServer.sh restart

Added: hadoop/zookeeper/trunk/src/contrib/hedwig/scripts/analyze.py
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/hedwig/scripts/analyze.py?rev=987314&view=auto
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/hedwig/scripts/analyze.py (added)
+++ hadoop/zookeeper/trunk/src/contrib/hedwig/scripts/analyze.py Thu Aug 19 21:25:13 2010
@@ -0,0 +1,201 @@
+#!/usr/bin/env python
+
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+from __future__ import with_statement
+import sys, os, glob, re, collections, math, subprocess, unittest
+from numpy import *
+from commons import seqs, startup, strs, structs
+import cairo
+from pycha.bar import *
+
+def sub():
+
+  #
+  # Parse/aggregate.
+  #
+
+  tputs = collections.defaultdict(list)
+  lats = collections.defaultdict(list)
+  for fname in glob.glob('sync-*-count-*-npar-*-rep-*.out'):
+    m = re.match(r'sync-(\d+)-count-(\d+)-npar-(\d+)-rep-(\d+)\.out', fname)
+    sync, count, npar, rep = map(int, m.groups())
+    with file(fname) as f:
+      m = re.search(r'finished subs, tput = ([\d\.]+) ops/s, avg latency = (\d+)', f.readlines()[-2])
+      tput, lat = map(float, m.groups())
+    tputs[sync, count, npar].append(tput)
+    lats[sync, count, npar].append(lat)
+  for d in tputs, lats:
+    for k in d:
+      d[k] = array(d[k]).mean(), array(d[k]).std()
+      print k, d[k]
+
+  #
+  # Plot.
+  #
+
+  for title, ylabel, fname, d in [ ('Subscription throughput over three trials', 'Subscriptions per second', 'tput', tputs),
+                                   ('Subscription latency over three trials', 'Round-trip time in ms', 'lat', lats) ]:
+    means = dict((k, v[0]) for k,v in d.iteritems())
+    sdevs = dict((k, v[1]) for k,v in d.iteritems())
+
+    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 400)
+    syncs, counts, npars = [ sorted(set(x[i] for x in means))
+                                for i in xrange(3) ]
+    print syncs, counts, npars
+    dataset = [ ( '%d topics, %s' %
+                    ( count, 'synchronous' if sync else 'asynchronous' ),
+                  [ ( npar/10, means[sync, count, npar], sdevs[sync, count, npar] )
+                    for npar in npars ] )
+                for count in counts
+                for sync in syncs ]
+    options = {'legend.position':
+                {'top': None, 'left': None, 'bottom': 100, 'right': 20},
+               'axis.x.ticks': [{'v': x, 'label': max(1,10*x)}
+                                for i,(x,y,e) in enumerate(dataset[0][1])],
+               'axis.x.label': 'Number of outstanding subscription requests',
+               'axis.y.label': ylabel,
+               'padding.left': 50,
+               'title': title,
+               'background.color': '#f0f0f0'}
+    chart = VerticalBarChart(surface, structs.sparse_dict(options))
+    chart.addDataset(dataset)
+    chart.render()
+    surface.write_to_png(fname + '.png')
+
+def pub():
+
+  def helper(do_pubs):
+
+    def subhelper(keyname, pat, xlabel):
+
+      #
+      # Parse/aggregate.
+      #
+
+      print 'Analyzing', keyname, 'for', 'publishers' if do_pubs else 'receivers'
+      print '========================'
+      print
+
+      tputs = collections.defaultdict(list)
+      lats = collections.defaultdict(list)
+      fnames = [ ( fname, tuple(map(int, m.groups())) )
+                 for fname, m in filter( lambda m: m[1] is not None,
+                                         ( ( fname, re.match(pat, fname) )
+                                           for fname in os.listdir('.') ) ) ]
+      tup2fname = dict( (tup, fname) for fname, tup in fnames )
+      keys, reps, nodes = map(lambda xs: sorted(set(xs)),
+                              zip(*(tup for fname, tup in fnames)))
+
+      raw_table = []
+      print '== raw data =='
+      raw_table.append( [ keyname, 'rep', 'node', 'tput' ] + ( ['lat'] if do_pubs else [] ) + ['sum/mean tput', 'mean lat'] )
+      for key in keys:
+        for rep in reps:
+          tmptputs = []
+          tmplats = []
+          for node in nodes:
+            if (key, rep, node) in tup2fname:
+              with file(tup2fname[key, rep, node]) as f:
+                try:
+                  if do_pubs:
+                    m = re.search(r'finished acked pubs, tput = ([\d\.]+) ops/s, avg latency = (\d+)', f.readlines()[-2])
+                    tput, lat = map(float, m.groups())
+                  else:
+                    m = re.search(r'finished recvs, tput = ([\d\.]+) ops/s', f.read())
+                    [tput] = map(float, m.groups())
+                except AttributeError:
+                  print >> sys.stderr, "While processing", tup2fname[key, rep, node]
+                  raise
+              raw_table.append( [ key, rep, node, tput ] + ( [lat] if do_pubs else [] ) + ['',''] )
+              tmptputs.append(tput)
+              if do_pubs: tmplats.append(lat)
+          if keyname == 'npubs': tputs[key].append(sum(tmptputs))
+          else: tputs[key].append(array(tmptputs).mean())
+          if do_pubs: lats[key].append(array(tmplats).mean())
+          if len(nodes) > 1:
+            raw_table.append( [''] * (len(raw_table[0]) - 2) + [tputs[key][-1]] + ( [lats[key][-1]] if do_pubs else [] ) )
+      print strs.show_table_by_rows(raw_table)
+      print
+
+      print '== aggregated over reps =='
+      agg_table = []
+      agg_table.append( ( keyname, 'mean', 'sd' ) )
+      for d in tputs, lats:
+        for k in d:
+          d[k] = array(d[k]).mean(), array(d[k]).std()
+          agg_table.append( ( k, d[k][0], d[k][1] ) )
+      print strs.show_table_by_rows(agg_table)
+      print
+
+      #
+      # Plot.
+      #
+
+      if do_pubs:
+        plots = [ ('Publishing throughput over three trials', 'Publishes per second', '%s-pub-tput' % keyname, tputs),
+                  ('Publishing latency over three trials', 'Round-trip time in ms', '%s-pub-lat' % keyname, lats) ]
+      else:
+        plots = [ ('Receiving throughput over three trials', 'Receives per second', '%s-recv-tput' % keyname, tputs) ]
+      for title, ylabel, fname, d in plots:
+        means = dict((k, v[0]) for k,v in d.iteritems())
+        sdevs = dict((k, v[1]) for k,v in d.iteritems())
+
+        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 400)
+        dataset = [ ( 'main',
+                      [ ( i, means[key], sdevs[key] )
+                        for i, key in enumerate(keys) ] ) ]
+        options = {'legend.position':
+                    {'top': None, 'left': None, 'bottom': 100, 'right': 20},
+                   'axis.x.ticks': [{'v': x, 'label': k}
+                                    for k,(x,y,e) in zip(keys, dataset[0][1])],
+                   'axis.x.label': xlabel,
+                   'axis.y.label': ylabel,
+                   'padding.left': 50,
+                   'title': title,
+                   'background.color': '#f0f0f0'}
+        chart = VerticalBarChart(surface, structs.sparse_dict(options))
+        chart.addDataset(dataset)
+        chart.render()
+        surface.write_to_png(fname + '.png')
+
+      print
+      print
+      print
+
+    nodetype = 'pub' if do_pubs else 'recv'
+    mode_npar = seqs.mode(
+        int(m.group(1)) for m in
+        [re.search('npar-(\d+)', fname) for fname in os.listdir('.')]
+        if m is not None )
+    subhelper('nrecvs', 'nrecvs-(\d+)-npubs-1-npar-%s-rep-(\d+)-%s-(\d+)' % (mode_npar, nodetype),
+              'Number of receivers')
+    subhelper('npubs', 'nrecvs-1-npubs-(\d+)-npar-%s-rep-(\d+)-%s-(\d+)' % (mode_npar, nodetype),
+              'Number of publishers')
+    subhelper('npar', 'nrecvs-1-npubs-1-npar-(\d+)-rep-(\d+)-%s-(0)' % nodetype,
+              'Number of outstanding publish requests')
+
+  helper(True)
+  helper(False)
+
+def main(argv):
+  if argv[1] == 'sub': sub()
+  elif argv[1] == 'pub': pub()
+  else: return unittest.main()
+
+startup.run_main()
+
+# vim: et sw=2 ts=2

Propchange: hadoop/zookeeper/trunk/src/contrib/hedwig/scripts/analyze.py
------------------------------------------------------------------------------
    svn:executable = *