From e732f4a42dba36cc9e3e35b547df454ef71cc42f Mon Sep 17 00:00:00 2001 From: Christian Wulf <chw@informatik.uni-kiel.de> Date: Fri, 6 Jun 2014 12:58:23 +0200 Subject: [PATCH] added checkstyle config file; refactored package structure; added correct and improved stage state management --- .checkstyle | 7 +- .classpath | 1 + .settings/org.eclipse.jdt.core.prefs | 284 ++++ .settings/org.eclipse.jdt.ui.prefs | 60 + conf/cs-conf.xml | 1236 +++++++++++++++++ results/evaluation.xlsx | Bin 10467 -> 10656 bytes .../ConcurrentCountWordsAnalysis.java | 126 +- .../countWords/CountWordsAnalysis.java | 37 +- .../countWords/QueuedCountWordsAnalysis.java | 37 +- .../concurrent/StageWorkArrayList.java | 77 +- .../framework/concurrent/WorkerThread.java | 121 +- .../steal/StealIfMayBeDisabledStrategy.java | 44 - .../framework/core/AbstractFilter.java | 59 +- .../teetime/framework/core/AbstractPipe.java | 19 +- .../teetime/framework/core/IInputPort.java | 14 +- .../teetime/framework/core/IPortListener.java | 6 +- .../java/teetime/framework/core/IStage.java | 13 - .../teetime/framework/core/InputPortImpl.java | 21 +- .../NextStageScheduler.java | 35 +- .../scheduling/StageStateContainer.java | 25 + .../scheduling/StageStateManager.java | 84 ++ .../SynchronizedStageStateContainer.java | 21 + .../UnsynchronizedStageStateContainer.java | 19 + .../ThroughputTimestampAnalysisTest.java | 4 +- 24 files changed, 1950 insertions(+), 400 deletions(-) create mode 100644 .settings/org.eclipse.jdt.ui.prefs create mode 100644 conf/cs-conf.xml delete mode 100644 src/main/java/teetime/framework/concurrent/steal/StealIfMayBeDisabledStrategy.java rename src/main/java/teetime/framework/{concurrent => scheduling}/NextStageScheduler.java (76%) create mode 100644 src/main/java/teetime/framework/scheduling/StageStateContainer.java create mode 100644 src/main/java/teetime/framework/scheduling/StageStateManager.java create mode 100644 src/main/java/teetime/framework/scheduling/SynchronizedStageStateContainer.java create mode 100644 src/main/java/teetime/framework/scheduling/UnsynchronizedStageStateContainer.java diff --git a/.checkstyle b/.checkstyle index 5c196046..fd0e0101 100644 --- a/.checkstyle +++ b/.checkstyle @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <fileset-config file-format-version="1.2.0" simple-config="true" sync-formatter="false"> - <local-check-config name="Kieker Checkstyle" location="lib/static-analysis/checkstyle-5.6/cs-conf.xml" type="project" description=""> - <additional-data name="protect-config-file" value="true"/> + <local-check-config name="Kieker Checkstyle" location="conf/cs-conf.xml" type="project" description=""> + <additional-data name="protect-config-file" value="false"/> </local-check-config> - <fileset name="all" enabled="true" check-config-name="Kieker Checkstyle" local="true"> + <fileset name="all" enabled="true" check-config-name="Sun Checks" local="false"> <file-match-pattern match-pattern="." include-pattern="true"/> </fileset> <filter name="FilesFromPackage" enabled="true"> @@ -16,5 +16,4 @@ <filter-data value="examples/userguide/appendix-Sigar/src"/> <filter-data value="src-gen/analysis"/> </filter> - <filter name="NonSrcDirs" enabled="true"/> </fileset-config> diff --git a/.classpath b/.classpath index fd7ad7fb..c9522874 100644 --- a/.classpath +++ b/.classpath @@ -12,6 +12,7 @@ <attribute name="maven.pomderived" value="true"/> </attributes> </classpathentry> + <classpathentry kind="src" path="conf"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"> <attributes> <attribute name="maven.pomderived" value="true"/> diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 69c31cd4..dd0d799c 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,8 +1,292 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=165 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=false +org.eclipse.jdt.core.formatter.join_wrapped_lines=false +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=165 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..c19d56f7 --- /dev/null +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,60 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_Kieker - Profile +formatter_settings_version=12 +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=java;javax;junit;org;com;kieker;kieker.test; +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.staticondemandthreshold=99 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=true +sp_cleanup.always_use_this_for_non_static_method_access=true +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=false +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.make_local_variable_final=false +sp_cleanup.make_parameters_final=true +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=true +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=true +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=true +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false +sp_cleanup.use_this_for_non_static_method_access=true +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=false diff --git a/conf/cs-conf.xml b/conf/cs-conf.xml new file mode 100644 index 00000000..4d22e9d8 --- /dev/null +++ b/conf/cs-conf.xml @@ -0,0 +1,1236 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE module PUBLIC + "-//Puppy Crawl//DTD Check Configuration 1.3//EN" + "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> + +<module name="Checker"> + + <!-- KIEKER default is warning instead of error --> + <property name="severity" value="error"/> + + <!-- KIEKER Filter --> + <module name="SuppressWithNearbyCommentFilter"> + <property name="commentFormat" value="NOCS"/> + <property name="checkFormat" value=".*"/> + <property name="influenceFormat" value="0"/> + </module> + + <!-- + If you set the basedir property below, then all reported file + names will be relative to the specified directory. See + http://checkstyle.sourceforge.net/5.x/config.html#Checker + + <property name="basedir" value="${basedir}"/> + <property name="localeCountry" value=""/> JVM locale country + <property name="localeLanguage" value=""/> JVM locale language + <property name="charset" value=""/> JVM file.encoding property + !--> + + + <!-- + !________________________________________________________________________________________ + ! + ! D U P L I C A T E S + !________________________________________________________________________________________ + !--> + <!-- Performs a line-by-line comparison of all code lines and reports duplicate code. !--> + <!-- See http://checkstyle.sf.net/config_duplicates.html !--> + <!-- KIEKER Does not work with headers!! + <module name="StrictDuplicateCode"> + <property name="min" value="12"/> + <property name="fileExtensions" value=""/> + </module> + --> + + <!-- + !________________________________________________________________________________________ + ! + ! H E A D E R S + !________________________________________________________________________________________ + !--> + <!-- NOTE: You may enable zero or one of these header checks, but not both. !--> + + <!-- Checks that a source file begins with a specified header. !--> + <!-- See http://checkstyle.sf.net/config_header.html !--> + <!-- KIEKER !--> + <module name="Header"> + <!--<property name="headerFile" value=""/>--> + <!--<property name="charset" value=""/>--> + <property name="header" value="/***************************************************************************\n * Copyright 2013 Kieker Project (http://kieker-monitoring.net)\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n"/> + <property name="ignoreLines" value="2"/> + <property name="fileExtensions" value="java"/> + </module> + + <!-- Checks the header of a source file against a header file that contains a regular expression !--> + <!-- for each line of the source header. !--> + <!-- See http://checkstyle.sf.net/config_header.html !--> + <!-- Default: OFF + <module name="RegexpHeader"> + <property name="headerFile" value=""/> + <property name="charset" value=""/> + <property name="header" value=""/> + <property name="multiLines" value=""/> + <property name="fileExtensions" value=""/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! J A V A D O C S + !________________________________________________________________________________________ + !--> + <!-- Checks that each Java package has a Javadoc file used for commenting. !--> + <!-- See http://checkstyle.sourceforge.net/config_javadoc.html#JavadocPackage !--> + <!-- KIEKER: OFF + <module name="JavadocPackage"> + <property name="severity" value="info"/> + <property name="allowLegacy" value="false"/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! R E G E X P + !________________________________________________________________________________________ + !--> + <!-- A check for detecting that matches across multiple lines. Works with any file type. !--> + <!-- See http://checkstyle.sourceforge.net/config_regexp.html#RegexpMultiline !--> + <!-- Default: OFF + <module name="RegexpMultiline"> + <property name="format" value=""/> + <property name="message" value=""/> + <property name="ignoreCase" value="false"/> + <property name="minimum" value="0"/> + <property name="maximum" value="0"/> + <property name="fileExtensions" value=""/> + </module> + !--> + + <!-- A check for detecting single lines that match a supplied regular expression. Works with any file type. !--> + <!-- See http://checkstyle.sourceforge.net/config_regexp.html#RegexpSingleline !--> + <!-- Default: OFF + <module name="RegexpSingleline"> + <property name="format" value="\s+$"/> + <property name="message" value=""/> + <property name="ignoreCase" value="false"/> + <property name="minimum" value="0"/> + <property name="maximum" value="0"/> + <property name="fileExtensions" value=""/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! M I S C E L L A N E O U S + !________________________________________________________________________________________ + !--> + <!-- Checks whether files end with a new line. !--> + <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile !--> + <module name="NewlineAtEndOfFile"> + <property name="lineSeparator" value="system"/> + <property name="fileExtensions" value="*.*"/> + </module> + + <!-- Checks that property files contain the same keys. !--> + <!-- See http://checkstyle.sf.net/config_misc.html#Translation !--> + <module name="Translation"> + <property name="fileExtensions" value="properties"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! S I Z E V I O L A T I O N S + !________________________________________________________________________________________ + !--> + <!-- Checks for long source files. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <module name="FileLength"> + <property name="max" value="2000"/> + <property name="fileExtensions" value="java"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! W H I T E S P A C E + !________________________________________________________________________________________ + !--> + <!-- Checks that there are no tab characters ('\t') in the source code. !--> + <!-- See http://checkstyle.sourceforge.net/config_whitespace.html#FileTabCharacter !--> + <!-- KIEKER we use TABs + <module name="FileTabCharacter"> + <property name="eachLine" value="false"/> + <property name="fileExtensions" value=""/> + </module> + --> + + <module name="TreeWalker"> + <!-- KIEKER --> + <property name="tabWidth" value="4"/> + <!-- KIEKER --> + <module name="kieker.test.tools.cs.AnalysisComponentConstructorCheck"> + <property name="ignoreAbstractClasses" value="true"/> + <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/> + </module> + <module name="kieker.test.tools.cs.MonitoringRecordFactoryConventionCheck"> + <property name="ignoreAbstractClasses" value="true"/> + <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/> + </module> + <module name="kieker.test.tools.cs.MissingSinceTagCheck"> + <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/> + </module> + <module name="kieker.test.tools.cs.NotAllowedSinceTagCheck"> + <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/> + </module> + <module name="kieker.test.tools.cs.NoBlockCommentsCheck"> + <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/> + </module> + <module name="FileContentsHolder"/> + + <!-- + !________________________________________________________________________________________ + ! + ! A N N O T A T I O N S + !________________________________________________________________________________________ + !--> + <!-- This check controls the usage style of annotations. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#AnnotationUseStyle !--> + <module name ="AnnotationUseStyle"> + <property name="elementStyle" value="compact_no_array"/> + <property name="closingParens" value="never"/> + <property name="trailingArrayComma" value="never"/> + </module> + + <!-- Verifies that both the java.lang.Deprecated import is present and the @deprecated Javadoc tag is present when either is present. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#MissingDeprecated !--> + <!-- KIEKER --> + <module name="MissingDeprecated"> + <property name="severity" value="info"/> + </module> + + <!-- Verifies that the java.lang.Override annotation is present when the {@inheritDoc} javadoc tag is present. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#MissingOverride !--> + <!-- problems with Java 1.5 + <module name="MissingOverride"> + <property name="javaFiveCompatibility" value="false"/> + </module> + --> + + <!-- This check makes sure that all package annotations are in the package-info.java file. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#PackageAnnotation !--> + <module name="PackageAnnotation"/> + + <!-- This check allows you to specify what warnings that SuppressWarnings is not allowed to suppress. !--> + <!-- You can also specify a list of TokenTypes that the configured warning(s) cannot be suppressed on. !--> + <!-- See http://checkstyle.sourceforge.net/config_annotation.html#SuppressWarnings !--> + <module name="SuppressWarnings"> + <property name="format" value="^$|^\s+$"/> + <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF, + ANNOTATION_FIELD_DEF, ENUM_CONSTANT_DEF, PARAMETER_DEF, + VARIABLE_DEF, METHOD_DEF, CTOR_DEF"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! B L O C K S + !________________________________________________________________________________________ + !--> + <!-- Finds nested blocks, i.e. blocks that are used freely in the code. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <!-- KIEKER allowInSwitchCase !--> + <module name="AvoidNestedBlocks"> + <property name="allowInSwitchCase" value="true"/> + </module> + + <!-- Checks for empty blocks. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <!-- KIEKER removed LITERAL_CATCH !--> + <module name="EmptyBlock"> + <property name="option" value="stmt"/> + <property name="tokens" value="LITERAL_DO, + LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF, LITERAL_FOR, + LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT"/> + </module> + + <!-- Checks for the placement of left curly braces ('{') for code blocks. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <module name="LeftCurly"> + <property name="option" value="eol"/> + <property name="maxLineLength" value="165"/> + <property name="tokens" value="CLASS_DEF, CTOR_DEF, + INTERFACE_DEF, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, + LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_SWITCH, + LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, + METHOD_DEF"/> + </module> + + <!-- Checks for braces around code blocks. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <module name="NeedBraces"> + <property name="tokens" value="LITERAL_DO, LITERAL_ELSE, LITERAL_IF, LITERAL_FOR, LITERAL_WHILE"/> + </module> + + <!-- Checks the placement of right curly braces ('}') for else, try, and catch tokens. !--> + <!-- See http://checkstyle.sf.net/config_blocks.html !--> + <module name="RightCurly"> + <property name="option" value="same"/> + <property name="tokens" value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE"/> + <property name="shouldStartLine" value="true"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! C L A S S D E S I G N + !________________________________________________________________________________________ + !--> + <!-- Checks that classes are designed for extension. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <!-- Default: OFF + <module name="DesignForExtension"/> + !--> + + <!-- Checks that a class which has only private constructors is declared as final. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="FinalClass"/> + + <!-- Make sure that utility classes (classes that contain only static methods) do not have a public constructor. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="HideUtilityClassConstructor"/> + + <!-- Check nested (internal) classes/interfaces are declared at the bottom of the class after all method and field declarations. !--> + <!-- See http://checkstyle.sourceforge.net/config_design.html#InnerTypeLast !--> + <module name="InnerTypeLast"/> + + <!-- Implements Bloch, Effective Java, Item 17 - Use Interfaces only to define types. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="InterfaceIsType"> + <property name="allowMarkerInterfaces" value="true"/> + </module> + + <!-- Ensures that exceptions (defined as any class name conforming to some regular expression) are immutable. !--> + <!-- That is, have only final fields. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="MutableException"> + <property name="format" value="^.*Exception$|^.*Error$"/> + </module> + + <!-- Restricts throws statements to a specified count. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <!-- KIEKER off + <module name="ThrowsCount"> + <property name="max" value="1"/> + </module> + !--> + + <!-- Checks visibility of class members. !--> + <!-- See http://checkstyle.sf.net/config_design.html !--> + <module name="VisibilityModifier"> + <property name="packageAllowed" value="false"/> + <property name="protectedAllowed" value="true"/> + <property name="publicMemberPattern" value="^serialVersionUID$"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! C O D I N G + !________________________________________________________________________________________ + !--> + <!-- Checks that array initialization contains a trailing comma. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="ArrayTrailingComma"/> + + <!-- Detects inline conditionals. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="AvoidInlineConditionals"/> + + <!-- Checks that classes that define a covariant equals() method also override method equals(java.lang.Object). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="CovariantEquals"/> + + <!-- Checks declaration order according to Code Conventions for the Java Programming Language. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="DeclarationOrder"> + <property name="ignoreConstructors" value="false"/> + <property name="ignoreMethods" value="false"/> + <property name="ignoreModifiers" value="false"/> + </module> + + <!-- Check that the default is after all the cases in a switch statement. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="DefaultComesLast"/> + + <!-- The "double-checked locking" idiom (DCL) tries to avoid the runtime cost of synchronization. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!--<module name="DoubleCheckedLocking"/>--> + + <!-- Detects empty statements (standalone ;). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="EmptyStatement"/> + + <!-- Checks that any combination of String literals with optional assignment is on the left side of an equals() comparison. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#EqualsAvoidNull !--> + <module name="EqualsAvoidNull"/> + + <!-- Checks that classes that override equals() also override hashCode(). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="EqualsHashCode"/> + + <!-- Checks if any class or object member explicitly initialized to default for its type value. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER off + <module name="ExplicitInitialization"/> + !--> + + <!-- Checks for fall through in switch statements Finds locations where a case contains Java code ... !--> + <!-- but lacks a break, return, throw or continue statement. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="FallThrough"> + <property name="checkLastCaseGroup" value="false"/> + <property name="reliefPattern" value="fallthru|falls??through"/> + </module> + + <!-- Checks that local variables that never have their values changed are declared final. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="FinalLocalVariable"> + <property name="tokens" value="VARIABLE_DEF"/> + </module> + + <!-- Checks that a local variable or a parameter does not shadow a field that is defined in the same class. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER ignoreConstructorParameter, ignoreSetter --> + <module name="HiddenField"> + <property name="tokens" value="PARAMETER_DEF, VARIABLE_DEF"/> + <!-- + <property name="ignoreFormat" value=""/> + !--> + <property name="ignoreConstructorParameter" value="true"/> + <property name="ignoreSetter" value="true"/> + <property name="ignoreAbstractMethods" value="false"/> + </module> + + <!-- Catching java.lang.Exception, java.lang.Error or java.lang.RuntimeException is almost never acceptable. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="IllegalCatch"> + <property name="illegalClassNames" value="java.lang.Exception, java.lang.Throwable, java.lang.RuntimeException"/> + </module> + + <!-- Checks for illegal instantiations where a factory method is preferred. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER on for ??? !--> + <module name="IllegalInstantiation"> + <property name="classes" value="java.lang.Boolean"/> + </module> + + <!-- This check can be used to ensure that types are not declared to be thrown. !--> + <!-- Declaring to throw java.lang.Error or java.lang.RuntimeException is almost never acceptable. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#IllegalThrows !--> + <module name="IllegalThrows"> + <property name="illegalClassNames" value="java.lang.Throwable, java.lang.Error, java.lang.RuntimeException"/> + </module> + + <!-- Checks for illegal tokens. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER off + <module name="IllegalToken"> + <property name="tokens" value="LITERAL_SWITCH, POST_INC, POST_DEC"/> + </module> + !--> + + <!-- Checks for illegal token text. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- Default: OFF + <module name="IllegalTokenText"> + <property name="tokens" value=""/> + <property name="format" value=""/> + <property name="ignoreCase" value="false"/> + <property name="message" value=""/> + </module> + !--> + + <!-- Checks that particular classes are never used as types in variable declarations, return values or parameters. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- KIEKER removed format value="^(.*[\\.])?Abstract.*$" !--> + <module name="IllegalType"> + <property name="tokens" value="PARAMETER_DEF, VARIABLE_DEF, METHOD_DEF"/> + <property name="illegalClassNames" value="java.util.GregorianCalendar, java.util.Hashtable, + java.util.HashSet, java.util.HashMap, java.util.ArrayList, + java.util.LinkedList, java.util.LinkedHashMap, + java.util.LinkedHashSet, java.util.TreeSet, + java.util.TreeMap, java.util.Vector"/> + <property name="legalAbstractClassNames" value=""/> + <property name="ignoredMethodNames" value="getInitialContext, getEnvironment"/> + <property name="format" value="XXX"/> + </module> + + <!-- Checks for assignments in subexpressions, such as in String s = Integer.toString(i = 2);. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="InnerAssignment"> + <property name="tokens" value="ASSIGN, BAND_ASSIGN, BOR_ASSIGN, BSR_ASSIGN, BXOR_ASSIGN, + DIV_ASSIGN, MINUS_ASSIGN, MOD_ASSIGN, PLUS_ASSIGN, SL_ASSIGN, + SR_ASSIGN, STAR_ASSIGN"/> + </module> + + <!-- Ensures that the setUp(), tearDown()methods are named correctly, have no arguments, !--> + <!-- return void and are either public or protected. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="JUnitTestCase"/> + + <!-- Checks that there are no "magic numbers", where a magic number is a numeric literal !--> + <!-- that is not defined as a constant. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <!-- deactivated for Kieker + <module name="MagicNumber"> + <property name="tokens" value="NUM_DOUBLE, NUM_FLOAT, NUM_INT, NUM_LONG"/> + <property name="ignoreNumbers" value="-1, 0, 1, 2"/> + <property name="ignoreHashCodeMethod" value="false"/> + </module> + !--> + + <!-- Checks that classes (except abtract one) define a ctor and don't rely on the default one. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="MissingCtor"/> + + <!-- Checks that switch statement has "default" clause. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="MissingSwitchDefault"/> + + <!-- Check for ensuring that for loop control variables are not modified inside the for block. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#ModifiedControlVariable !--> + <module name="ModifiedControlVariable"/> + + <!-- Checks for multiple occurrences of the same string literal within a single file. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#MultipleStringLiterals !--> + <!-- KIEKER off for now + <module name="MultipleStringLiterals"> + <property name="allowedDuplicates" value="1"/> + <property name="ignoreStringsRegexp" value='^""$'/> + <property name="ignoreOccurrenceContext" value="ANNOTATION"/> + </module> + !--> + + <!-- Checks that each variable declaration is in its own statement and on its own line. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="MultipleVariableDeclarations"/> + + <!-- Restricts nested for blocks to a specified depth. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#NestedForDepth !--> + <module name="NestedForDepth"> + <property name="max" value="2"/> + </module> + + <!-- Restricts nested if-else blocks to a specified depth. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="NestedIfDepth"> + <property name="max" value="3"/> + </module> + + <!-- Restricts nested try-catch blocks to a specified depth. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="NestedTryDepth"> + <property name="max" value="1"/> + </module> + + <!-- Checks that the clone method is not overridden from the Object class. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#NoClone !--> + <module name="NoClone"/> + + <!-- Verifies there are no finalize() methods defined in a class. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#NoFinalizer !--> + <module name="NoFinalizer"/> + + <!-- Checks there is only one statement per line. !--> + <!-- See http://checkstyle.sourceforge.net/config_coding.html#OneStatementPerLine !--> + <module name="OneStatementPerLine"/> + + <!-- Ensure a class has a package declaration. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="PackageDeclaration"> + <property name="ignoreDirectoryName" value="false"/> + </module> + + <!-- Disallow assignment of parameters. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="ParameterAssignment"/> + + <!-- Checks for redundant exceptions declared in throws clause such as duplicates, !--> + <!-- unchecked exceptions or subclasses of another declared exception. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="RedundantThrows"> + <property name="allowUnchecked" value="true"/> + <property name="allowSubclasses" value="false"/> + <property name="logLoadErrors" value="true"/> + <property name="suppressLoadErrors" value="false"/> + </module> + + <!-- Checks that code doesn't rely on the "this." default. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="RequireThis"> + <property name="checkFields" value="true"/> + <property name="checkMethods" value="true"/> + </module> + + <!-- Restrict the number of return statements. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="ReturnCount"> + <property name="max" value="2"/> + <property name="format" value=""/> + </module> + + <!-- Checks for overly complicated boolean expressions. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + + <module name="SimplifyBooleanExpression"/> + + <!-- Checks for overly complicated boolean return statements. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="SimplifyBooleanReturn"/> + + <!-- Checks that string literals are not used with == or !=. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="StringLiteralEquality"/> + + <!-- Checks that an overriding clone() method invokes super.clone(). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="SuperClone"/> + + <!-- Checks that an overriding finalize() method invokes super.finalize(). !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="SuperFinalize"/> + + <!-- Checks for the use of unnecessary parentheses. !--> + <!-- See http://checkstyle.sf.net/config_coding.html !--> + <module name="UnnecessaryParentheses"/> + + + <!-- + !________________________________________________________________________________________ + ! + ! I M P O R T S + !________________________________________________________________________________________ + !--> + <!-- Checks that there are no import statements that use the * notation. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="AvoidStarImport"> + <property name="excludes" value=""/> + <property name="allowClassImports" value="false"/> + <property name="allowStaticMemberImports" value="false"/> + </module> + + <!-- Checks that there are no static import statements. !--> + <!-- See http://checkstyle.sourceforge.net/config_imports.html#AvoidStaticImport !--> + <module name="AvoidStaticImport"> + <property name="excludes" value=""/> + </module> + + <!-- Checks for imports from a set of illegal packages. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="IllegalImport"> + <property name="illegalPkgs" value="junit.framework"/> + <property name="illegalPkgs" value="sun"/> + <property name="illegalPkgs" value="org.apache.commons.logging"/> + <property name="illegalPkgs" value="java.util.logging"/> + </module> + + <!-- Controls what can be imported in each package. Useful for ensuring that application layering rules !--> + <!-- are not violated, especially on large projects. !--> + <!-- See http://checkstyle.sourceforge.net/config_imports.html#ImportControl !--> + <!-- Default: OFF + <module name="ImportControl"> + <property name="file" value=""/> + <property name="url" value=""/> + </module> + !--> + + <!-- Checks the ordering/grouping of imports. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="ImportOrder"> + <property name="option" value="under"/> + <property name="groups" value="java,javax,junit,org,com,ch,de,kieker,kieker.test"/> + <property name="ordered" value="true"/> + <property name="separated" value="true"/> + <property name="caseSensitive" value="true"/> + </module> + + <!-- Checks for redundant import statements. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="RedundantImport"/> + + <!-- Checks for unused import statements. !--> + <!-- See http://checkstyle.sf.net/config_import.html !--> + <module name="UnusedImports"/> + + + <!-- + !________________________________________________________________________________________ + ! + ! J A V A D O C S + !________________________________________________________________________________________ + !--> + <!-- Checks to ensure that the javadoc tags exist (if required) !--> + <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocMethod !--> + <!-- KIEKER: adapted !--> + <module name="JavadocMethod"> + <property name="severity" value="info"/> + <property name="scope" value="protected"/> + <!-- + <property name="excludeScope" value=""/> + !--> + <property name="allowUndeclaredRTE" value="false"/> + <property name="allowThrowsTagsForSubclasses" value="false"/> + <property name="allowMissingParamTags" value="false"/> + <property name="allowMissingThrowsTags" value="false"/> + <property name="allowMissingReturnTag" value="false"/> + <property name="allowMissingJavadoc" value="false"/> + <property name="allowMissingPropertyJavadoc" value="true"/> + <property name="logLoadErrors" value="true"/> + <property name="suppressLoadErrors" value="false"/> + <property name="tokens" value="METHOD_DEF, CTOR_DEF"/> + </module> + + <!-- Validates Javadoc comments to help ensure they are well formed. !--> + <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocStyle !--> + <module name="JavadocStyle"> + <property name="severity" value="info"/> + <property name="scope" value="private"/> + <!-- + <property name="excludeScope" value=""/> + !--> + <property name="checkFirstSentence" value="true"/> +<!--TODO: <property name="endOfSentenceFormat" value="([.?!][ \t\n\r\f<])|([.?!]$)"/> !--> + <property name="checkEmptyJavadoc" value="false"/> + <property name="checkHtml" value="false"/> + <property name="tokens" value="INTERFACE_DEF, CLASS_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/> + </module> + + <!-- Checks Javadoc comments for class and interface definitions. !--> + <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocType !--> + <module name="JavadocType"> + <property name="severity" value="info"/> + <property name="scope" value="private"/> + <!--<property name="excludeScope" value=""/>!--> + <property name="authorFormat" value=""/> + <!--<property name="versionFormat" value=""/>!--> + <property name="allowMissingParamTags" value="false"/> + <property name="allowUnknownTags" value="false"/> + <property name="tokens" value="INTERFACE_DEF, CLASS_DEF"/> + </module> + + <module name="JavadocType"> + <property name="severity" value="error"/> + <property name="scope" value="package"/> + <property name="authorFormat" value="\S"/> + </module> + + <!-- Checks that variables have Javadoc comments. !--> + <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocVariable !--> + <module name="JavadocVariable"> + <property name="severity" value="info"/> + <property name="scope" value="protected"/> + <!-- + <property name="excludeScope" value=""/> + !--> + </module> + + <!-- Outputs a JavaDoc tag as information. !--> + <!-- See http://checkstyle.sourceforge.net/config_javadoc.html#WriteTag !--> + <!-- KIEKER + <module name="WriteTag"> + <property name="severity" value="info"/> + <property name="tag" value=""/> + <property name="tagFormat" value=""/> + <property name="tagSeverity" value="info"/> + </module> + --> + + + <!-- + !________________________________________________________________________________________ + ! + ! M E T R I C S + !________________________________________________________________________________________ + !--> + <!-- Restrict the number of number of &&, || and ^ in an expression. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <!-- KIEKER Off --> + <!-- <module name="BooleanExpressionComplexity"> + <property name="severity" value="info"/> + <property name="max" value="3"/> + <property name="tokens" value="LAND, BAND, LOR, BOR, BXOR"/> + </module> --> + + <!-- This metric measures the number of instantiations of other classes within the given class. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <!-- KIEKER Off --> + <!-- <module name="ClassDataAbstractionCoupling"> + <property name="severity" value="info"/> + <property name="max" value="7"/> + </module> --> + + <!-- The number of other classes a given class relies on. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <!-- KIEKER Off --> + <!--<module name="ClassFanOutComplexity"> + <property name="severity" value="info"/> + <property name="max" value="20"/> + </module> --> + + <!-- Checks cyclomatic complexity against a specified limit. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <module name="CyclomaticComplexity"> + <property name="severity" value="ignore"/> + <property name="max" value="10"/> + </module> + + <!-- Determines complexity of methods, classes and files by counting the Non Commenting Source Statements (NCSS). !--> + <!-- See http://checkstyle.sourceforge.net/config_metrics.html#JavaNCSS !--> + <!-- KIEKER Off --> + <!--<module name="JavaNCSS"> + <property name="severity" value="info"/> + <property name="methodMaximum" value="50"/> + <property name="classMaximum" value="1500"/> + <property name="fileMaximum" value="2000"/> + </module> --> + + <!-- The NPATH metric computes the number of possible execution paths through a function. !--> + <!-- See http://checkstyle.sf.net/config_metrics.html !--> + <!-- KIEKER Off --> + <!--<module name="NPathComplexity"> + <property name="severity" value="info"/> + <property name="max" value="200"/> + </module> --> + + + <!-- + !________________________________________________________________________________________ + ! + ! M I S C E L L A N E O U S + !________________________________________________________________________________________ + !--> + <!-- Checks the style of array type definitions. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <module name="ArrayTypeStyle"> + <property name="javaStyle" value="true"/> + </module> + + <!-- Checks for restricted tokens beneath other tokens. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- Default: OFF + <module name="DescendantToken"> + <property name="tokens" value=""/> + <property name="limitedTokens" value=""/> + <property name="minimumDepth" value="0"/> + <property name="maximumDepth" value="java.lang.Integer.MAX_VALUE"/> + <property name="minimumNumber" value="0"/> + <property name="maximumNumber" value="java.lang.Integer.MAX_VALUE"/> + <property name="sumTokenCounts" value="false"/> + <property name="minimumMessage" value="descendant.token.min"/> + <property name="maximumMessage" value="descendant.token.max"/> + </module> + !--> + + <!-- Check that method/constructor parameters are final. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <module name="FinalParameters"> + <property name="tokens" value="METHOD_DEF, CTOR_DEF"/> + </module> + + <!-- A generic check for code problems - the user can search for any pattern. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- Default: OFF + <module name="GenericIllegalRegexp"> + <property name="format" value="\S\s+$"/> + <property name="message" value="Line has trailing spaces."/> + <property name="ignoreCase" value="false"/> + <property name="ignoreComments" value="false"/> + </module> + !--> + + <!-- Checks correct indentation of Java Code. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- KIEKER deactivated for now + <module name="Indentation"> + <property name="severity" value="info"/> + <property name="basicOffset" value="4"/> + <property name="braceAdjustment" value="0"/> + <property name="caseIndent" value="0"/> + </module> + !--> + + <!-- Checks that the outer type name and the file name match. !--> + <!-- See http://checkstyle.sourceforge.net/config_misc.html#OuterTypeFilename !--> + <module name="OuterTypeFilename"/> + + <!-- A check for TODO: comments. Actually it is a generic regular expression matcher on Java comments. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- Kieker !--> + <module name="TodoComment"> + <property name="format" value="TODO"/> + <property name="severity" value="warning"/> + </module> + <module name="TodoComment"> + <property name="format" value="FIXME"/> + <property name="severity" value="error"/> + </module> + + <!-- The check to ensure that requires that comments be the only thing on a line. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- KIEKER we use them + <module name="TrailingComment"> + <property name="format" value="^[\\s\\}\\);]*$"/> + <property name="legalComment" value=""/> + </module> + --> + + <!-- Checks for uncommented main() methods (debugging leftovers). !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <!-- KIEKER do not check for these + <module name="UncommentedMain"> + <property name="severity" value="info"/> + <property name="excludedClasses" value="Main$"/> + </module> + --> + + <!-- Checks that long constants are defined with an upper ell. That is 'L' and not 'l'. !--> + <!-- See http://checkstyle.sf.net/config_misc.html !--> + <module name="UpperEll"/> + + + <!-- + !________________________________________________________________________________________ + ! + ! M O D I F I E R S + !________________________________________________________________________________________ + !--> + <!-- Checks that the order of modifiers conforms to the suggestions in the Java Language specification, !--> + <!-- sections 8.1.1, 8.3.1 and 8.4.3. !--> + <!-- See http://checkstyle.sf.net/config_modifiers.html !--> + <module name="ModifierOrder"/> + + <!-- Checks that there are no redundant modifiers. !--> + <!-- See http://checkstyle.sf.net/config_modifiers.html !--> + <!-- KIEKER off + <module name="RedundantModifier"> + <property name="tokens" value="METHOD_DEF, VARIABLE_DEF, ANNOTATION_FIELD_DEF"/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! N A M I N G C O N V E N T I O N S + !________________________________________________________________________________________ + !--> + <!-- Checks for abstract class name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <!-- KIEKER removed |^.*Factory$ --> + <module name="AbstractClassName"> + <property name="format" value="^Abstract.*$"/> + <property name="ignoreModifier" value="false"/> + <property name="ignoreName" value="false"/> + </module> + + <!-- Checks for class type parameter name naming conventions. !--> + <!-- See http://checkstyle.sourceforge.net/config_naming.html#ClassTypeParameterName !--> + <module name="ClassTypeParameterName"> + <property name="format" value="^[A-Z]$"/> + </module> + + <!-- Checks for constant name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="ConstantName"> + <property name="format" value="^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + <!-- Checks for local final variable name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="LocalFinalVariableName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + <property name="tokens" value="VARIABLE_DEF, PARAMETER_DEF"/> + </module> + + <!-- Checks for local variable name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="LocalVariableName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + <property name="tokens" value="PARAMETER_DEF"/> + </module> + + <!-- Checks for member variable name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="MemberName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + <!-- Checks for method name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="MethodName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + </module> + + <!-- Checks for method type parameter name naming conventions. !--> + <!-- See http://checkstyle.sourceforge.net/config_naming.html#MethodTypeParameterName !--> + <module name="MethodTypeParameterName"> + <property name="format" value="^[A-Z]$"/> + </module> + + <!-- Checks for package name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="PackageName"> + <property name="format" value="^[a-z]+(\.[a-zA-Z_][a-zA-Z0-9_]*)*$"/> + </module> + + <!-- Checks for parameter name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="ParameterName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + </module> + + <!-- Checks for static variable name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <module name="StaticVariableName"> + <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + <!-- Checks for type name naming conventions. !--> + <!-- See http://checkstyle.sf.net/config_naming.html !--> + <!-- KIEKER: modded --> + <module name="TypeName"> + <property name="format" value="^[A-Z][a-zA-Z0-9]*$"/> + <property name="tokens" value="CLASS_DEF"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + <module name="TypeName"> + <property name="format" value="^I[A-Z][a-zA-Z0-9]*$"/> + <property name="tokens" value="INTERFACE_DEF"/> + <property name="applyToPublic" value="true"/> + <property name="applyToProtected" value="true"/> + <property name="applyToPackage" value="true"/> + <property name="applyToPrivate" value="true"/> + </module> + + + <!-- + !________________________________________________________________________________________ + ! + ! R E G E X P + !________________________________________________________________________________________ + !--> + <!-- A check that makes sure that a specified pattern exists, exists less than a set number of times, !--> + <!-- or does not exist in the file. !--> + <!-- See http://checkstyle.sourceforge.net/config_misc.html#Regexp !--> + <!-- Default: OFF + <module name="Regexp"> + <property name="format" value=""/> + <property name="message" value=""/> + <property name="illegalPattern" value="false"/> + <property name="duplicateLimit" value="-1"/> + <property name="errorLimit" value="100"/> + <property name="ignoreComments" value="false"/> + </module> + !--> + + <!-- This class is variation on RegexpSingleline for detecting single lines that match a !--> + <!-- supplied regular expression in Java files. It supports suppressing matches in Java comments. !--> + <!-- See http://checkstyle.sourceforge.net/config_regexp.html#RegexpSinglelineJava !--> + <!-- Default: OFF + <module name="RegexpSinglelineJava"> + <property name="format" value=""/> + <property name="message" value=""/> + <property name="ignoreCase" value="false"/> + <property name="minimum" value="0"/> + <property name="maximum" value="0"/> + <property name="ignoreComments" value="false"/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! S I Z E V I O L A T I O N S + !________________________________________________________________________________________ + !--> + <!-- Checks for long anonymous inner classes. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <!-- KIEKER Set to 50 instead of 20 --> + <module name="AnonInnerLength"> + <property name="severity" value="info"/> + <property name="max" value="50"/> + </module> + + <!-- Restricts the number of executable statements to a specified limit. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <!-- KIEKER off + <module name="ExecutableStatementCount"> + <property name="severity" value="info"/> + <property name="max" value="30"/> + <property name="tokens" value="CTOR_DEF, METHOD_DEF, INSTANCE_INIT, STATIC_INIT"/> + </module> + !--> + + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <!-- Checks for long lines. !--> + <module name="LineLength"> + <property name="severity" value="info"/> + <property name="ignorePattern" value="^$"/> + <property name="max" value="165"/> + </module> + + <!-- Checks the number of methods declared in each type. This includes the number of each scope !--> + <!-- (private, package, protected and public) as well as an overall total. !--> + <!-- See http://checkstyle.sourceforge.net/config_sizes.html#MethodCount !--> + <module name="MethodCount"> + <property name="severity" value="info"/> + <property name="maxTotal" value="100"/> + <property name="maxPrivate" value="100"/> + <property name="maxPackage" value="100"/> + <property name="maxProtected" value="100"/> + <property name="maxPublic" value="100"/> + </module> + + <!-- Checks for long methods and constructors. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <module name="MethodLength"> + <property name="severity" value="info"/> + <property name="max" value="150"/> + <property name="countEmpty" value="true"/> + <property name="tokens" value="METHOD_DEF, CTOR_DEF"/> + </module> + + <!-- Checks for the number of types declared at the outer (or root) level in a file. !--> + <!-- See http://checkstyle.sourceforge.net/config_sizes.html#OuterTypeNumber !--> + <!-- KIEKER 2 !--> + <module name="OuterTypeNumber"> + <property name="max" value="2"/> + </module> + + <!-- Checks the number of parameters of a method or constructor. !--> + <!-- See http://checkstyle.sf.net/config_sizes.html !--> + <!-- KIEKER off + <module name="ParameterNumber"> + <property name="severity" value="info"/> + <property name="max" value="7"/> + <property name="tokens" value="METHOD_DEF, CTOR_DEF"/> + </module> + !--> + + <!-- + !________________________________________________________________________________________ + ! + ! W H I T E S P A C E + !________________________________________________________________________________________ + !--> + <!-- Checks the padding of an empty for initializer. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="EmptyForInitializerPad"> + <property name="option" value="nospace"/> + </module> + + <!-- Checks the padding of an empty for iterator. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="EmptyForIteratorPad"> + <property name="option" value="nospace"/> + </module> + + <!-- Checks that the whitespace around the Generic tokens < and > is correct to the typical convention. !--> + <!-- See http://checkstyle.sourceforge.net/config_whitespace.html#GenericWhitespace !--> + <module name="GenericWhitespace"/> + + <!-- Checks the padding between the identifier of a method definition, !--> + <!-- constructor definition, method call, or constructor invocation; and the left parenthesis of the parameter list. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="MethodParamPad"> + <property name="allowLineBreaks" value="false"/> + <property name="option" value="nospace"/> + <property name="tokens" value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF, SUPER_CTOR_CALL "/> + </module> + + <!-- Checks that there is no whitespace after a token. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <!-- KIEKER removed ARRAY_INIT !--> + <module name="NoWhitespaceAfter"> + <property name="allowLineBreaks" value="true"/> + <property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS"/> + </module> + + <!-- Checks that there is no whitespace before a token. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="NoWhitespaceBefore"> + <property name="allowLineBreaks" value="false"/> + <property name="tokens" value="SEMI, POST_DEC, POST_INC"/> + </module> + + <!-- Checks the policy on how to wrap lines on operators. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="OperatorWrap"> + <property name="option" value="nl"/> + <property name="tokens" value="BAND, BOR, BSR, BXOR, COLON, DIV, + EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, + LOR, LT, MINUS, MOD, NOT_EQUAL, + PLUS, QUESTION, SL, SR, STAR"/> + </module> + + <!-- Checks the policy on the padding of parentheses. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="ParenPad"> + <property name="option" value="nospace"/> + <property name="tokens" value="CTOR_CALL, LPAREN, METHOD_CALL, RPAREN, SUPER_CTOR_CALL"/> + </module> + + <!-- Checks the policy on the padding of parentheses for typecasts. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="TypecastParenPad"> + <property name="option" value="nospace"/> + <property name="tokens" value="TYPECAST, RPAREN"/> + </module> + + <!-- Checks that a token is followed by whitespace. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="WhitespaceAfter"> + <property name="tokens" value="COMMA, SEMI, TYPECAST"/> + </module> + + <!-- Checks that a token is surrounded by whitespace. !--> + <!-- See http://checkstyle.sf.net/config_whitespace.html !--> + <module name="WhitespaceAround"> + <property name="tokens" value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, + BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, + LE, LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, + LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, + LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, LOR, LT, + MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL, PLUS, PLUS_ASSIGN, + QUESTION, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN, STAR, STAR_ASSIGN"/> + <property name="allowEmptyConstructors" value="true"/> + <property name="allowEmptyMethods" value="true"/> + </module> + + </module> + +</module> diff --git a/results/evaluation.xlsx b/results/evaluation.xlsx index 237636274d109ea88dcd32de85ac7fe9c492c45b..5a62baf8e4f79279c96fbbb50b562cb8f244eceb 100644 GIT binary patch delta 7550 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 G^nU>T2Jo!_ delta 7301 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 GM*j=c40@md diff --git a/src/main/java/teetime/examples/countWords/ConcurrentCountWordsAnalysis.java b/src/main/java/teetime/examples/countWords/ConcurrentCountWordsAnalysis.java index 4fa50362..70243758 100644 --- a/src/main/java/teetime/examples/countWords/ConcurrentCountWordsAnalysis.java +++ b/src/main/java/teetime/examples/countWords/ConcurrentCountWordsAnalysis.java @@ -17,7 +17,6 @@ package teetime.examples.countWords; import java.io.File; -import java.util.Arrays; import java.util.LinkedList; import java.util.List; @@ -28,11 +27,13 @@ import teetime.framework.concurrent.StageTerminationPolicy; import teetime.framework.concurrent.WorkerThread; import teetime.framework.core.Analysis; import teetime.framework.core.IInputPort; +import teetime.framework.core.IInputPort.PortState; import teetime.framework.core.IOutputPort; import teetime.framework.core.IPipeline; import teetime.framework.core.ISink; import teetime.framework.core.ISource; import teetime.framework.core.IStage; +import teetime.framework.core.Pipeline; import teetime.framework.sequential.MethodCallPipe; import teetime.framework.sequential.QueuePipe; import teetime.stage.basic.RepeaterSource; @@ -51,7 +52,7 @@ public class ConcurrentCountWordsAnalysis extends Analysis { private static final String START_DIRECTORY_NAME = "."; private static final int SECONDS = 1000; - private static final int MAX_NUM_THREADS = 3; + private static final int MAX_NUM_THREADS = 2; // 1:2150, 2:1400, 3:~1400, 4:~1400 private WorkerThread[] ioThreads; private WorkerThread[] nonIoThreads; @@ -82,6 +83,7 @@ public class ConcurrentCountWordsAnalysis extends Analysis { int numThreads = Runtime.getRuntime().availableProcessors(); numThreads = Math.min(MAX_NUM_THREADS, numThreads); // only for testing purposes + System.out.println("Using " + numThreads + " Threads."); this.nonIoThreads = new WorkerThread[numThreads]; for (int i = 0; i < this.nonIoThreads.length; i++) { @@ -142,6 +144,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis { distributor.setAccessesDeviceId(1); // add each stage to a stage list + final List<IStage> startStages = new LinkedList<IStage>(); + startStages.add(repeaterSource); + final List<IStage> stages = new LinkedList<IStage>(); stages.add(repeaterSource); stages.add(directoryName2Files); @@ -152,34 +157,11 @@ public class ConcurrentCountWordsAnalysis extends Analysis { QueuePipe.connect(directoryName2Files.fileOutputPort, distributor.genericInputPort); repeaterSource.START.setAssociatedPipe(new MethodCallPipe<Boolean>(Boolean.TRUE)); + repeaterSource.START.setState(PortState.CLOSED); - final IPipeline pipeline = new IPipeline() { - @Override - @SuppressWarnings("unchecked") - public List<? extends IStage> getStartStages() { - return Arrays.asList(repeaterSource); - } - - @Override - public List<IStage> getStages() { - return stages; - } - - @Override - public void fireStartNotification() throws Exception { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStarts(); - } - } - - @Override - public void fireStopNotification() { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStops(); - } - } - }; - + final Pipeline pipeline = new Pipeline(); + pipeline.setStartStages(startStages); + pipeline.setStages(stages); return pipeline; } @@ -191,6 +173,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis { final Merger<Pair<File, Integer>> merger = new Merger<Pair<File, Integer>>(); // add each stage to a stage list + final List<IStage> startStages = new LinkedList<IStage>(); + startStages.add(distributor); + final List<IStage> stages = new LinkedList<IStage>(); stages.add(distributor); stages.add(countWordsStage0); @@ -207,33 +192,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis { SingleProducerSingleConsumerPipe.connect(merger.outputPort, printingMerger.getNewInputPort()); - final IPipeline pipeline = new IPipeline() { - @Override - @SuppressWarnings("unchecked") - public List<? extends IStage> getStartStages() { - return Arrays.asList(distributor); - } - - @Override - public List<IStage> getStages() { - return stages; - } - - @Override - public void fireStartNotification() throws Exception { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStarts(); - } - } - - @Override - public void fireStopNotification() { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStops(); - } - } - }; - + final Pipeline pipeline = new Pipeline(); + pipeline.setStartStages(startStages); + pipeline.setStages(stages); return pipeline; } @@ -245,6 +206,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis { outputWordsCountStage.setAccessesDeviceId(2); // add each stage to a stage list + final List<IStage> startStages = new LinkedList<IStage>(); + startStages.add(merger); + final List<IStage> stages = new LinkedList<IStage>(); stages.add(merger); stages.add(outputWordsCountStage); @@ -252,33 +216,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis { // connect stages by pipes QueuePipe.connect(merger.outputPort, outputWordsCountStage.fileWordcountTupleInputPort); - final IPipeline pipeline = new IPipeline() { - @Override - @SuppressWarnings("unchecked") - public List<? extends IStage> getStartStages() { - return Arrays.asList(merger); - } - - @Override - public List<IStage> getStages() { - return stages; - } - - @Override - public void fireStartNotification() throws Exception { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStarts(); - } - } - - @Override - public void fireStopNotification() { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStops(); - } - } - }; - + final Pipeline pipeline = new Pipeline(); + pipeline.setStartStages(startStages); + pipeline.setStages(stages); return pipeline; } @@ -327,8 +267,8 @@ public class ConcurrentCountWordsAnalysis extends Analysis { System.out.println(stage); // NOPMD (Just for example purposes) } -// final long durationInNs = thread.getDurationInNs(); -// System.out.println(thread + " takes " + TimeUnit.NANOSECONDS.toMillis(durationInNs) + " ms"); + // final long durationInNs = thread.getDurationInNs(); + // System.out.println(thread + " takes " + TimeUnit.NANOSECONDS.toMillis(durationInNs) + " ms"); } for (final WorkerThread thread : this.nonIoThreads) { @@ -337,16 +277,16 @@ public class ConcurrentCountWordsAnalysis extends Analysis { System.out.println(stage); // NOPMD (Just for example purposes) } -// final long durationInNs = thread.getDurationInNs(); -// System.out.println(thread + " takes " + TimeUnit.NANOSECONDS.toMillis(durationInNs) + " ms"); + // final long durationInNs = thread.getDurationInNs(); + // System.out.println(thread + " takes " + TimeUnit.NANOSECONDS.toMillis(durationInNs) + " ms"); -// if (durationInNs > maxDuration) { -// maxDuration = durationInNs; -// maxThread = thread; -// } + // if (durationInNs > maxDuration) { + // maxDuration = durationInNs; + // maxThread = thread; + // } } -// System.out.println("maxThread: " + maxThread.toString() + " takes " + TimeUnit.NANOSECONDS.toMillis(maxDuration) + " ms"); // NOPMD (Just for example - // purposes) + // System.out.println("maxThread: " + maxThread.toString() + " takes " + TimeUnit.NANOSECONDS.toMillis(maxDuration) + " ms"); // NOPMD (Just for example + // purposes) } } diff --git a/src/main/java/teetime/examples/countWords/CountWordsAnalysis.java b/src/main/java/teetime/examples/countWords/CountWordsAnalysis.java index c958a6e4..1760d8ad 100644 --- a/src/main/java/teetime/examples/countWords/CountWordsAnalysis.java +++ b/src/main/java/teetime/examples/countWords/CountWordsAnalysis.java @@ -17,14 +17,15 @@ package teetime.examples.countWords; import java.io.File; -import java.util.Arrays; import java.util.LinkedList; import java.util.List; import teetime.framework.core.AbstractFilter; import teetime.framework.core.Analysis; +import teetime.framework.core.IInputPort.PortState; import teetime.framework.core.IPipeline; import teetime.framework.core.IStage; +import teetime.framework.core.Pipeline; import teetime.framework.sequential.MethodCallPipe; import teetime.stage.basic.RepeaterSource; import teetime.stage.basic.distributor.Distributor; @@ -79,6 +80,9 @@ public class CountWordsAnalysis extends Analysis { final OutputWordsCountSink outputWordsCountStage = new OutputWordsCountSink(); // add each stage to a stage list + final List<IStage> startStages = new LinkedList<IStage>(); + startStages.add(repeaterSource); + final List<IStage> stages = new LinkedList<IStage>(); stages.add(repeaterSource); stages.add(findFilesStage); @@ -98,34 +102,11 @@ public class CountWordsAnalysis extends Analysis { MethodCallPipe.connect(merger.outputPort, outputWordsCountStage.fileWordcountTupleInputPort); repeaterSource.START.setAssociatedPipe(new MethodCallPipe<Boolean>(Boolean.TRUE)); + repeaterSource.START.setState(PortState.CLOSED); - final IPipeline pipeline = new IPipeline() { - @Override - @SuppressWarnings("unchecked") - public List<? extends AbstractFilter<?>> getStartStages() { - return Arrays.asList(repeaterSource); - } - - @Override - public List<IStage> getStages() { - return stages; - } - - @Override - public void fireStartNotification() throws Exception { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStarts(); - } - } - - @Override - public void fireStopNotification() { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStops(); - } - } - }; - + final Pipeline pipeline = new Pipeline(); + pipeline.setStartStages(startStages); + pipeline.setStages(stages); return pipeline; } diff --git a/src/main/java/teetime/examples/countWords/QueuedCountWordsAnalysis.java b/src/main/java/teetime/examples/countWords/QueuedCountWordsAnalysis.java index 3047df1c..afb82bbc 100644 --- a/src/main/java/teetime/examples/countWords/QueuedCountWordsAnalysis.java +++ b/src/main/java/teetime/examples/countWords/QueuedCountWordsAnalysis.java @@ -17,7 +17,6 @@ package teetime.examples.countWords; import java.io.File; -import java.util.Arrays; import java.util.LinkedList; import java.util.List; @@ -25,8 +24,10 @@ import teetime.framework.concurrent.StageTerminationPolicy; import teetime.framework.concurrent.WorkerThread; import teetime.framework.core.AbstractFilter; import teetime.framework.core.Analysis; +import teetime.framework.core.IInputPort.PortState; import teetime.framework.core.IPipeline; import teetime.framework.core.IStage; +import teetime.framework.core.Pipeline; import teetime.framework.sequential.MethodCallPipe; import teetime.framework.sequential.QueuePipe; import teetime.stage.basic.RepeaterSource; @@ -81,6 +82,9 @@ public class QueuedCountWordsAnalysis extends Analysis { final OutputWordsCountSink outputWordsCountStage = new OutputWordsCountSink(); // add each stage to a stage list + final List<IStage> startStages = new LinkedList<IStage>(); + startStages.add(repeaterSource); + final List<IStage> stages = new LinkedList<IStage>(); stages.add(repeaterSource); stages.add(findFilesStage); @@ -100,34 +104,11 @@ public class QueuedCountWordsAnalysis extends Analysis { QueuePipe.connect(merger.outputPort, outputWordsCountStage.fileWordcountTupleInputPort); repeaterSource.START.setAssociatedPipe(new MethodCallPipe<Boolean>(Boolean.TRUE)); + repeaterSource.START.setState(PortState.CLOSED); - final IPipeline pipeline = new IPipeline() { - @Override - @SuppressWarnings("unchecked") - public List<? extends IStage> getStartStages() { - return Arrays.asList(repeaterSource); - } - - @Override - public List<IStage> getStages() { - return stages; - } - - @Override - public void fireStartNotification() throws Exception { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStarts(); - } - } - - @Override - public void fireStopNotification() { - for (final IStage stage : this.getStartStages()) { - stage.notifyPipelineStops(); - } - } - }; - + final Pipeline pipeline = new Pipeline(); + pipeline.setStartStages(startStages); + pipeline.setStages(stages); return pipeline; } diff --git a/src/main/java/teetime/framework/concurrent/StageWorkArrayList.java b/src/main/java/teetime/framework/concurrent/StageWorkArrayList.java index 9f70d0b7..6f9f2c3f 100644 --- a/src/main/java/teetime/framework/concurrent/StageWorkArrayList.java +++ b/src/main/java/teetime/framework/concurrent/StageWorkArrayList.java @@ -15,21 +15,15 @@ ***************************************************************************/ package teetime.framework.concurrent; -import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; import teetime.framework.core.IOutputPort; -import teetime.framework.core.IPipe; -import teetime.framework.core.IPipeCommand; import teetime.framework.core.IPipeline; import teetime.framework.core.IStage; /** * @author Christian Wulf - * + * * @since 1.10 */ public class StageWorkArrayList implements IStageWorkList { @@ -41,7 +35,6 @@ public class StageWorkArrayList implements IStageWorkList { public int numToBeExecuted; } - private final IPipeline pipeline; private final int accessesDeviceId; /** sorted array where the last stage has highest priority */ @@ -53,75 +46,25 @@ public class StageWorkArrayList implements IStageWorkList { * @since 1.10 */ public StageWorkArrayList(final IPipeline pipeline, final int accessesDeviceId) { - this.pipeline = pipeline; this.accessesDeviceId = accessesDeviceId; - final List<IStage> localStages = this.init(); - this.stages = new SchedulableStage[localStages.size()]; - for (int i = 0; i < localStages.size(); i++) { + this.stages = new SchedulableStage[pipeline.getStages().size()]; + for (IStage stage : pipeline.getStages()) { final SchedulableStage schedulableStage = new SchedulableStage(); - schedulableStage.stage = localStages.get(i); + schedulableStage.stage = stage; schedulableStage.numToBeExecuted = 0; - this.stages[i] = schedulableStage; - } - } - - private List<IStage> init() { - this.setDepthForEachStage(); - - final List<IStage> stageList = new ArrayList<IStage>(this.pipeline.getStages()); - final Comparator<? super IStage> depthComparator = new Comparator<IStage>() { - public int compare(final IStage o1, final IStage o2) { - if (o1.getDepth() == o2.getDepth()) { - return 0; - } else if (o1.getDepth() < o2.getDepth()) { - return -1; - } else { - return 1; - } - } - }; - - Collections.sort(stageList, depthComparator); - - for (int i = 0; i < stageList.size(); i++) { - stageList.get(i).setSchedulingIndex(i); - } - - return stageList; - } - - private void setDepthForEachStage() { - final IPipeCommand setDepthCommand = new IPipeCommand() { - public void execute(final IPipe<?> pipe) throws Exception { - final IStage sourceStage = pipe.getSourcePort().getOwningStage(); - final IStage owningStage = pipe.getTargetPort().getOwningStage(); - if (owningStage.getDepth() == IStage.DEPTH_NOT_SET) { - owningStage.setDepth(sourceStage.getDepth() + 1); - owningStage.notifyOutputPipes(this); - } - } - }; - - for (final IStage startStage : this.pipeline.getStartStages()) { - startStage.setDepth(0); - } - - for (final IStage startStage : this.pipeline.getStartStages()) { - try { - startStage.notifyOutputPipes(setDepthCommand); - } catch (final Exception e) { - throw new IllegalStateException("may not happen", e); - } + this.stages[stage.getSchedulingIndex()] = schedulableStage; } } + @Override public void pushAll(final Collection<? extends IStage> stages) { for (final IStage stage : stages) { this.push(stage); } } + @Override public void pushAll(final IOutputPort<?, ?>[] outputPorts) { for (final IOutputPort<?, ?> outputPort : outputPorts) { if (outputPort != null) { @@ -148,12 +91,12 @@ public class StageWorkArrayList implements IStageWorkList { return isValid; } + @Override public IStage pop() { final SchedulableStage schedulableStage = this.stages[this.lastIndex]; // schedulableStage.numToBeExecuted--; schedulableStage.numToBeExecuted = 0; - cond: - if (schedulableStage.numToBeExecuted == 0) + cond: if (schedulableStage.numToBeExecuted == 0) { for (int i = this.lastIndex - 1; i >= this.firstIndex; i--) { if (this.stages[i].numToBeExecuted > 0) { @@ -167,11 +110,13 @@ public class StageWorkArrayList implements IStageWorkList { return schedulableStage.stage; } + @Override public IStage read() { final SchedulableStage schedulableStage = this.stages[this.lastIndex]; return schedulableStage.stage; } + @Override public boolean isEmpty() { return this.lastIndex == -1; } diff --git a/src/main/java/teetime/framework/concurrent/WorkerThread.java b/src/main/java/teetime/framework/concurrent/WorkerThread.java index ca1e5e77..d1dff2d1 100644 --- a/src/main/java/teetime/framework/concurrent/WorkerThread.java +++ b/src/main/java/teetime/framework/concurrent/WorkerThread.java @@ -16,11 +16,20 @@ package teetime.framework.concurrent; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import teetime.framework.core.IInputPort; +import teetime.framework.core.IInputPort.PortState; +import teetime.framework.core.IPipe; +import teetime.framework.core.IPipeCommand; import teetime.framework.core.IPipeline; import teetime.framework.core.IStage; +import teetime.framework.scheduling.NextStageScheduler; +import teetime.framework.scheduling.StageStateManager; import teetime.util.StopWatch; /** @@ -30,8 +39,11 @@ import teetime.util.StopWatch; */ public class WorkerThread extends Thread { + private static final int NUM_ITERATIONS_TO_MEASURE = 10000; + private final IPipeline pipeline; private IStageScheduler stageScheduler; + private StageStateManager stageStateManager; private volatile StageTerminationPolicy terminationPolicy; private volatile boolean shouldTerminate = false; @@ -40,15 +52,72 @@ public class WorkerThread extends Thread { // statistics private final StopWatch stopWatch = new StopWatch(); - private final List<Long> durationPer10000IterationsInNs = new LinkedList<Long>(); + private final List<Long> durationPerXIterationsInNs = new LinkedList<Long>(); private int iterations; public WorkerThread(final IPipeline pipeline, final int accessesDeviceId) { this.pipeline = pipeline; + this.accessesDeviceId = accessesDeviceId; + } + + private void initStages(final IPipeline pipeline) { for (final IStage stage : pipeline.getStages()) { stage.setOwningThread(this); } - this.accessesDeviceId = accessesDeviceId; + + this.setDepthForEachStage(pipeline); + this.setSchedulingIndexForEachhStage(pipeline); + } + + private void setDepthForEachStage(final IPipeline pipeline) { + final IPipeCommand setDepthCommand = new IPipeCommand() { + @Override + public void execute(final IPipe<?> pipe) throws Exception { + final IStage sourceStage = pipe.getSourcePort().getOwningStage(); + final IStage owningStage = pipe.getTargetPort().getOwningStage(); + if (owningStage.getDepth() == IStage.DEPTH_NOT_SET) { + owningStage.setDepth(sourceStage.getDepth() + 1); + owningStage.notifyOutputPipes(this); + } + } + }; + + for (final IStage startStage : pipeline.getStartStages()) { + startStage.setDepth(0); + } + + for (final IStage startStage : pipeline.getStartStages()) { + try { + startStage.notifyOutputPipes(setDepthCommand); + } catch (final Exception e) { + throw new IllegalStateException("may not happen", e); + } + } + } + + private List<IStage> setSchedulingIndexForEachhStage(final IPipeline pipeline) { + final List<IStage> stageList = new ArrayList<IStage>(pipeline.getStages()); + + final Comparator<? super IStage> depthComparator = new Comparator<IStage>() { + @Override + public int compare(final IStage o1, final IStage o2) { + if (o1.getDepth() == o2.getDepth()) { + return 0; + } else if (o1.getDepth() < o2.getDepth()) { + return -1; + } else { + return 1; + } + } + }; + + Collections.sort(stageList, depthComparator); + + for (int i = 0; i < stageList.size(); i++) { + stageList.get(i).setSchedulingIndex(i); + } + + return stageList; } @Override @@ -94,38 +163,37 @@ public class WorkerThread extends Thread { // stageExecutionStopWatch.getDurationInNs(); //4952 // 6268 -> 5350 (w/o after) -> 4450 (w/o before) -> 3800 (w/o stage) -// final long schedulingOverhead = this.iterationStopWatch.getDurationInNs(); + // final long schedulingOverhead = this.iterationStopWatch.getDurationInNs(); // final long schedulingOverhead = beforeStageExecutionStopWatch.getDurationInNs(); //327 // final long schedulingOverhead = stageExecutionStopWatch.getDurationInNs(); //1416 // final long schedulingOverhead = afterStageExecutionStopWatch.getDurationInNs(); //2450 // rest: ~2000 (measurement overhead?) - if ((iterations % 10000) == 0) { + if ((this.iterations % NUM_ITERATIONS_TO_MEASURE) == 0) { this.stopWatch.end(); - this.durationPer10000IterationsInNs.add(stopWatch.getDurationInNs()); + this.durationPerXIterationsInNs.add(this.stopWatch.getDurationInNs()); this.stopWatch.start(); } } this.stopWatch.end(); - this.durationPer10000IterationsInNs.add(stopWatch.getDurationInNs()); + this.durationPerXIterationsInNs.add(this.stopWatch.getDurationInNs()); this.cleanUpDatastructures(); } private void executeTerminationPolicy(final IStage executedStage, final boolean executedSuccessfully) { - // System.out.println("WorkerThread.executeTerminationPolicy(): " + this.terminationPolicy + - // ", executedSuccessfully=" + executedSuccessfully - // + ", mayBeDisabled=" + executedStage.mayBeDisabled()); +// System.out.println("executeTerminationPolicy executedStage=" + executedStage + ", executedSuccessfully=" + executedSuccessfully); +// System.out.println("executeTerminationPolicy areAllInputPortsClosed(executedStage)=" + this.stageStateManager.areAllInputPortsClosed(executedStage)); switch (this.terminationPolicy) { case TERMINATE_STAGE_AFTER_NEXT_EXECUTION: - if (executedStage.mayBeDisabled()) { + if (this.stageStateManager.areAllInputPortsClosed(executedStage)) { this.stageScheduler.disable(executedStage); } break; case TERMINATE_STAGE_AFTER_UNSUCCESSFUL_EXECUTION: if (!executedSuccessfully) { - if (executedStage.mayBeDisabled()) { + if (this.stageStateManager.areAllInputPortsClosed(executedStage)) { this.stageScheduler.disable(executedStage); } } @@ -141,8 +209,20 @@ public class WorkerThread extends Thread { } private void initDatastructures() throws Exception { + // stages need to be initialized here, because in a concurrent context some stages (e.g., a merger) is executed after its pipeline has been created. + this.initStages(this.pipeline); + this.stageStateManager = new StageStateManager(this.pipeline); + this.stageScheduler = new NextStageScheduler(this.pipeline, this.accessesDeviceId, this.stageStateManager); + + for (final IStage startStage : this.pipeline.getStartStages()) { + for (IInputPort<IStage, ?> inputPort : startStage.getInputPorts()) { + if (inputPort.getState() == PortState.CLOSED) { + inputPort.close(); + } + } + } + this.pipeline.fireStartNotification(); - this.stageScheduler = new NextStageScheduler(this.pipeline, this.accessesDeviceId); } private void startStageExecution(final IStage stage) { @@ -150,18 +230,13 @@ public class WorkerThread extends Thread { } private void finishStageExecution(final IStage stage, final boolean executedSuccessfully) { - // System.out.println("Executed stage " + stage + " successfully: " + executedSuccessfully); if (!executedSuccessfully) { // statistics this.executedUnsuccessfullyCount++; } } private void cleanUpDatastructures() { - // System.out.println("Cleaning up datastructures..."); - // System.out.println("Firing stop notification..."); this.pipeline.fireStopNotification(); - // System.out.println("Thread terminated:" + this); - // System.out.println(this.getName() + ": executedUnsuccessfullyCount=" + this.executedUnsuccessfullyCount); } public IPipeline getPipeline() { @@ -171,9 +246,11 @@ public class WorkerThread extends Thread { // BETTER remove this method since it is not intuitive; add a check to onStartPipeline so that a stage automatically // disables itself if it has no input ports public void terminate(final StageTerminationPolicy terminationPolicyToUse) { - for (final IStage startStage : this.pipeline.getStartStages()) { - startStage.fireSignalClosingToAllInputPorts(); - } +// for (final IStage startStage : this.pipeline.getStartStages()) { +// if (this.stageStateManager.areAllInputPortsClosed(startStage)) { +// startStage.fireSignalClosingToAllInputPorts(); +// } +// } this.setTerminationPolicy(terminationPolicyToUse); } @@ -193,14 +270,14 @@ public class WorkerThread extends Thread { } public List<Long> getDurationPer10000IterationsInNs() { - return durationPer10000IterationsInNs; + return this.durationPerXIterationsInNs; } /** * @since 1.10 */ public int getIterations() { - return iterations; + return this.iterations; } } diff --git a/src/main/java/teetime/framework/concurrent/steal/StealIfMayBeDisabledStrategy.java b/src/main/java/teetime/framework/concurrent/steal/StealIfMayBeDisabledStrategy.java deleted file mode 100644 index f153f60b..00000000 --- a/src/main/java/teetime/framework/concurrent/steal/StealIfMayBeDisabledStrategy.java +++ /dev/null @@ -1,44 +0,0 @@ -/*************************************************************************** - * Copyright 2014 Kieker Project (http://kieker-monitoring.net) - * - * Licensed 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 teetime.framework.concurrent.steal; - -import java.util.Collection; - -import teetime.framework.concurrent.ConcurrentWorkStealingPipe; -import teetime.framework.core.IInputPort; -import teetime.framework.core.IStage; - -/** - * @author Christian Wulf - * - * @since 1.10 - */ -public class StealIfMayBeDisabledStrategy<T> implements IStealStrategy<T> { - - public <S extends IStage> T steal(final IInputPort<S, T> inputPort, final Collection<ConcurrentWorkStealingPipe<T>> pipesToStealFrom) { - if (inputPort.getOwningStage().mayBeDisabled()) { - for (final ConcurrentWorkStealingPipe<T> pipe : pipesToStealFrom) { - final T stolenElement = pipe.steal(); - if (stolenElement != null) { - return stolenElement; - } - } - } - // BETTER improve stealing efficiency by stealing multiple elements at once - return null; // do not expose internal impl details (here: CircularWorkStealingDeque); instead return null - } - -} diff --git a/src/main/java/teetime/framework/core/AbstractFilter.java b/src/main/java/teetime/framework/core/AbstractFilter.java index 16b7cabb..6222eabb 100644 --- a/src/main/java/teetime/framework/core/AbstractFilter.java +++ b/src/main/java/teetime/framework/core/AbstractFilter.java @@ -34,9 +34,7 @@ import teetime.util.concurrent.workstealing.exception.DequePopException; * the extending stage * */ -public abstract class AbstractFilter<S extends IStage> extends AbstractStage implements ISink<S>, ISource, IPortListener<S> { - - protected volatile boolean mayBeDisabled; // BETTER write only non-concurrent code in a stage +public abstract class AbstractFilter<S extends IStage> extends AbstractStage implements ISink<S>, ISource { /** * @author Christian Wulf @@ -78,7 +76,6 @@ public abstract class AbstractFilter<S extends IStage> extends AbstractStage imp } }; - private int enabledInputPorts = 0; /** * 0=in-memory, x>0=disk0, disk1, display0, display1, socket0, socket1 etc. */ @@ -172,48 +169,6 @@ public abstract class AbstractFilter<S extends IStage> extends AbstractStage imp // default empty implementation } - /** - * @since 1.10 - */ - @Override - public void onPortIsClosed(final IInputPort<S, ?> inputPort) { - // inputPort.setState(IInputPort.State.CLOSING); - this.enabledInputPorts--; // FIXME not thread-safe - // this.logger.info("Closed " + "(" + this.enabledInputPorts + " remaining) " + inputPort + " of " + this); - - if (this.enabledInputPorts < 0) { - this.logger.error("Closed port more than once: portIndex=" + inputPort.getIndex() + " for stage " + this); - } - - this.checkWhetherThisStageMayBeDisabled(); - } - - /** - * @since 1.10 - */ - private void checkWhetherThisStageMayBeDisabled() { - if (this.enabledInputPorts == 0) { - this.mayBeDisabled = true; - // this.logger.info(this.toString() + " can now be disabled by the pipeline scheduler."); - } - } - - /** - * @since 1.10 - */ - @Override - public void fireSignalClosingToAllInputPorts() { - // this.logger.info("Fire closing signal to all input ports of: " + this); - - if (!this.inputPorts.isEmpty()) { - for (final IInputPort<S, ?> port : this.inputPorts) { - port.close(); - } - } else { - this.checkWhetherThisStageMayBeDisabled(); - } - } - /** * @since 1.10 */ @@ -222,18 +177,10 @@ public abstract class AbstractFilter<S extends IStage> extends AbstractStage imp try { this.notifyOutputPipes(this.closeCommand); } catch (final Exception e) { - throw new IllegalStateException("may not happen"); + throw new IllegalStateException("may not happen", e); } } - /** - * @since 1.10 - */ - @Override - public boolean mayBeDisabled() { - return this.mayBeDisabled; - } - @Override public String toString() { final String s = super.toString(); @@ -250,8 +197,6 @@ public abstract class AbstractFilter<S extends IStage> extends AbstractStage imp final InputPortImpl<S, T> inputPort = new InputPortImpl<S, T>((S) this); inputPort.setIndex(this.inputPorts.size()); this.inputPorts.add(inputPort); - inputPort.setPortListener(this); - this.enabledInputPorts++; return inputPort; } diff --git a/src/main/java/teetime/framework/core/AbstractPipe.java b/src/main/java/teetime/framework/core/AbstractPipe.java index 1e596bf5..14ed5f78 100644 --- a/src/main/java/teetime/framework/core/AbstractPipe.java +++ b/src/main/java/teetime/framework/core/AbstractPipe.java @@ -18,9 +18,9 @@ package teetime.framework.core; /** * @author Christian Wulf - * + * * @since 1.10 - * + * * @param <T> * The type of the pipe * @param <P> @@ -30,7 +30,7 @@ public abstract class AbstractPipe<T> implements IPipe<T> { /** * @author Christian Wulf - * + * * @since 1.10 */ public enum PipeState { @@ -42,19 +42,23 @@ public abstract class AbstractPipe<T> implements IPipe<T> { private IOutputPort<?, ? extends T> sourcePort; private IInputPort<?, T> targetPort; + @Override public IOutputPort<?, ? extends T> getSourcePort() { return this.sourcePort; } + @Override public IInputPort<?, T> getTargetPort() { return this.targetPort; } + @Override public <S extends ISource, A extends T> void setSourcePort(final IOutputPort<S, A> sourcePort) { sourcePort.setAssociatedPipe(this); this.sourcePort = sourcePort; } + @Override public <S extends ISink<S>, A extends T> void setTargetPort(final IInputPort<S, T> targetPort) { targetPort.setAssociatedPipe(this); this.targetPort = targetPort; @@ -63,6 +67,7 @@ public abstract class AbstractPipe<T> implements IPipe<T> { // BETTER remove if it does not add any new functionality protected abstract void putInternal(T token); + @Override public void put(final T token) { this.putInternal(token); } @@ -70,10 +75,12 @@ public abstract class AbstractPipe<T> implements IPipe<T> { // BETTER remove if it does not add any new functionality protected abstract T tryTakeInternal(); + @Override public final T tryTake() { return this.tryTakeInternal(); } + @Override public final void notifyPipelineStarts() throws Exception { if (this.state == PipeState.UNINITIALIZED) { this.state = PipeState.PIPELINE_STARTED; @@ -84,13 +91,14 @@ public abstract class AbstractPipe<T> implements IPipe<T> { /** * This method is called exactly once iff the pipeline is started. - * + * * @since 1.10 */ public void onPipelineStarts() { // empty default implementation } + @Override public final void notifyPipelineStops() { if (this.state != PipeState.PIPELINE_STOPPED) { this.state = PipeState.PIPELINE_STOPPED; @@ -101,13 +109,14 @@ public abstract class AbstractPipe<T> implements IPipe<T> { /** * This method is called exactly once iff the pipeline is stopped. - * + * * @since 1.10 */ public void onPipelineStops() { // empty default implementation } + @Override public void close() { this.targetPort.close(); } diff --git a/src/main/java/teetime/framework/core/IInputPort.java b/src/main/java/teetime/framework/core/IInputPort.java index 3d834da7..d463e074 100644 --- a/src/main/java/teetime/framework/core/IInputPort.java +++ b/src/main/java/teetime/framework/core/IInputPort.java @@ -1,9 +1,9 @@ package teetime.framework.core; /** - * + * * @author Christian Wulf - * + * * @param <S> * the stage, this port belongs to<br> * <i>(used for ensuring type safety)</i> @@ -14,24 +14,24 @@ public interface IInputPort<S extends IStage, T> extends IPort<S, T> { /** * @since 1.10 */ - enum State { - OPEN, CLOSING + public enum PortState { + OPENED, CLOSED } /** * @since 1.10 */ - public abstract State getState(); + public abstract PortState getState(); /** * @since 1.10 */ - public abstract void setState(final State state); + public abstract void setState(final PortState state); /** * @since 1.10 */ - public abstract void setPortListener(final IPortListener<S> stageListener); + public abstract void setPortListener(final IPortListener portListener); /** * @since 1.10 diff --git a/src/main/java/teetime/framework/core/IPortListener.java b/src/main/java/teetime/framework/core/IPortListener.java index 71b05c98..b7783c32 100644 --- a/src/main/java/teetime/framework/core/IPortListener.java +++ b/src/main/java/teetime/framework/core/IPortListener.java @@ -17,10 +17,10 @@ package teetime.framework.core; /** * @author Christian Wulf - * + * * @since 1.10 */ -public interface IPortListener<S extends IStage> { +public interface IPortListener { - void onPortIsClosed(IInputPort<S, ?> inputPort); + void onPortIsClosed(IInputPort<?, ?> inputPort); } diff --git a/src/main/java/teetime/framework/core/IStage.java b/src/main/java/teetime/framework/core/IStage.java index 19c68d9d..bda94d98 100644 --- a/src/main/java/teetime/framework/core/IStage.java +++ b/src/main/java/teetime/framework/core/IStage.java @@ -69,24 +69,11 @@ public interface IStage extends IBaseStage { // an overloaded version with a task bundle of one single input port is useless. // void execute(TaskBundle taskBundle); - /** - * - * @return <code>true</code> if the stage may be disabled by the pipeline scheduler, <code>false</code> otherwise. - * - * @since 1.10 - */ - boolean mayBeDisabled(); - /** * @since 1.10 */ void fireSignalClosingToAllOutputPorts(); - /** - * @since 1.10 - */ - void fireSignalClosingToAllInputPorts(); - /** * @since 1.10 */ diff --git a/src/main/java/teetime/framework/core/InputPortImpl.java b/src/main/java/teetime/framework/core/InputPortImpl.java index fb9c6c2e..021ab567 100644 --- a/src/main/java/teetime/framework/core/InputPortImpl.java +++ b/src/main/java/teetime/framework/core/InputPortImpl.java @@ -18,28 +18,35 @@ package teetime.framework.core; class InputPortImpl<S extends IStage, T> extends AbstractPort<S, T> implements IInputPort<S, T> { - private volatile State state = State.OPEN; + private volatile PortState state = PortState.OPENED; - private IPortListener<S> stageListener; + private IPortListener portListener; public InputPortImpl(final S owningStage) { this.setOwningStage(owningStage); } - public void setState(final State state) { + @Override + public void setState(final PortState state) { this.state = state; } - public State getState() { + @Override + public PortState getState() { return this.state; } - public void setPortListener(final IPortListener<S> stageListener) { - this.stageListener = stageListener; + @Override + public void setPortListener(final IPortListener portListener) { + this.portListener = portListener; } + @Override public void close() { - this.stageListener.onPortIsClosed(this); + if (this.portListener == null) { + throw new NullPointerException("stage: "+this.getOwningStage().getClass().getName()+", port="+this.getIndex()); + } + this.portListener.onPortIsClosed(this); } } diff --git a/src/main/java/teetime/framework/concurrent/NextStageScheduler.java b/src/main/java/teetime/framework/scheduling/NextStageScheduler.java similarity index 76% rename from src/main/java/teetime/framework/concurrent/NextStageScheduler.java rename to src/main/java/teetime/framework/scheduling/NextStageScheduler.java index 82263b5b..ef7fa67f 100644 --- a/src/main/java/teetime/framework/concurrent/NextStageScheduler.java +++ b/src/main/java/teetime/framework/scheduling/NextStageScheduler.java @@ -14,13 +14,14 @@ * limitations under the License. ***************************************************************************/ -package teetime.framework.concurrent; +package teetime.framework.scheduling; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.LinkedHashSet; +import java.util.Set; +import teetime.framework.concurrent.IStageScheduler; +import teetime.framework.concurrent.IStageWorkList; +import teetime.framework.concurrent.StageWorkArrayList; import teetime.framework.core.IOutputPort; import teetime.framework.core.IPipeline; import teetime.framework.core.IStage; @@ -30,13 +31,14 @@ import teetime.framework.core.IStage; * * @since 1.10 */ -public class NextStageScheduler implements IStageScheduler { +public final class NextStageScheduler implements IStageScheduler { - protected final Map<IStage, Boolean> statesOfStages = new HashMap<IStage, Boolean>(); - private final Collection<IStage> highestPrioritizedEnabledStages = new ArrayList<IStage>(); + private final Set<IStage> highestPrioritizedEnabledStages = new LinkedHashSet<IStage>(); private final IStageWorkList workList; + private final StageStateManager stageStateManager; - public NextStageScheduler(final IPipeline pipeline, final int accessesDeviceId) throws Exception { + public NextStageScheduler(final IPipeline pipeline, final int accessesDeviceId, final StageStateManager stageStateManager) { + this.stageStateManager = stageStateManager; // this.workList = new StageWorkList(accessesDeviceId, pipeline.getStages().size()); this.workList = new StageWorkArrayList(pipeline, accessesDeviceId); // faster implementation @@ -45,10 +47,6 @@ public class NextStageScheduler implements IStageScheduler { this.workList.pushAll(this.highestPrioritizedEnabledStages); // System.out.println("Initial work list: " + this.workList); // this.workList.addAll(pipeline.getStages()); - - for (final IStage stage : pipeline.getStages()) { - this.enable(stage); - } } @Override @@ -58,28 +56,23 @@ public class NextStageScheduler implements IStageScheduler { @Override public boolean isAnyStageActive() { - // System.out.println("workList: " + this.workList); return !this.workList.isEmpty(); } - protected void enable(final IStage stage) { - // // / TODO consider to move state (enabled/disabled) of stage to stage for performance reasons - this.statesOfStages.put(stage, Boolean.TRUE); - } - @Override public void disable(final IStage stage) { - this.statesOfStages.put(stage, Boolean.FALSE); + this.stageStateManager.disable(stage); if (this.highestPrioritizedEnabledStages.contains(stage)) { this.highestPrioritizedEnabledStages.remove(stage); for (final IStage outputStage : stage.getAllOutputStages()) { - if (this.statesOfStages.get(outputStage) == Boolean.TRUE) { + if (this.stageStateManager.isStageEnabled(outputStage)) { this.highestPrioritizedEnabledStages.add(outputStage); } } } +// System.out.println("highestPrioritizedEnabledStages: "+this.highestPrioritizedEnabledStages); stage.fireSignalClosingToAllOutputPorts(); } diff --git a/src/main/java/teetime/framework/scheduling/StageStateContainer.java b/src/main/java/teetime/framework/scheduling/StageStateContainer.java new file mode 100644 index 00000000..667d639d --- /dev/null +++ b/src/main/java/teetime/framework/scheduling/StageStateContainer.java @@ -0,0 +1,25 @@ +package teetime.framework.scheduling; + +import teetime.framework.core.IStage; + +public abstract class StageStateContainer { + + public static enum StageState { + ENABLED, ALL_INPUT_PORTS_CLOSED, DISABLED + } + + protected final IStage stage; + protected volatile StageState stageState; + + public StageStateContainer(final IStage stage) { + this.stage = stage; + this.stageState = stage.getInputPorts().size() > 0 ? StageState.ENABLED : StageState.ALL_INPUT_PORTS_CLOSED; +// System.out.println("stage=" + stage + ", stageState=" + this.stageState); + } + + /** + * + * @return the new value + */ + public abstract int decNumOpenedPorts(); +} diff --git a/src/main/java/teetime/framework/scheduling/StageStateManager.java b/src/main/java/teetime/framework/scheduling/StageStateManager.java new file mode 100644 index 00000000..6412ae9b --- /dev/null +++ b/src/main/java/teetime/framework/scheduling/StageStateManager.java @@ -0,0 +1,84 @@ +package teetime.framework.scheduling; + +import java.util.Arrays; + +import teetime.framework.core.IInputPort; +import teetime.framework.core.IPipeline; +import teetime.framework.core.IPortListener; +import teetime.framework.core.IStage; +import teetime.framework.scheduling.StageStateContainer.StageState; + +public final class StageStateManager implements IPortListener { + + private final StageStateContainer[] stageStateContainers; + + public StageStateManager(final IPipeline pipeline) { + this.stageStateContainers = this.initStageStateContainers(pipeline); + this.registerAtAllInputPorts(pipeline); + } + + private void registerAtAllInputPorts(final IPipeline pipeline) { + for (IStage stage : pipeline.getStages()) { + for (IInputPort<IStage, ?> inputPort : stage.getInputPorts()) { + inputPort.setPortListener(this); + } + } + } + + private StageStateContainer[] initStageStateContainers(final IPipeline pipeline) { + StageStateContainer[] stageStateContainers = new StageStateContainer[pipeline.getStages().size()]; + for (IStage stage : pipeline.getStages()) { + StageStateContainer stageStateContainer; + if (this.isConnectedWithAnotherThread(stage)) { + stageStateContainer = new SynchronizedStageStateContainer(stage); + } else { + stageStateContainer = new UnsynchronizedStageStateContainer(stage); + } + stageStateContainers[stage.getSchedulingIndex()] = stageStateContainer; + } + return stageStateContainers; + } + + private boolean isConnectedWithAnotherThread(final IStage stage) { + // TODO Auto-generated method stub + return true; + } + + @Override + public void onPortIsClosed(final IInputPort<?, ?> inputPort) { + StageStateContainer stageStateContainer = this.getStageStateContainer(inputPort.getOwningStage()); + + int newNumOpenedPorts = stageStateContainer.decNumOpenedPorts(); + if (newNumOpenedPorts == 0) { + stageStateContainer.stageState = StageState.ALL_INPUT_PORTS_CLOSED; +// System.out.println("Closed stage: " + stageStateContainer.stage); + } else if (newNumOpenedPorts < 0) { + // TODO log warning + // this.logger.warning("Closed port more than once: portIndex=" + inputPort.getIndex() + " for stage " + this); + } + } + + public boolean areAllInputPortsClosed(final IStage stage) { + StageStateContainer stageStateContainer = this.getStageStateContainer(stage); + return stageStateContainer.stageState == StageState.ALL_INPUT_PORTS_CLOSED; + } + + public boolean isStageEnabled(final IStage stage) { + StageStateContainer stageStateContainer = this.getStageStateContainer(stage); + return stageStateContainer.stageState == StageState.ENABLED; + } + + public void disable(final IStage stage) { + StageStateContainer stageStateContainer = this.getStageStateContainer(stage); + stageStateContainer.stageState = StageState.DISABLED; + } + + private StageStateContainer getStageStateContainer(final IStage stage) { + int schedulingIndex = stage.getSchedulingIndex(); + StageStateContainer stageStateContainer = this.stageStateContainers[schedulingIndex]; + if (stageStateContainer == null) { + throw new NullPointerException("No container found for index ="+schedulingIndex+"\n=> stageStateContainers="+Arrays.asList(this.stageStateContainers)); + } + return stageStateContainer; + } +} diff --git a/src/main/java/teetime/framework/scheduling/SynchronizedStageStateContainer.java b/src/main/java/teetime/framework/scheduling/SynchronizedStageStateContainer.java new file mode 100644 index 00000000..9b70846a --- /dev/null +++ b/src/main/java/teetime/framework/scheduling/SynchronizedStageStateContainer.java @@ -0,0 +1,21 @@ +package teetime.framework.scheduling; + +import java.util.concurrent.atomic.AtomicInteger; + +import teetime.framework.core.IStage; + +public final class SynchronizedStageStateContainer extends StageStateContainer { + + private final AtomicInteger numOpenedPorts = new AtomicInteger(); + + public SynchronizedStageStateContainer(final IStage stage) { + super(stage); + this.numOpenedPorts.set(stage.getInputPorts().size()); + } + + @Override + public int decNumOpenedPorts() { + return this.numOpenedPorts.decrementAndGet(); + } + +} diff --git a/src/main/java/teetime/framework/scheduling/UnsynchronizedStageStateContainer.java b/src/main/java/teetime/framework/scheduling/UnsynchronizedStageStateContainer.java new file mode 100644 index 00000000..46556e99 --- /dev/null +++ b/src/main/java/teetime/framework/scheduling/UnsynchronizedStageStateContainer.java @@ -0,0 +1,19 @@ +package teetime.framework.scheduling; + +import teetime.framework.core.IStage; + +public final class UnsynchronizedStageStateContainer extends StageStateContainer { + + private int numOpenedInputPorts; + + public UnsynchronizedStageStateContainer(final IStage stage) { + super(stage); + this.numOpenedInputPorts = stage.getInputPorts().size(); + } + + @Override + public int decNumOpenedPorts() { + return --this.numOpenedInputPorts; + } + +} diff --git a/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java b/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java index a122c8ec..be0e8e86 100644 --- a/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java +++ b/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java @@ -19,14 +19,14 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; -import kieker.common.logging.LogFactory; - import org.junit.Before; import org.junit.Test; import teetime.util.StatisticsUtil; import teetime.util.StopWatch; +import kieker.common.logging.LogFactory; + /** * @author Christian Wulf * -- GitLab