Compare commits
No commits in common. "0.17" and "0.3" have entirely different histories.
116 changed files with 12870 additions and 6216 deletions
18
.classpath
18
.classpath
|
@ -2,16 +2,18 @@
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry kind="src" path="test"/>
|
<classpathentry kind="src" path="test"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/java-17-openjdk-amd64">
|
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
|
||||||
|
<classpathentry kind="lib" path="lib/hamcrest-core-1.3.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/junit-4.11.jar" sourcepath="lib/junit-4.11-sources.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/log4j-1.2.17.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/slf4j-api-1.7.5.jar" sourcepath="lib/slf4j-api-1.7.5-sources.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/slf4j-log4j12-1.7.5.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/commons-lang3-3.1.jar" sourcepath="lib/commons-lang3-3.1-sources.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/joda-time-2.3.jar"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="module" value="true"/>
|
<attribute name="owner.project.facets" value="java"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="lib" path="lib/UnitTesting/hamcrest-core-1.3.jar" sourcepath="lib/UnitTesting/hamcrest-core-1.3-sources.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/Logs/log4j-1.2.17.jar" sourcepath="lib/Logs/log4j-1.2.17-source.zip"/>
|
|
||||||
<classpathentry kind="lib" path="lib/UnitTesting/junit-4.12.jar" sourcepath="lib/UnitTesting/junit-4.12-sources.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/Logs/slf4j-api-1.7.25.jar" sourcepath="lib/Logs/slf4j-api-1.7.25-sources.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/Logs/slf4j-log4j12-1.7.25.jar" sourcepath="lib/Logs/slf4j-log4j12-1.7.25-sources.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/commons-lang3-3.13.0.jar" sourcepath="lib/commons-lang3-3.13.0-sources.jar"/>
|
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
2
.project
2
.project
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<projectDescription>
|
<projectDescription>
|
||||||
<name>devinsy-strings</name>
|
<name>devinsy-utils</name>
|
||||||
<comment></comment>
|
<comment></comment>
|
||||||
<projects>
|
<projects>
|
||||||
</projects>
|
</projects>
|
||||||
|
|
|
@ -1,34 +1,15 @@
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.codeComplete.argumentPrefixes=
|
|
||||||
org.eclipse.jdt.core.codeComplete.argumentSuffixes=
|
|
||||||
org.eclipse.jdt.core.codeComplete.fieldPrefixes=
|
|
||||||
org.eclipse.jdt.core.codeComplete.fieldSuffixes=
|
|
||||||
org.eclipse.jdt.core.codeComplete.localPrefixes=
|
|
||||||
org.eclipse.jdt.core.codeComplete.localSuffixes=
|
|
||||||
org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
|
|
||||||
org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
|
|
||||||
org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
|
|
||||||
org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
org.eclipse.jdt.core.compiler.compliance=17
|
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
org.eclipse.jdt.core.compiler.source=1.6
|
||||||
org.eclipse.jdt.core.compiler.release=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.source=17
|
|
||||||
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
|
|
||||||
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
|
|
||||||
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
|
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
|
||||||
org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
|
|
||||||
org.eclipse.jdt.core.formatter.align_with_spaces=false
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
|
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_annotation=0
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
|
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
|
||||||
|
@ -36,41 +17,25 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=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_arguments_in_qualified_allocation_expression=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
|
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
|
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_compact_if=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
|
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49
|
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
|
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
|
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
|
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
|
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
|
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_record_components=16
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
|
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
|
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=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_enum_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
|
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
|
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
|
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
|
|
||||||
org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=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_imports=1
|
||||||
org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0
|
|
||||||
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
|
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
|
||||||
org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1
|
|
||||||
org.eclipse.jdt.core.formatter.blank_lines_before_field=0
|
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_first_class_body_declaration=0
|
||||||
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
|
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
|
||||||
|
@ -79,7 +44,6 @@ 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_new_chunk=1
|
||||||
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
|
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_import_groups=1
|
||||||
org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0
|
|
||||||
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
|
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
|
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
|
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
|
||||||
|
@ -89,17 +53,11 @@ org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
|
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
|
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
|
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
|
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
|
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=next_line
|
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=next_line
|
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
|
org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
|
||||||
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
|
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
|
||||||
org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false
|
|
||||||
org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
|
|
||||||
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
|
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.clear_blank_lines_in_javadoc_comment=false
|
||||||
org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
|
|
||||||
org.eclipse.jdt.core.formatter.comment.format_block_comments=false
|
org.eclipse.jdt.core.formatter.comment.format_block_comments=false
|
||||||
org.eclipse.jdt.core.formatter.comment.format_header=false
|
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_html=true
|
||||||
|
@ -108,11 +66,9 @@ 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.format_source_code=true
|
||||||
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=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.indent_root_tags=true
|
||||||
org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
|
|
||||||
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
|
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
|
||||||
org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert
|
|
||||||
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
|
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
|
||||||
org.eclipse.jdt.core.formatter.comment.line_length=120
|
org.eclipse.jdt.core.formatter.comment.line_length=80
|
||||||
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
|
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
|
||||||
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
|
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
|
||||||
org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
|
org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
|
||||||
|
@ -126,7 +82,6 @@ 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_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_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_enum_declaration_header=true
|
||||||
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true
|
|
||||||
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_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=false
|
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=false
|
||||||
org.eclipse.jdt.core.formatter.indent_empty_lines=false
|
org.eclipse.jdt.core.formatter.indent_empty_lines=false
|
||||||
|
@ -135,7 +90,6 @@ 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_cases=true
|
||||||
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
|
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
|
||||||
org.eclipse.jdt.core.formatter.indentation.size=4
|
org.eclipse.jdt.core.formatter.indentation.size=4
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
|
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_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_method=insert
|
||||||
|
@ -144,7 +98,6 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=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_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_after_opening_brace_in_array_initializer=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
|
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
|
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=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_closing_brace_in_array_initializer=do not insert
|
||||||
|
@ -158,14 +111,11 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=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=insert
|
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
|
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
|
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=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=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_at_in_annotation_type_declaration=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=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_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_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_brace_in_block=insert
|
||||||
|
@ -191,16 +141,10 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arg
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
|
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
|
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
|
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
|
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=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_comma_in_type_parameters=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
|
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not 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_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_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_angle_bracket_in_type_parameters=do not insert
|
||||||
|
@ -217,7 +161,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not ins
|
||||||
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_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_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_parenthesized_expression=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=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_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_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_try=do not insert
|
||||||
|
@ -226,19 +169,13 @@ 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_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_conditional=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=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_semicolon_in_try_resources=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
|
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=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_at_in_annotation_type_declaration=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=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_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_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_angle_bracket_in_type_parameters=do not insert
|
||||||
|
@ -255,7 +192,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not in
|
||||||
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_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_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_parenthesized_expression=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=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_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_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_try=do not insert
|
||||||
|
@ -282,15 +218,10 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_ar
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=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_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_ellipsis=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=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_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_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_angle_bracket_in_type_parameters=do not insert
|
||||||
|
@ -302,8 +233,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_
|
||||||
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_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_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_method_declaration=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_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_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_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_allocation_expression=do not insert
|
||||||
|
@ -319,7 +248,6 @@ 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_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_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_parenthesized_expression=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=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_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_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_try=insert
|
||||||
|
@ -330,12 +258,9 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_prefix_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_conditional=insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
|
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=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_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_semicolon_in_try_resources=do not insert
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
|
|
||||||
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=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_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_braces_in_array_initializer=do not insert
|
||||||
|
@ -347,62 +272,20 @@ org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_decla
|
||||||
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=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=true
|
org.eclipse.jdt.core.formatter.join_lines_in_comments=true
|
||||||
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
|
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
|
||||||
org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=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_empty_array_initializer_on_one_line=false
|
||||||
org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
|
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
|
||||||
org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
|
|
||||||
org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
|
|
||||||
org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
|
|
||||||
org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
|
|
||||||
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
|
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
|
||||||
org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
|
|
||||||
org.eclipse.jdt.core.formatter.lineSplit=200
|
org.eclipse.jdt.core.formatter.lineSplit=200
|
||||||
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
|
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.never_indent_line_comments_on_first_column=false
|
||||||
org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0
|
|
||||||
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0
|
|
||||||
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
|
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
|
||||||
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0
|
|
||||||
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0
|
|
||||||
org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0
|
|
||||||
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
|
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
|
|
||||||
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
|
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.char=tab
|
||||||
org.eclipse.jdt.core.formatter.tabulation.size=4
|
org.eclipse.jdt.core.formatter.tabulation.size=4
|
||||||
org.eclipse.jdt.core.formatter.text_block_indentation=0
|
|
||||||
org.eclipse.jdt.core.formatter.use_on_off_tags=false
|
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.use_tabs_only_for_leading_indentations=false
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
|
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
|
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
|
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
|
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
|
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
|
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
|
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
|
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
|
|
||||||
org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
|
|
||||||
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
|
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
|
||||||
org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
|
|
||||||
|
|
|
@ -11,38 +11,27 @@ cleanup.always_use_blocks=true
|
||||||
cleanup.always_use_parentheses_in_expressions=false
|
cleanup.always_use_parentheses_in_expressions=false
|
||||||
cleanup.always_use_this_for_non_static_field_access=true
|
cleanup.always_use_this_for_non_static_field_access=true
|
||||||
cleanup.always_use_this_for_non_static_method_access=false
|
cleanup.always_use_this_for_non_static_method_access=false
|
||||||
cleanup.convert_functional_interfaces=false
|
|
||||||
cleanup.convert_to_enhanced_for_loop=false
|
cleanup.convert_to_enhanced_for_loop=false
|
||||||
cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
|
|
||||||
cleanup.correct_indentation=false
|
cleanup.correct_indentation=false
|
||||||
cleanup.format_source_code=true
|
cleanup.format_source_code=true
|
||||||
cleanup.format_source_code_changes_only=false
|
cleanup.format_source_code_changes_only=false
|
||||||
cleanup.insert_inferred_type_arguments=false
|
|
||||||
cleanup.lazy_logical_operator=false
|
|
||||||
cleanup.make_local_variable_final=false
|
cleanup.make_local_variable_final=false
|
||||||
cleanup.make_parameters_final=true
|
cleanup.make_parameters_final=true
|
||||||
cleanup.make_private_fields_final=false
|
cleanup.make_private_fields_final=false
|
||||||
cleanup.make_type_abstract_if_missing_method=false
|
cleanup.make_type_abstract_if_missing_method=false
|
||||||
cleanup.make_variable_declarations_final=true
|
cleanup.make_variable_declarations_final=true
|
||||||
cleanup.merge_conditional_blocks=false
|
|
||||||
cleanup.never_use_blocks=false
|
cleanup.never_use_blocks=false
|
||||||
cleanup.never_use_parentheses_in_expressions=true
|
cleanup.never_use_parentheses_in_expressions=true
|
||||||
cleanup.number_suffix=false
|
|
||||||
cleanup.organize_imports=false
|
cleanup.organize_imports=false
|
||||||
cleanup.push_down_negation=false
|
|
||||||
cleanup.qualify_static_field_accesses_with_declaring_class=false
|
cleanup.qualify_static_field_accesses_with_declaring_class=false
|
||||||
cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
|
cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
|
||||||
cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
|
cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
|
||||||
cleanup.qualify_static_member_accesses_with_declaring_class=true
|
cleanup.qualify_static_member_accesses_with_declaring_class=true
|
||||||
cleanup.qualify_static_method_accesses_with_declaring_class=false
|
cleanup.qualify_static_method_accesses_with_declaring_class=false
|
||||||
cleanup.remove_private_constructors=true
|
cleanup.remove_private_constructors=true
|
||||||
cleanup.remove_redundant_modifiers=false
|
|
||||||
cleanup.remove_redundant_semicolons=false
|
|
||||||
cleanup.remove_redundant_type_arguments=false
|
|
||||||
cleanup.remove_trailing_whitespaces=true
|
cleanup.remove_trailing_whitespaces=true
|
||||||
cleanup.remove_trailing_whitespaces_all=true
|
cleanup.remove_trailing_whitespaces_all=true
|
||||||
cleanup.remove_trailing_whitespaces_ignore_empty=false
|
cleanup.remove_trailing_whitespaces_ignore_empty=false
|
||||||
cleanup.remove_unnecessary_array_creation=false
|
|
||||||
cleanup.remove_unnecessary_casts=true
|
cleanup.remove_unnecessary_casts=true
|
||||||
cleanup.remove_unnecessary_nls_tags=true
|
cleanup.remove_unnecessary_nls_tags=true
|
||||||
cleanup.remove_unused_imports=true
|
cleanup.remove_unused_imports=true
|
||||||
|
@ -51,35 +40,21 @@ cleanup.remove_unused_private_fields=true
|
||||||
cleanup.remove_unused_private_members=false
|
cleanup.remove_unused_private_members=false
|
||||||
cleanup.remove_unused_private_methods=true
|
cleanup.remove_unused_private_methods=true
|
||||||
cleanup.remove_unused_private_types=true
|
cleanup.remove_unused_private_types=true
|
||||||
cleanup.simplify_lambda_expression_and_method_ref=false
|
|
||||||
cleanup.sort_members=true
|
cleanup.sort_members=true
|
||||||
cleanup.sort_members_all=false
|
cleanup.sort_members_all=false
|
||||||
cleanup.use_anonymous_class_creation=false
|
|
||||||
cleanup.use_autoboxing=false
|
|
||||||
cleanup.use_blocks=true
|
cleanup.use_blocks=true
|
||||||
cleanup.use_blocks_only_for_return_and_throw=false
|
cleanup.use_blocks_only_for_return_and_throw=false
|
||||||
cleanup.use_directly_map_method=false
|
|
||||||
cleanup.use_lambda=true
|
|
||||||
cleanup.use_parentheses_in_expressions=false
|
cleanup.use_parentheses_in_expressions=false
|
||||||
cleanup.use_this_for_non_static_field_access=true
|
cleanup.use_this_for_non_static_field_access=true
|
||||||
cleanup.use_this_for_non_static_field_access_only_if_necessary=false
|
cleanup.use_this_for_non_static_field_access_only_if_necessary=false
|
||||||
cleanup.use_this_for_non_static_method_access=false
|
cleanup.use_this_for_non_static_method_access=false
|
||||||
cleanup.use_this_for_non_static_method_access_only_if_necessary=true
|
cleanup.use_this_for_non_static_method_access_only_if_necessary=true
|
||||||
cleanup.use_unboxing=false
|
cleanup_profile=_Devinsy-utils
|
||||||
cleanup.use_var=false
|
|
||||||
cleanup_profile=_Devinsy-strings
|
|
||||||
cleanup_settings_version=2
|
cleanup_settings_version=2
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
|
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
|
||||||
formatter_profile=_Devinsy-strings
|
formatter_profile=_Devinsy-utils
|
||||||
formatter_settings_version=19
|
formatter_settings_version=12
|
||||||
jautodoc.cleanup.add_header=false
|
|
||||||
jautodoc.cleanup.javadoc=false
|
|
||||||
jautodoc.cleanup.replace_header=false
|
|
||||||
org.eclipse.jdt.ui.exception.name=exception
|
|
||||||
org.eclipse.jdt.ui.gettersetter.use.is=true
|
|
||||||
org.eclipse.jdt.ui.keywordthis=false
|
|
||||||
org.eclipse.jdt.ui.overrideannotation=true
|
|
||||||
sp_cleanup.add_default_serial_version_id=true
|
sp_cleanup.add_default_serial_version_id=true
|
||||||
sp_cleanup.add_generated_serial_version_id=false
|
sp_cleanup.add_generated_serial_version_id=false
|
||||||
sp_cleanup.add_missing_annotations=true
|
sp_cleanup.add_missing_annotations=true
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<faceted-project>
|
<faceted-project>
|
||||||
|
<runtime name="Apache Tomcat v7.0"/>
|
||||||
<fixed facet="jst.java"/>
|
<fixed facet="jst.java"/>
|
||||||
<fixed facet="jst.utility"/>
|
<fixed facet="jst.utility"/>
|
||||||
|
<installed facet="jst.java" version="6.0"/>
|
||||||
<installed facet="jst.utility" version="1.0"/>
|
<installed facet="jst.utility" version="1.0"/>
|
||||||
<installed facet="jst.java" version="17"/>
|
|
||||||
</faceted-project>
|
</faceted-project>
|
||||||
|
|
13
README.md
13
README.md
|
@ -1,9 +1,9 @@
|
||||||
|
|
||||||
# DEVINSY Strings
|
# DEVINSY Utils
|
||||||
|
|
||||||
DEVINSY Strings is an util
|
GeoNames is geographical database under a creative commons attribution license.
|
||||||
|
|
||||||
DEVINSY String provides an easy, local and fast Java String List management.
|
FlatDB4GeoNames provides an easy, local and fast Java access to GeoNames data.
|
||||||
|
|
||||||
## Author
|
## Author
|
||||||
Christian Pierre MOMON <christian.momon@devinsy.fr>
|
Christian Pierre MOMON <christian.momon@devinsy.fr>
|
||||||
|
@ -13,13 +13,14 @@ This software is released under the GNU LGPL.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- Java 11
|
FlatDB4Geonames requires:
|
||||||
- Eclipse 4.16 (202006).
|
- Java 1.6
|
||||||
|
- Eclipse Kepler
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
Several useful Java classes.
|
Several useful Java classes.
|
||||||
|
|
||||||
|
|
||||||
## Conclusion
|
## Conclusion
|
||||||
Enjoy and use DEVINSY Strings. For questions, improvement, issues: christian.momon@devinsy.fr
|
Enjoy and use FlatDB4GeoNames. For questions, improvement, issues: christian.momon@devinsy.fr
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#Build Number for ANT. Do not edit!
|
#Build Number for ANT. Do not edit!
|
||||||
#Thu Oct 14 15:55:30 CEST 2021
|
#Wed Apr 19 22:56:10 CEST 2017
|
||||||
build.number=1
|
build.number=4
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
product.name=devinsy-strings
|
product.name=devinsy-utils
|
||||||
product.revision.major=0
|
product.revision.major=0
|
||||||
product.revision.minor=17
|
product.revision.minor=3
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/commons-lang3-3.1-sources.jar
Normal file
BIN
lib/commons-lang3-3.1-sources.jar
Normal file
Binary file not shown.
BIN
lib/commons-lang3-3.1.jar
Normal file
BIN
lib/commons-lang3-3.1.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/joda-time-2.3-sources.jar
Normal file
BIN
lib/joda-time-2.3-sources.jar
Normal file
Binary file not shown.
BIN
lib/joda-time-2.3.jar
Normal file
BIN
lib/joda-time-2.3.jar
Normal file
Binary file not shown.
BIN
lib/junit-4.11-sources.jar
Normal file
BIN
lib/junit-4.11-sources.jar
Normal file
Binary file not shown.
BIN
lib/junit-4.11.jar
Normal file
BIN
lib/junit-4.11.jar
Normal file
Binary file not shown.
BIN
lib/slf4j-api-1.7.5-sources.jar
Normal file
BIN
lib/slf4j-api-1.7.5-sources.jar
Normal file
Binary file not shown.
BIN
lib/slf4j-api-1.7.5.jar
Normal file
BIN
lib/slf4j-api-1.7.5.jar
Normal file
Binary file not shown.
BIN
lib/slf4j-log4j12-1.7.5-sources.jar
Normal file
BIN
lib/slf4j-log4j12-1.7.5-sources.jar
Normal file
Binary file not shown.
BIN
lib/slf4j-log4j12-1.7.5.jar
Normal file
BIN
lib/slf4j-log4j12-1.7.5.jar
Normal file
Binary file not shown.
3
src/META-INF/MANIFEST.MF
Normal file
3
src/META-INF/MANIFEST.MF
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Class-Path:
|
||||||
|
|
|
@ -1,122 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2013-2021 Christian Pierre MOMON
|
|
||||||
*
|
|
||||||
* This file is part of Devinsy-strings.
|
|
||||||
*
|
|
||||||
* Devinsy-strings is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Devinsy-strings is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Devinsy-strings. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.strings;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Reader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class StringListReader.
|
|
||||||
*
|
|
||||||
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
|
||||||
*/
|
|
||||||
public class StringListReader extends Reader
|
|
||||||
{
|
|
||||||
private StringList in;
|
|
||||||
private StringListCharIterator iterator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new string list reader.
|
|
||||||
*
|
|
||||||
* @param in
|
|
||||||
* the in
|
|
||||||
*/
|
|
||||||
public StringListReader(final StringList in)
|
|
||||||
{
|
|
||||||
this.in = in;
|
|
||||||
this.iterator = new StringListCharIterator(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see java.io.Reader#close()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void close()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see java.io.Reader#read(char[], int, int)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public synchronized int read(final char[] cbuf, final int off, final int len) throws IOException
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
if ((off < 0) || (off > cbuf.length) || (len < 0) || ((off + len) > cbuf.length) || ((off + len) < 0))
|
|
||||||
{
|
|
||||||
throw new IndexOutOfBoundsException();
|
|
||||||
}
|
|
||||||
else if (len == 0)
|
|
||||||
{
|
|
||||||
result = 0;
|
|
||||||
}
|
|
||||||
else if (this.iterator.hasNext())
|
|
||||||
{
|
|
||||||
//
|
|
||||||
result = 0;
|
|
||||||
|
|
||||||
// Read off characters.
|
|
||||||
{
|
|
||||||
boolean ended = false;
|
|
||||||
int offCount = 0;
|
|
||||||
while (!ended)
|
|
||||||
{
|
|
||||||
if ((offCount < off) && (this.iterator.hasNext()))
|
|
||||||
{
|
|
||||||
this.iterator.next();
|
|
||||||
offCount += 1;
|
|
||||||
result += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ended = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read len characters.
|
|
||||||
{
|
|
||||||
boolean ended = false;
|
|
||||||
int lenCount = 0;
|
|
||||||
while (!ended)
|
|
||||||
{
|
|
||||||
if ((lenCount < len) && (this.iterator.hasNext()))
|
|
||||||
{
|
|
||||||
char letter = this.iterator.next();
|
|
||||||
cbuf[lenCount] = letter;
|
|
||||||
lenCount += 1;
|
|
||||||
result += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ended = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,129 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2017-2021 Christian Pierre MOMON
|
|
||||||
*
|
|
||||||
* This file is part of Devinsy-strings.
|
|
||||||
*
|
|
||||||
* Devinsy-strings is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Devinsy-strings is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Devinsy-strings. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.strings.demo;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import fr.devinsy.strings.StringList;
|
|
||||||
import fr.devinsy.strings.StringsUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Class Demo.
|
|
||||||
*/
|
|
||||||
public class StringsDemo
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The main method.
|
|
||||||
*
|
|
||||||
* @param args
|
|
||||||
* the arguments
|
|
||||||
*/
|
|
||||||
public static void main(final String[] args)
|
|
||||||
{
|
|
||||||
// #1
|
|
||||||
{
|
|
||||||
StringList strings = new StringList();
|
|
||||||
|
|
||||||
strings.appendln("========== DEMO #1;");
|
|
||||||
strings.appendln();
|
|
||||||
strings.appendln("Need to concatenate arbitrary number of string?");
|
|
||||||
strings.appendln("Don't know what will be the final size?");
|
|
||||||
strings.appendln("So StringBuilder and StringBuffer are not efficient.");
|
|
||||||
strings.appendln("Choose StringList!");
|
|
||||||
|
|
||||||
System.out.println(strings.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// #2
|
|
||||||
{
|
|
||||||
StringList strings = new StringList();
|
|
||||||
|
|
||||||
strings.appendln("========== DEMO #2;");
|
|
||||||
strings.appendln();
|
|
||||||
strings.appendln("Easy to concatenate different types.");
|
|
||||||
strings.append("Boolean: ").append(true).append(" ").appendln(Boolean.valueOf(false));
|
|
||||||
strings.append("Char: ").append('e').append(" ").appendln(Character.valueOf('e'));
|
|
||||||
strings.append("Byte : ").append((byte) 5).append(" ").appendln(Byte.valueOf((byte) 5));
|
|
||||||
strings.append("Short: ").append((short) 55).append(" ").appendln(Short.valueOf((short) 55));
|
|
||||||
strings.append("Integer: ").append(555).append(" ").appendln(Integer.valueOf(555));
|
|
||||||
strings.append("Long: ").append(5555L).append(" ").appendln(Long.valueOf(5555));
|
|
||||||
strings.append("Float: ").append((float) 5555.5).append(" ").appendln(Float.valueOf((float) 5555.5));
|
|
||||||
strings.append("Double: ").append(5555.55).append(" ").appendln(Double.valueOf(5555.55));
|
|
||||||
strings.append("String: ").append("abcde").append(" ").appendln(new String("abcde"));
|
|
||||||
strings.append("Object: ").appendln(new Date());
|
|
||||||
strings.append("Array of booleans: ").appendln(StringsUtils.toStringList(new boolean[] { true, false, true }));
|
|
||||||
strings.append("Array of chars: ").appendln(StringsUtils.toStringList(new char[] { 'a', 'b', 'c' }));
|
|
||||||
strings.append("Array of bytes: ").appendln(StringsUtils.toStringList(new byte[] { (byte) 1, (byte) 2, (byte) 3 }));
|
|
||||||
strings.append("Array of shorts: ").appendln(StringsUtils.toStringList(new short[] { (short) 1, (short) 2, (short) 3 }));
|
|
||||||
strings.append("Array of longs: ").appendln(StringsUtils.toStringList(new long[] { 1L, 2L, 3L }));
|
|
||||||
strings.append("Array of strings(1): ").appendln(new String[] { "ab", "cd", "e" });
|
|
||||||
strings.append("Array of strings(2): ").appendln("ab", "cd", "e");
|
|
||||||
strings.append("Array of objects: ").appendln(new Object[] { "ab", "cd", "e" });
|
|
||||||
ArrayList<String> buffer = new ArrayList<String>();
|
|
||||||
buffer.add("ab");
|
|
||||||
buffer.add("cd");
|
|
||||||
buffer.add("e");
|
|
||||||
strings.append("Collections: ").appendln(buffer);
|
|
||||||
|
|
||||||
System.out.println(strings.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// #3
|
|
||||||
{
|
|
||||||
StringList strings = new StringList();
|
|
||||||
|
|
||||||
strings.appendln("========== DEMO #3;");
|
|
||||||
strings.appendln();
|
|
||||||
strings.appendln("Useful and easy methods.");
|
|
||||||
StringList list = new StringList("red", "blue", "green");
|
|
||||||
strings.append("Format(1): ").appendln(list.toStringWithBracket());
|
|
||||||
strings.append("Format(2): ").appendln(list.toStringWithBrackets());
|
|
||||||
strings.append("Format(3): ").appendln(list.toStringWithCommas());
|
|
||||||
strings.append("Format(4): ").appendln(list.toStringWithFrenchCommas());
|
|
||||||
strings.append("RemoveLast: ").appendln(list.removeLast().toStringWithFrenchCommas());
|
|
||||||
|
|
||||||
System.out.println(strings.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// #4
|
|
||||||
{
|
|
||||||
StringList strings = new StringList();
|
|
||||||
|
|
||||||
strings.appendln("========== DEMO #4;");
|
|
||||||
strings.appendln();
|
|
||||||
strings.appendln("Advanced features.");
|
|
||||||
strings.append("Boolean: ").append(true).append(" ").appendln(Boolean.valueOf(false));
|
|
||||||
|
|
||||||
System.out.println(strings.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// #5
|
|
||||||
{
|
|
||||||
StringList strings = new StringList();
|
|
||||||
|
|
||||||
strings.appendln("========== DEMO #5;");
|
|
||||||
strings.appendln();
|
|
||||||
strings.appendln("Funny features.");
|
|
||||||
strings.append("Boolean: ").append(true).append(" ").appendln(Boolean.valueOf(false));
|
|
||||||
|
|
||||||
System.out.println(strings.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
256
src/fr/devinsy/util/DataFile.java
Executable file
256
src/fr/devinsy/util/DataFile.java
Executable file
|
@ -0,0 +1,256 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2008-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class defines a content file.
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class DataFile
|
||||||
|
{
|
||||||
|
public static int NOID = 0;
|
||||||
|
public static int DEFAULT_SIZE = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
protected int id;
|
||||||
|
protected int contentId;
|
||||||
|
protected String name;
|
||||||
|
protected long size;
|
||||||
|
protected byte[] data;
|
||||||
|
protected String creationDate;
|
||||||
|
protected String creationUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public DataFile()
|
||||||
|
{
|
||||||
|
this.id = NOID;
|
||||||
|
this.contentId = NOID;
|
||||||
|
this.name = null;
|
||||||
|
this.size = this.DEFAULT_SIZE;
|
||||||
|
this.data = null;
|
||||||
|
this.creationDate = null;
|
||||||
|
this.creationUser = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public DataFile(final int contentId, final String name, final long size, final byte[] data)
|
||||||
|
{
|
||||||
|
this.id = NOID;
|
||||||
|
this.contentId = contentId;
|
||||||
|
this.name = name;
|
||||||
|
this.size = size;
|
||||||
|
this.data = data;
|
||||||
|
this.creationDate = null;
|
||||||
|
this.creationUser = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public DataFile(final String name, final long size, final byte[] data)
|
||||||
|
{
|
||||||
|
this.id = NOID;
|
||||||
|
this.contentId = NOID;
|
||||||
|
this.name = name;
|
||||||
|
this.size = size;
|
||||||
|
this.data = data;
|
||||||
|
this.creationDate = null;
|
||||||
|
this.creationUser = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int contentId()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.contentId;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String creationDate()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.creationDate;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String creationUser()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.creationUser;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public byte[] data()
|
||||||
|
{
|
||||||
|
byte[] result;
|
||||||
|
|
||||||
|
result = this.data;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int id()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.id;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String name()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.name;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setContentId(final int contentId)
|
||||||
|
{
|
||||||
|
this.contentId = contentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setCreationDate(final String creationDate)
|
||||||
|
{
|
||||||
|
if (creationDate == null)
|
||||||
|
{
|
||||||
|
this.creationDate = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.creationDate = creationDate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setCreationUser(final String creationUser)
|
||||||
|
{
|
||||||
|
if (creationUser == null)
|
||||||
|
{
|
||||||
|
this.creationUser = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.creationUser = creationUser;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setData(final byte[] data)
|
||||||
|
{
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setId(final int id)
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setName(final String name)
|
||||||
|
{
|
||||||
|
if (name == null)
|
||||||
|
{
|
||||||
|
this.name = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setSize(final long size)
|
||||||
|
{
|
||||||
|
if (size >= 0)
|
||||||
|
{
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.size = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public long size()
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
|
||||||
|
result = this.size;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
181
src/fr/devinsy/util/DataFiles.java
Executable file
181
src/fr/devinsy/util/DataFiles.java
Executable file
|
@ -0,0 +1,181 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2008-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is a collection of DataFile objects whit some specific methods.
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON
|
||||||
|
*/
|
||||||
|
public class DataFiles extends ArrayList<DataFile>
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = -4584622422555785456L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public DataFiles()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
*/
|
||||||
|
public DataFiles(final DataFiles source)
|
||||||
|
{
|
||||||
|
super(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public DataFiles getByContentId(final int id)
|
||||||
|
{
|
||||||
|
DataFiles result = new DataFiles();
|
||||||
|
|
||||||
|
for (int nDataFile = 0; nDataFile < this.size(); nDataFile++)
|
||||||
|
{
|
||||||
|
DataFile contentFile = this.getByIndex(nDataFile);
|
||||||
|
|
||||||
|
if (contentFile.contentId() == id)
|
||||||
|
{
|
||||||
|
result.add(contentFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public DataFile getById(final int id)
|
||||||
|
{
|
||||||
|
DataFile result = null;
|
||||||
|
|
||||||
|
boolean ended = false;
|
||||||
|
int nDataFile = 0;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (nDataFile >= this.size())
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DataFile contentFile = this.getByIndex(nDataFile);
|
||||||
|
|
||||||
|
if (id == contentFile.id())
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = contentFile;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nDataFile += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public DataFile getByIndex(final int index)
|
||||||
|
{
|
||||||
|
DataFile result;
|
||||||
|
|
||||||
|
result = super.get(index);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public DataFile getByName(final String name)
|
||||||
|
{
|
||||||
|
DataFile result = null;
|
||||||
|
|
||||||
|
if ((name == null) || (name.equals("")))
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
boolean ended = false;
|
||||||
|
int dataFileIndex = 0;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (dataFileIndex >= this.size())
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DataFile contentFile = this.getByIndex(dataFileIndex);
|
||||||
|
|
||||||
|
if (name.equals(contentFile.name()))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = contentFile;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dataFileIndex += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
StringBuffer result = new StringBuffer();
|
||||||
|
|
||||||
|
for (int nDataFile = 0; nDataFile < this.size(); nDataFile++)
|
||||||
|
{
|
||||||
|
DataFile contentFile = this.getByIndex(nDataFile);
|
||||||
|
result.append("== " + contentFile.name() + "\n");
|
||||||
|
result.append("contentFile " + nDataFile + " - " + contentFile.name() + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result.toString());
|
||||||
|
}
|
||||||
|
}
|
370
src/fr/devinsy/util/DateHelper.java
Executable file
370
src/fr/devinsy/util/DateHelper.java
Executable file
|
@ -0,0 +1,370 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class groups function to help in Calendar manipulation.
|
||||||
|
*
|
||||||
|
* SimpleDateFormat is not used cause does not thread safe?
|
||||||
|
*/
|
||||||
|
public class DateHelper
|
||||||
|
{
|
||||||
|
// static private final Logger logger =
|
||||||
|
// LoggerFactory.getLogger(DateHelper.class);
|
||||||
|
|
||||||
|
private static final String EUROPEAN_DATE_FORMAT = "%02d/%02d/%04d";
|
||||||
|
private static final String SHORT_EUROPEAN_DATE_FORMAT = "%02d/%02d";
|
||||||
|
private static final String RAW_DATE_FORMAT = "%04d%02d%02d";
|
||||||
|
private static final String ISO_DATE_FORMAT = "%04d-%02d-%02d";
|
||||||
|
private static final String AMERICAN_DATE_FORMAT = "%02d/%02d/%04d";
|
||||||
|
|
||||||
|
private static final String EUROPEAN_DATE_PATTERN = "^([0123]{0,1}\\d)/([01]{0,1}\\d)/(\\d\\d\\d\\d)$";
|
||||||
|
private static final String RAW_DATE_PATTERN = "^(\\d\\d\\d\\d)([01]\\d)([0123]\\d)$";
|
||||||
|
private static final String ISO_DATE_PATTERN = "^(\\d\\d\\d\\d)-([01]\\d)-([0123]\\d)$";
|
||||||
|
private static final String AMERICAN_DATE_PATTERN = "^([01]{0,1}\\d)/([0123]{0,1}\\d)/(\\d\\d\\d\\d)$";
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String americanFormat(final Calendar time)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (time == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = String.format(AMERICAN_DATE_FORMAT, time.get(Calendar.MONTH) + 1, time.get(Calendar.DAY_OF_MONTH), time.get(Calendar.DAY_OF_MONTH));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String europeanFormat(final Calendar time)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (time == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = String.format(EUROPEAN_DATE_FORMAT, time.get(Calendar.DAY_OF_MONTH), time.get(Calendar.MONTH) + 1, time.get(Calendar.YEAR));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isAmericanFormat(final String date)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (date == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = date.matches(AMERICAN_DATE_PATTERN);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isEuropeanFormat(final String date)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (date == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = date.matches(EUROPEAN_DATE_PATTERN);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isISOFormat(final String date)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (date == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = date.matches(ISO_DATE_PATTERN);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String ISOFormat(final Calendar time)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (time == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = String.format(ISO_DATE_FORMAT, time.get(Calendar.YEAR), time.get(Calendar.MONTH) + 1, time.get(Calendar.DAY_OF_MONTH));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isRawFormat(final String date)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (date == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = date.matches(RAW_DATE_PATTERN);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isValidDate(final String date)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if ((isEuropeanFormat(date)) || (isRawFormat(date)) || (isISOFormat(date)) || (isAmericanFormat(date)))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static Calendar parseAmericanDate(final String date)
|
||||||
|
{
|
||||||
|
Calendar result;
|
||||||
|
|
||||||
|
Pattern pattern = Pattern.compile(AMERICAN_DATE_PATTERN);
|
||||||
|
Matcher matcher = pattern.matcher(date);
|
||||||
|
|
||||||
|
if ((matcher.find()) && (matcher.groupCount() == 3))
|
||||||
|
{
|
||||||
|
result = new GregorianCalendar(Integer.parseInt(matcher.group(3)), Integer.parseInt(matcher.group(1)) - 1, Integer.parseInt(matcher.group(2)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note: European parsing test made before the American parsing one.
|
||||||
|
*/
|
||||||
|
public static Calendar parseDate(final String date)
|
||||||
|
{
|
||||||
|
Calendar result;
|
||||||
|
|
||||||
|
if (isEuropeanFormat(date))
|
||||||
|
{
|
||||||
|
result = parseEuropeanDate(date);
|
||||||
|
}
|
||||||
|
else if (isRawFormat(date))
|
||||||
|
{
|
||||||
|
result = parseRawDate(date);
|
||||||
|
}
|
||||||
|
else if (isISOFormat(date))
|
||||||
|
{
|
||||||
|
result = parseISODate(date);
|
||||||
|
}
|
||||||
|
else if (isAmericanFormat(date))
|
||||||
|
{
|
||||||
|
result = parseAmericanDate(date);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static Calendar parseEuropeanDate(final String date)
|
||||||
|
{
|
||||||
|
Calendar result;
|
||||||
|
|
||||||
|
Pattern pattern = Pattern.compile(EUROPEAN_DATE_PATTERN);
|
||||||
|
Matcher matcher = pattern.matcher(date);
|
||||||
|
|
||||||
|
if ((matcher.find()) && (matcher.groupCount() == 3))
|
||||||
|
{
|
||||||
|
result = new GregorianCalendar(Integer.parseInt(matcher.group(3)), Integer.parseInt(matcher.group(2)) - 1, Integer.parseInt(matcher.group(1)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static Calendar parseISODate(final String date)
|
||||||
|
{
|
||||||
|
Calendar result;
|
||||||
|
|
||||||
|
Pattern pattern = Pattern.compile(ISO_DATE_PATTERN);
|
||||||
|
Matcher matcher = pattern.matcher(date);
|
||||||
|
|
||||||
|
if ((matcher.find()) && (matcher.groupCount() == 3))
|
||||||
|
{
|
||||||
|
result = new GregorianCalendar(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)) - 1, Integer.parseInt(matcher.group(3)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static Calendar parseRawDate(final String date)
|
||||||
|
{
|
||||||
|
Calendar result;
|
||||||
|
|
||||||
|
Pattern pattern = Pattern.compile(RAW_DATE_PATTERN);
|
||||||
|
Matcher matcher = pattern.matcher(date);
|
||||||
|
|
||||||
|
if ((matcher.find()) && (matcher.groupCount() == 3))
|
||||||
|
{
|
||||||
|
result = new GregorianCalendar(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)) - 1, Integer.parseInt(matcher.group(3)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String rawFormat(final Calendar time)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (time == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = String.format(RAW_DATE_FORMAT, time.get(Calendar.YEAR), time.get(Calendar.MONTH), time.get(Calendar.DAY_OF_MONTH) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String shortEuropeanFormat(final Calendar time)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (time == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = String.format(SHORT_EUROPEAN_DATE_FORMAT, time.get(Calendar.DAY_OF_MONTH), time.get(Calendar.MONTH) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
124
src/fr/devinsy/util/DateTimeHelper.java
Executable file
124
src/fr/devinsy/util/DateTimeHelper.java
Executable file
|
@ -0,0 +1,124 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class groups function to help in Calendar manipulation.
|
||||||
|
*/
|
||||||
|
public class DateTimeHelper
|
||||||
|
{
|
||||||
|
// static private final Logger logger =
|
||||||
|
// LoggerFactory.getLogger(DateTimeHelper.class);
|
||||||
|
|
||||||
|
private static final String EUROPEAN_DATE_FORMAT = "%02d/%02d/%04d %02d:%02d:%02d";
|
||||||
|
private static final String RAW_DATE_FORMAT = "%04d%02d%02d %02d:%02d:%02d";
|
||||||
|
private static final String ISO_DATE_FORMAT = "%04d-%02d-%02d %02d:%02d:%02d";
|
||||||
|
private static final String AMERICAN_DATE_FORMAT = "%02d/%02d/%04d %02d:%02d:%02d";
|
||||||
|
|
||||||
|
private static final String EUROPEAN_DATE_PATTERN = "^([0123]{0,1}\\d)/([01]{0,1}\\d)/(\\d\\d\\d\\d)$";
|
||||||
|
private static final String RAW_DATE_PATTERN = "^(\\d\\d\\d\\d)([01]\\d)([0123]\\d)$";
|
||||||
|
private static final String ISO_DATE_PATTERN = "^(\\d\\d\\d\\d)-([01]\\d)-([0123]\\d)$";
|
||||||
|
private static final String AMERICAN_DATE_PATTERN = "^([01]{0,1}\\d)/([0123]{0,1}\\d)/(\\d\\d\\d\\d)$";
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String americanFormat(final Calendar time)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (time == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = String.format(AMERICAN_DATE_FORMAT, time.get(Calendar.MONTH) + 1, time.get(Calendar.DAY_OF_MONTH), time.get(Calendar.YEAR), time.get(Calendar.HOUR_OF_DAY),
|
||||||
|
time.get(Calendar.MINUTE), time.get(Calendar.SECOND));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String europeanFormat(final Calendar time)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (time == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = String.format(EUROPEAN_DATE_FORMAT, time.get(Calendar.DAY_OF_MONTH), time.get(Calendar.MONTH) + 1, time.get(Calendar.YEAR), time.get(Calendar.HOUR_OF_DAY),
|
||||||
|
time.get(Calendar.MINUTE), time.get(Calendar.SECOND));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String ISOFormat(final Calendar time)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (time == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = String.format(ISO_DATE_FORMAT, time.get(Calendar.YEAR), time.get(Calendar.MONTH) + 1, time.get(Calendar.DAY_OF_MONTH), time.get(Calendar.HOUR_OF_DAY), time.get(Calendar.MINUTE),
|
||||||
|
time.get(Calendar.SECOND));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String rawFormat(final Calendar time)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (time == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = String.format(RAW_DATE_FORMAT, time.get(Calendar.YEAR), time.get(Calendar.MONTH) + 1, time.get(Calendar.DAY_OF_MONTH), time.get(Calendar.HOUR_OF_DAY), time.get(Calendar.MINUTE),
|
||||||
|
time.get(Calendar.SECOND));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
128
src/fr/devinsy/util/Digester.java
Normal file
128
src/fr/devinsy/util/Digester.java
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006, 2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is a helper to use MessageDigester class.
|
||||||
|
*
|
||||||
|
* @deprecated because of DigestUtils from apache-commons-codec is doing the
|
||||||
|
* same but better.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public class Digester
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* "SHA-1", "MD5", "SHA-256", and "SHA-512"
|
||||||
|
*/
|
||||||
|
public static String computeHash(final String digestMethod, final File file) throws Exception
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if ((file == null) || (!file.exists()))
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// byte[] hash = null;
|
||||||
|
|
||||||
|
InputStream source = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MessageDigest digester = MessageDigest.getInstance(digestMethod);
|
||||||
|
source = new FileInputStream(file);
|
||||||
|
boolean ended = false;
|
||||||
|
int bytesNumber;
|
||||||
|
byte[] buffer = new byte[100 * 1024];
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
bytesNumber = source.read(buffer);
|
||||||
|
if (bytesNumber == -1)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
digester.update(buffer, 0, bytesNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] digest = digester.digest();
|
||||||
|
|
||||||
|
result = humanReadableDigest(digest);
|
||||||
|
}
|
||||||
|
catch (java.security.NoSuchAlgorithmException exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Digest method unknown.", exception);
|
||||||
|
}
|
||||||
|
catch (java.io.FileNotFoundException exception)
|
||||||
|
{
|
||||||
|
throw new Exception("File not found (" + exception.getMessage() + ")", exception);
|
||||||
|
}
|
||||||
|
catch (java.io.IOException exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error reading file.", exception);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (source != null)
|
||||||
|
{
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String humanReadableDigest(final byte[] digest)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
StringBuffer hashString = new StringBuffer();
|
||||||
|
|
||||||
|
for (int letterIndex = 0; letterIndex < digest.length; ++letterIndex)
|
||||||
|
{
|
||||||
|
String hex = Integer.toHexString(digest[letterIndex]);
|
||||||
|
if (hex.length() == 1)
|
||||||
|
{
|
||||||
|
hashString.append('0');
|
||||||
|
hashString.append(hex.charAt(hex.length() - 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hashString.append(hex.substring(hex.length() - 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = hashString.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
76
src/fr/devinsy/util/FileCopier.java
Normal file
76
src/fr/devinsy/util/FileCopier.java
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Never used again. Prefer org.apache.commons.io.FileUtils class.
|
||||||
|
*/
|
||||||
|
public class FileCopier
|
||||||
|
{
|
||||||
|
public static final int BUFFER_SIZE = 4 * 1024;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void copy(final File source, final File target) throws Exception
|
||||||
|
{
|
||||||
|
if ((source == null) || (target == null))
|
||||||
|
{
|
||||||
|
throw new Exception("Null parameter.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FileInputStream in = new FileInputStream(source);
|
||||||
|
FileOutputStream out = new FileOutputStream(target);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||||||
|
boolean ended = false;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
int size = in.read(buffer);
|
||||||
|
if (size == -1)
|
||||||
|
{
|
||||||
|
ended = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
out.write(buffer, 0, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (in != null)
|
||||||
|
{
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (out != null)
|
||||||
|
{
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
452
src/fr/devinsy/util/FileIterator.java
Normal file
452
src/fr/devinsy/util/FileIterator.java
Normal file
|
@ -0,0 +1,452 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Vector;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class FileIterator extends Vector<FileIteratorState> implements Iterator<File>
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 8790133455427427766L;
|
||||||
|
|
||||||
|
protected int currentDepth;
|
||||||
|
protected Pattern pattern;
|
||||||
|
protected File previous;
|
||||||
|
protected boolean followLinks;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public FileIterator(final File root)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
String[] pathnames;
|
||||||
|
if (root == null)
|
||||||
|
{
|
||||||
|
pathnames = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pathnames = new String[1];
|
||||||
|
pathnames[0] = root.getPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
init(pathnames, null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public FileIterator(final File root, final String filter, final boolean followLinks)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
String[] pathnames;
|
||||||
|
if (root == null)
|
||||||
|
{
|
||||||
|
pathnames = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pathnames = new String[1];
|
||||||
|
pathnames[0] = root.getPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
init(pathnames, filter, followLinks);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public FileIterator(final String pathname, final String filter, final boolean followLinks)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
String[] pathnames;
|
||||||
|
if (pathname == null)
|
||||||
|
{
|
||||||
|
pathnames = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pathnames = new String[1];
|
||||||
|
pathnames[0] = pathname;
|
||||||
|
}
|
||||||
|
|
||||||
|
init(pathnames, filter, followLinks);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public FileIterator(final String[] pathnames, final String filter, final boolean followLinks)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
init(pathnames, filter, followLinks);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public File currentFile()
|
||||||
|
{
|
||||||
|
File result;
|
||||||
|
|
||||||
|
result = this.currentState().currentFile();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected FileIteratorState currentState()
|
||||||
|
{
|
||||||
|
FileIteratorState result;
|
||||||
|
|
||||||
|
result = this.get(this.currentDepth);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int directoryFinalCountdown()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
while (this.hasNext())
|
||||||
|
{
|
||||||
|
if (this.next().isDirectory())
|
||||||
|
{
|
||||||
|
result += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int fileFinalCountdown()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
while (this.hasNext())
|
||||||
|
{
|
||||||
|
if (!this.next().isDirectory())
|
||||||
|
{
|
||||||
|
result += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected String filter()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (this.pattern == null)
|
||||||
|
{
|
||||||
|
result = ".*";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = this.pattern.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int finalCountdown()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
while (this.next() != null)
|
||||||
|
{
|
||||||
|
result += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean follow(final File file)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if ((this.followLinks) || (!isLink(file)))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// System.out.println("FOLLOWWWWW=[" + file.getPath() + "][" +
|
||||||
|
// this.followLinks + "][" + isLink(file) + "][" + result + "]");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
System.err.println("ERROR with file [" + this.next() + "]: " + exception.getMessage());
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean hasNext()
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = this.currentState().hasNext();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected void init(final String[] pathnames, final String filter, final boolean followLinks)
|
||||||
|
{
|
||||||
|
setFilter(filter);
|
||||||
|
this.followLinks = followLinks;
|
||||||
|
this.previous = null;
|
||||||
|
|
||||||
|
this.currentDepth = 0;
|
||||||
|
this.add(new FileIteratorState(pathnames));
|
||||||
|
|
||||||
|
shift();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public File next()
|
||||||
|
{
|
||||||
|
File result;
|
||||||
|
|
||||||
|
result = this.currentState().next();
|
||||||
|
this.previous = result;
|
||||||
|
if (result != null)
|
||||||
|
{
|
||||||
|
if (result.isDirectory())
|
||||||
|
{
|
||||||
|
this.push(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shift();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Pattern pattern()
|
||||||
|
{
|
||||||
|
Pattern result;
|
||||||
|
|
||||||
|
result = this.pattern;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void pop()
|
||||||
|
{
|
||||||
|
this.removeElementAt(this.currentDepth);
|
||||||
|
this.currentDepth -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void push(final File file)
|
||||||
|
{
|
||||||
|
if ((file != null) && (file.isDirectory()))
|
||||||
|
{
|
||||||
|
this.add(new FileIteratorState(file.listFiles()));
|
||||||
|
this.currentDepth += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void remove()
|
||||||
|
{
|
||||||
|
if (this.previous != null)
|
||||||
|
{
|
||||||
|
this.previous.delete();
|
||||||
|
this.previous = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void reset()
|
||||||
|
{
|
||||||
|
this.currentDepth = 0;
|
||||||
|
this.previous = null;
|
||||||
|
if (this.size() > 0)
|
||||||
|
{
|
||||||
|
this.get(0).reset();
|
||||||
|
FileIteratorState firstState = this.get(0);
|
||||||
|
this.removeAllElements();
|
||||||
|
this.add(firstState);
|
||||||
|
}
|
||||||
|
|
||||||
|
shift();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected void setFilter(final String filter)
|
||||||
|
{
|
||||||
|
if (filter == null)
|
||||||
|
{
|
||||||
|
this.pattern = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.pattern = Pattern.compile(filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set indexes to the good next item.
|
||||||
|
*/
|
||||||
|
public void shift()
|
||||||
|
{
|
||||||
|
boolean ended = false;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
File next = this.currentFile();
|
||||||
|
|
||||||
|
if (next == null)
|
||||||
|
{
|
||||||
|
if (this.currentDepth == 0)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (((this.pattern == null) || (this.pattern.matcher(next.getPath()).matches())) && (follow(next)))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.currentState().next();
|
||||||
|
|
||||||
|
if (next.isDirectory() && (follow(next)))
|
||||||
|
{
|
||||||
|
this.push(next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = "[depth=" + this.currentDepth + "][index=" + this.get(this.currentDepth).currentIndex() + "/" + this.get(this.currentDepth).files.length + "]";
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isLink(final File file) throws Exception
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if ((file.exists()) && (file.getCanonicalPath().equals(file.getAbsolutePath())))
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
162
src/fr/devinsy/util/FileIteratorState.java
Normal file
162
src/fr/devinsy/util/FileIteratorState.java
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by FileIterator class.
|
||||||
|
*/
|
||||||
|
public class FileIteratorState implements Iterator<File>
|
||||||
|
{
|
||||||
|
protected File[] files;
|
||||||
|
protected int currentIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public FileIteratorState(final File[] files)
|
||||||
|
{
|
||||||
|
// Initialize the state.
|
||||||
|
this.currentIndex = 0;
|
||||||
|
|
||||||
|
if (files == null)
|
||||||
|
{
|
||||||
|
this.files = new File[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.files = files;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Useful for the depth zero, otherwise parent path is lost.
|
||||||
|
*/
|
||||||
|
public FileIteratorState(final String[] pathnames)
|
||||||
|
{
|
||||||
|
// Initialize the state.
|
||||||
|
this.currentIndex = 0;
|
||||||
|
|
||||||
|
this.files = new File[pathnames.length];
|
||||||
|
for (int pathnameIndex = 0; pathnameIndex < pathnames.length; pathnameIndex++)
|
||||||
|
{
|
||||||
|
this.files[pathnameIndex] = new File(pathnames[pathnameIndex]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected File currentFile()
|
||||||
|
{
|
||||||
|
File result;
|
||||||
|
|
||||||
|
if (this.currentIndex >= this.files.length)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = this.files[this.currentIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected int currentIndex()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.currentIndex;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected File[] files()
|
||||||
|
{
|
||||||
|
File[] result;
|
||||||
|
|
||||||
|
result = this.files;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean hasNext()
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (this.currentFile() == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public File next()
|
||||||
|
{
|
||||||
|
File result;
|
||||||
|
|
||||||
|
result = this.currentFile();
|
||||||
|
this.currentIndex += 1;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void remove()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void reset()
|
||||||
|
{
|
||||||
|
this.currentIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
635
src/fr/devinsy/util/FileTools.java
Normal file
635
src/fr/devinsy/util/FileTools.java
Normal file
|
@ -0,0 +1,635 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2008-2015 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import fr.devinsy.util.strings.StringList;
|
||||||
|
import fr.devinsy.util.strings.StringListUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class FileTools
|
||||||
|
{
|
||||||
|
public static final String DEFAULT_CHARSET_NAME = "UTF-8";
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param fileName
|
||||||
|
* Source.
|
||||||
|
*
|
||||||
|
* @return Extension value or null.
|
||||||
|
*/
|
||||||
|
public static String addBeforeExtension(final String fileName, final String addition)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (fileName == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else if (addition == null)
|
||||||
|
{
|
||||||
|
result = fileName;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int separatorIndex = fileName.lastIndexOf('.');
|
||||||
|
|
||||||
|
//
|
||||||
|
if (separatorIndex > 0)
|
||||||
|
{
|
||||||
|
result = fileName.substring(0, separatorIndex) + addition + fileName.substring(separatorIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = fileName + addition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* Source.
|
||||||
|
*
|
||||||
|
* @return Extension value or null.
|
||||||
|
*/
|
||||||
|
public static File addToName(final File file, final String addition)
|
||||||
|
{
|
||||||
|
File result;
|
||||||
|
|
||||||
|
if (file == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else if (addition == null)
|
||||||
|
{
|
||||||
|
result = file;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
String sourceFileName = file.getAbsolutePath();
|
||||||
|
String targetFileName = addBeforeExtension(sourceFileName, addition);
|
||||||
|
result = new File(targetFileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the extension of a file.
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* Source.
|
||||||
|
*
|
||||||
|
* @return Extension value or null.
|
||||||
|
*/
|
||||||
|
public static String getExtension(final File file)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (file == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = getExtension(file.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the extension of a file.
|
||||||
|
*
|
||||||
|
* <ul>
|
||||||
|
* <li>getExtension(null) = null</li>
|
||||||
|
* <li>getExtension("") = null</li>
|
||||||
|
* <li>getExtension("abc") = null</li>
|
||||||
|
* <li>getExtension("abc.efg") = "efg"</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* Source.
|
||||||
|
*
|
||||||
|
* @return Extension value or null.
|
||||||
|
* @deprecated See
|
||||||
|
* <code>org.apache.commons.io.FilenameUtils.getExtension</code>
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public static String getExtension(final String fileName)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (fileName == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int separatorIndex = fileName.lastIndexOf('.');
|
||||||
|
if (separatorIndex > 0)
|
||||||
|
{
|
||||||
|
result = fileName.substring(separatorIndex + 1).toLowerCase();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static String load(final File source) throws IOException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = load(source, DEFAULT_CHARSET_NAME);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static String load(final File source, final String charsetName) throws IOException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = loadToStringBuffer(source, charsetName).toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static String load(final URL source) throws IOException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = load(source, DEFAULT_CHARSET_NAME);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static String load(final URL source, final String charsetName) throws IOException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
//
|
||||||
|
StringBuffer buffer = new StringBuffer(source.openConnection().getContentLength() + 1);
|
||||||
|
read(buffer, source.openStream(), charsetName);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = buffer.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static StringList loadStringList(final File source) throws IOException
|
||||||
|
{
|
||||||
|
StringList result;
|
||||||
|
|
||||||
|
result = loadStringList(source, DEFAULT_CHARSET_NAME);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static StringList loadStringList(final File file, final String charsetName) throws IOException
|
||||||
|
{
|
||||||
|
StringList result;
|
||||||
|
|
||||||
|
result = StringListUtils.load(file, charsetName);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static StringBuffer loadToStringBuffer(final File source) throws IOException
|
||||||
|
{
|
||||||
|
StringBuffer result;
|
||||||
|
|
||||||
|
result = loadToStringBuffer(source, DEFAULT_CHARSET_NAME);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static StringBuffer loadToStringBuffer(final File file, final String charsetName) throws IOException
|
||||||
|
{
|
||||||
|
StringBuffer result;
|
||||||
|
|
||||||
|
BufferedReader in = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
in = new BufferedReader(new InputStreamReader(new FileInputStream(file), charsetName));
|
||||||
|
|
||||||
|
boolean ended = false;
|
||||||
|
final String LINE_SEPARATOR = System.getProperty("line.separator");
|
||||||
|
result = new StringBuffer((int) file.length() + 1);
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
String line = in.readLine();
|
||||||
|
|
||||||
|
if (line == null)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.append(line).append(LINE_SEPARATOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (in != null)
|
||||||
|
{
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static StringList loadToStringList(final File source) throws IOException
|
||||||
|
{
|
||||||
|
StringList result;
|
||||||
|
|
||||||
|
result = loadToStringList(source, DEFAULT_CHARSET_NAME);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static StringList loadToStringList(final File file, final String charsetName) throws IOException
|
||||||
|
{
|
||||||
|
StringList result;
|
||||||
|
|
||||||
|
BufferedReader in = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
in = new BufferedReader(new InputStreamReader(new FileInputStream(file), charsetName));
|
||||||
|
|
||||||
|
boolean ended = false;
|
||||||
|
final String LINE_SEPARATOR = System.getProperty("line.separator");
|
||||||
|
result = new StringList();
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
String line = in.readLine();
|
||||||
|
|
||||||
|
if (line == null)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.append(line).append(LINE_SEPARATOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (in != null)
|
||||||
|
{
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static StringList loadToStringList(final URL source) throws IOException
|
||||||
|
{
|
||||||
|
StringList result;
|
||||||
|
|
||||||
|
result = loadToStringList(source, DEFAULT_CHARSET_NAME);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static StringList loadToStringList(final URL source, final String charsetName) throws IOException
|
||||||
|
{
|
||||||
|
StringList result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = StringListUtils.load(source, charsetName);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static void read(final StringBuffer out, final InputStream is, final String charsetName) throws IOException
|
||||||
|
{
|
||||||
|
BufferedReader in = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
in = new BufferedReader(new InputStreamReader(is, charsetName));
|
||||||
|
|
||||||
|
boolean ended = false;
|
||||||
|
final String LINE_SEPARATOR = System.getProperty("line.separator");
|
||||||
|
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
String line = in.readLine();
|
||||||
|
|
||||||
|
if (line == null)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
out.append(line).append(LINE_SEPARATOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (in != null)
|
||||||
|
{
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @param extension
|
||||||
|
* @return
|
||||||
|
*
|
||||||
|
* @deprecated See
|
||||||
|
* <code>org.apache.commons.io.FilenameUtils.removeExtension</code>
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public static String removeExtension(final String source)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
result = source;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int separatorIndex = source.lastIndexOf('.');
|
||||||
|
|
||||||
|
//
|
||||||
|
if (separatorIndex > 0)
|
||||||
|
{
|
||||||
|
result = source.substring(0, separatorIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public static void save(final File file, final String source) throws UnsupportedEncodingException, FileNotFoundException
|
||||||
|
{
|
||||||
|
PrintWriter out = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), DEFAULT_CHARSET_NAME));
|
||||||
|
|
||||||
|
out.println(source);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (out != null)
|
||||||
|
{
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public static void save(final File file, final StringBuffer source) throws UnsupportedEncodingException, FileNotFoundException
|
||||||
|
{
|
||||||
|
save(file, source.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public static void save(final File file, final StringList source) throws UnsupportedEncodingException, FileNotFoundException
|
||||||
|
{
|
||||||
|
StringListUtils.save(file, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @param extension
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static File setExtension(final File source, final String extension)
|
||||||
|
{
|
||||||
|
File result;
|
||||||
|
|
||||||
|
if ((source == null) || (extension == null))
|
||||||
|
{
|
||||||
|
result = source;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = new File(setExtension(source.getAbsolutePath(), extension));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @param extension
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String setExtension(final String source, final String extension)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if ((source == null) || (extension == null))
|
||||||
|
{
|
||||||
|
result = source;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int separatorIndex = source.lastIndexOf('.');
|
||||||
|
|
||||||
|
//
|
||||||
|
if (separatorIndex > 0)
|
||||||
|
{
|
||||||
|
String prefix = source.substring(0, separatorIndex);
|
||||||
|
if (prefix.endsWith(extension))
|
||||||
|
{
|
||||||
|
result = prefix;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = prefix + extension;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = source + extension;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
188
src/fr/devinsy/util/Fraction.java
Normal file
188
src/fr/devinsy/util/Fraction.java
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2009-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Useful for display beautiful percentage value as string.
|
||||||
|
*
|
||||||
|
* @author cpm
|
||||||
|
*/
|
||||||
|
public class Fraction
|
||||||
|
{
|
||||||
|
protected long numerator;
|
||||||
|
protected long denominator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Fraction(final long numerator, final long denominator)
|
||||||
|
{
|
||||||
|
this.numerator = numerator;
|
||||||
|
this.denominator = denominator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public long denominator()
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
|
||||||
|
result = this.denominator;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public long numerator()
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
|
||||||
|
result = this.numerator;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public long percentage() throws Exception
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
|
||||||
|
result = percentage(this.numerator, this.denominator);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String percentageFullString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = percentageFullString(this.numerator, this.denominator);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String percentageString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = percentageString(this.numerator, this.denominator);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.numerator + "/" + this.denominator;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static long percentage(final long numerator, final long denominator) throws Exception
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
|
||||||
|
if (denominator == 0)
|
||||||
|
{
|
||||||
|
throw new Exception("denominator is zero");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = Math.round(numerator * 100 / denominator);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String percentageFullString(final long numerator, final long denominator)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = percentageString(numerator, denominator);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String percentageString(final long numerator, final long denominator)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
long value = percentage(numerator, denominator);
|
||||||
|
|
||||||
|
if (numerator == 0)
|
||||||
|
{
|
||||||
|
result = "0%";
|
||||||
|
}
|
||||||
|
else if (value == 0)
|
||||||
|
{
|
||||||
|
result = "~0%";
|
||||||
|
}
|
||||||
|
else if (value < 10)
|
||||||
|
{
|
||||||
|
result = "0" + value + "%";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = value + "%";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
result = "--%";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
241
src/fr/devinsy/util/InternetProxyConfiguration.java
Executable file
241
src/fr/devinsy/util/InternetProxyConfiguration.java
Executable file
|
@ -0,0 +1,241 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2009-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class InternetProxyConfiguration
|
||||||
|
{
|
||||||
|
//
|
||||||
|
protected String host;
|
||||||
|
protected int port;
|
||||||
|
protected String login;
|
||||||
|
protected String password;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public InternetProxyConfiguration()
|
||||||
|
{
|
||||||
|
this.host = "";
|
||||||
|
this.port = 0;
|
||||||
|
this.login = "";
|
||||||
|
this.password = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public InternetProxyConfiguration(final String host, final int port, final String login, final String password)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (host == null)
|
||||||
|
{
|
||||||
|
this.host = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
this.port = port;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (login == null)
|
||||||
|
{
|
||||||
|
this.login = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.login = login;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (password == null)
|
||||||
|
{
|
||||||
|
this.password = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public InternetProxyConfiguration(final String host, final String port, final String login, final String password) throws Exception
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (host == null)
|
||||||
|
{
|
||||||
|
this.host = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if ((port == null) || (port.trim().length() == 0))
|
||||||
|
{
|
||||||
|
this.port = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.port = Integer.parseInt(port);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
String errorMessage = "Incorrect PROXY port value.";
|
||||||
|
throw new Exception(errorMessage, exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (login == null)
|
||||||
|
{
|
||||||
|
this.login = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.login = login;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (password == null)
|
||||||
|
{
|
||||||
|
this.password = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String host()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.host;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean isInitialized()
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if ((this.host.length() > 0) && (this.port > 0))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String login()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.login;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String password()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.password;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int port()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.port;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
String login;
|
||||||
|
if (this.login.length() == 0)
|
||||||
|
{
|
||||||
|
login = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
login = "********";
|
||||||
|
}
|
||||||
|
|
||||||
|
String password;
|
||||||
|
if (this.password.length() == 0)
|
||||||
|
{
|
||||||
|
password = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
password = "********";
|
||||||
|
}
|
||||||
|
|
||||||
|
result = "(" + this.host + "," + this.port + "," + login + "," + password + ")";
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
133
src/fr/devinsy/util/SimpleAveragemeter.java
Executable file
133
src/fr/devinsy/util/SimpleAveragemeter.java
Executable file
|
@ -0,0 +1,133 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2009-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class defines a simple average manager. For example, it is useful for
|
||||||
|
* millisecond. The maximum value available in input is one day in millisecond.
|
||||||
|
*/
|
||||||
|
public class SimpleAveragemeter
|
||||||
|
{
|
||||||
|
//
|
||||||
|
protected long sum;
|
||||||
|
protected long cardinal;
|
||||||
|
protected long MAX_ADD = 1 * 24 * 60 * 60 * 1000; // One day in millisecond.
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public SimpleAveragemeter()
|
||||||
|
{
|
||||||
|
this.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
synchronized public void add(final long value)
|
||||||
|
{
|
||||||
|
// Manage the sum limit.
|
||||||
|
if ((this.sum > Long.MAX_VALUE / 2) && (this.cardinal % 2 == 0))
|
||||||
|
{
|
||||||
|
this.sum = this.sum / 2;
|
||||||
|
this.cardinal = this.cardinal / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the new value.
|
||||||
|
if (this.sum > this.MAX_ADD)
|
||||||
|
{
|
||||||
|
this.sum += this.MAX_ADD;
|
||||||
|
this.cardinal += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.sum += value;
|
||||||
|
this.cardinal += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
synchronized public long average()
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
|
||||||
|
if (this.cardinal == 0)
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = this.sum / this.cardinal;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public long cardinal()
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
|
||||||
|
result = this.cardinal;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
synchronized public void reset()
|
||||||
|
{
|
||||||
|
this.sum = 0;
|
||||||
|
this.cardinal = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = Long.toString(this.average());
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public long value()
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
|
||||||
|
result = this.average();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
164
src/fr/devinsy/util/SimpleChronometer.java
Executable file
164
src/fr/devinsy/util/SimpleChronometer.java
Executable file
|
@ -0,0 +1,164 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2008-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SimpleChronometer
|
||||||
|
{
|
||||||
|
//
|
||||||
|
protected long firstTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public SimpleChronometer()
|
||||||
|
{
|
||||||
|
this.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public long interval()
|
||||||
|
{
|
||||||
|
long result;
|
||||||
|
|
||||||
|
result = new Date().getTime() - this.firstTime;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void reset()
|
||||||
|
{
|
||||||
|
this.firstTime = new Date().getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TO BE COMPLETED.
|
||||||
|
*/
|
||||||
|
public static String humanString(final long interval)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (interval < 1000)
|
||||||
|
{
|
||||||
|
result = interval + "ms";
|
||||||
|
}
|
||||||
|
else if (interval < 60 * 1000)
|
||||||
|
{
|
||||||
|
result = interval / 1000 + "," + interval % 1000 + "s";
|
||||||
|
}
|
||||||
|
else if (interval < 60 * 60 * 1000)
|
||||||
|
{
|
||||||
|
result = interval / 1000 + "," + interval % 1000 + "s";
|
||||||
|
}
|
||||||
|
else if (interval < 24 * 60 * 60 * 1000)
|
||||||
|
{
|
||||||
|
result = interval / 1000 + "," + interval % 1000 + "s";
|
||||||
|
}
|
||||||
|
else if (interval < 7 * 24 * 60 * 60 * 1000)
|
||||||
|
{
|
||||||
|
result = interval / 1000 + "," + interval % 1000 + "s";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
// if (interval < 7*24*60*60*1000)
|
||||||
|
{
|
||||||
|
result = interval / 1000 + "," + interval % 1000 + "s";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String shortHumanString(final long interval)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (interval < 1000)
|
||||||
|
{
|
||||||
|
result = interval + " ms";
|
||||||
|
}
|
||||||
|
else if (interval < 2 * 1000)
|
||||||
|
{
|
||||||
|
result = interval / 1000 + " seconde";
|
||||||
|
}
|
||||||
|
else if (interval < 60 * 1000)
|
||||||
|
{
|
||||||
|
result = interval / 1000 + " secondes";
|
||||||
|
}
|
||||||
|
else if (interval < 2 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (60 * 1000L) + " minute";
|
||||||
|
}
|
||||||
|
else if (interval < 60 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (60 * 1000L) + " minutes";
|
||||||
|
}
|
||||||
|
else if (interval < 2 * 60 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (60 * 60 * 1000L) + " heure";
|
||||||
|
}
|
||||||
|
else if (interval < 24 * 60 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (60 * 60 * 1000L) + " heures";
|
||||||
|
}
|
||||||
|
else if (interval < 2 * 24 * 60 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (24 * 60 * 60 * 1000L) + " jour";
|
||||||
|
}
|
||||||
|
else if (interval < 7 * 24 * 60 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (24 * 60 * 60 * 1000L) + " jours";
|
||||||
|
}
|
||||||
|
else if (interval < 2 * 7 * 24 * 60 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (7 * 24 * 60 * 60 * 1000L) + " semaine";
|
||||||
|
}
|
||||||
|
else if (interval < 30 * 24 * 60 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (7 * 24 * 60 * 60 * 1000L) + " semaines";
|
||||||
|
}
|
||||||
|
else if (interval < 52 * 7 * 24 * 60 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (30 * 24 * 60 * 60 * 1000L) + " mois";
|
||||||
|
}
|
||||||
|
else if (interval < 2 * 52 * 7 * 24 * 60 * 60 * 1000L)
|
||||||
|
{
|
||||||
|
result = interval / (52 * 7 * 24 * 60 * 60 * 1000L) + " année";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = interval / (52 * 7 * 24 * 60 * 60 * 1000L) + " années";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
47
src/fr/devinsy/util/StacktraceWriter.java
Normal file
47
src/fr/devinsy/util/StacktraceWriter.java
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2016 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated use <code>SLF4J.Logger.error("blabla", exception)</code> method
|
||||||
|
* or the ExceptionUtils.getStackTrace(throwable).
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public class StacktraceWriter
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @deprecated use <code>SLF4J.Logger.error("blabla", exception)</code>
|
||||||
|
* method or the ExceptionUtils.getStackTrace(throwable).
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public static String toString(final Exception exception)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream(50000);
|
||||||
|
exception.printStackTrace(new PrintStream(out));
|
||||||
|
result = out.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
319
src/fr/devinsy/util/ToolBox.java
Normal file
319
src/fr/devinsy/util/ToolBox.java
Normal file
|
@ -0,0 +1,319 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2008-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import fr.devinsy.util.strings.StringList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author christian.momon@devinsy.fr
|
||||||
|
*/
|
||||||
|
public class ToolBox
|
||||||
|
{
|
||||||
|
|
||||||
|
public static String clean(final String source)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = source.replaceAll("[^\\w ]", " ");
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information about the calling class of a calledClass.
|
||||||
|
*
|
||||||
|
* @param calledClassName
|
||||||
|
* the class name which is the subject of the search.
|
||||||
|
*
|
||||||
|
* @return information about the calling class.
|
||||||
|
*/
|
||||||
|
public static StackTraceElement getCaller(final String calledClassName)
|
||||||
|
{
|
||||||
|
StackTraceElement result;
|
||||||
|
|
||||||
|
//
|
||||||
|
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
|
||||||
|
// System.out.println("////////////////////////////");
|
||||||
|
// for (int i = 0; (i < stack.length) && (i < 4); i++) {
|
||||||
|
// System.out.println(i + " " + stack[i].getClassName());
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Search for first entry of class called.
|
||||||
|
boolean ended = false;
|
||||||
|
Integer indexOfCalled = null;
|
||||||
|
int depth = 1;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (depth < stack.length)
|
||||||
|
{
|
||||||
|
String currentClassName = stack[depth].getClassName();
|
||||||
|
if (currentClassName.equals(calledClassName))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
indexOfCalled = Integer.valueOf(depth);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
depth += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search for caller of class called.
|
||||||
|
if (indexOfCalled == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
ended = false;
|
||||||
|
depth = indexOfCalled;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (depth < stack.length)
|
||||||
|
{
|
||||||
|
String currentClassName = stack[depth].getClassName();
|
||||||
|
if (currentClassName.equals(calledClassName))
|
||||||
|
{
|
||||||
|
depth += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = stack[depth];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param pattern
|
||||||
|
* @param source
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static int indexOf(final String pattern, final List<String> source)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
result = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
boolean ended = false;
|
||||||
|
result = -1;
|
||||||
|
int currentIndex = 0;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (currentIndex < source.size())
|
||||||
|
{
|
||||||
|
String sourceString = source.get(currentIndex);
|
||||||
|
if (StringUtils.equals(sourceString, pattern))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = currentIndex;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentIndex += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
currentIndex = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @param targets
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean matchesAny(final String string, final String... targets)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if ((string == null) || (targets == null))
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
boolean ended = false;
|
||||||
|
int index = 0;
|
||||||
|
result = false;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (index < targets.length)
|
||||||
|
{
|
||||||
|
if (StringUtils.equals(string, targets[index]))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
index += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Double[] sort(final Set<Double> source)
|
||||||
|
{
|
||||||
|
Double[] result;
|
||||||
|
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = new Double[source.size()];
|
||||||
|
|
||||||
|
source.toArray(result);
|
||||||
|
Arrays.sort(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concatenates int values from an array, adding decoration strings.
|
||||||
|
*
|
||||||
|
* @param values
|
||||||
|
* Source of int values.
|
||||||
|
* @param prefix
|
||||||
|
* Decoration to put on start.
|
||||||
|
* @param separator
|
||||||
|
* Decoration to put between values.
|
||||||
|
* @param postfix
|
||||||
|
* Decoration to put on end.
|
||||||
|
*
|
||||||
|
* @return A decorated string representing the int values.
|
||||||
|
*/
|
||||||
|
public static String toString(final int[] values, final String prefix, final String separator, final String postfix)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
StringList buffer = new StringList();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (prefix != null)
|
||||||
|
{
|
||||||
|
buffer.append(prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
boolean firstPassed = false;
|
||||||
|
for (int value : values)
|
||||||
|
{
|
||||||
|
if (firstPassed)
|
||||||
|
{
|
||||||
|
buffer.append(separator);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
firstPassed = true;
|
||||||
|
}
|
||||||
|
buffer.append(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (postfix != null)
|
||||||
|
{
|
||||||
|
buffer.append(postfix);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = buffer.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String toString(final String source)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
500
src/fr/devinsy/util/cmdexec/CmdExec.java
Normal file
500
src/fr/devinsy/util/cmdexec/CmdExec.java
Normal file
|
@ -0,0 +1,500 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2005-2010, 2013, 2015-2016 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.cmdexec;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.util.cmdexec.StreamGobbler.StreamWay;
|
||||||
|
import fr.devinsy.util.strings.StringListUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We must use the isOver method on Gobblers because with short tasks the
|
||||||
|
* waitFor ends before the Gobbler read.
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class CmdExec
|
||||||
|
{
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(CmdExec.class);
|
||||||
|
|
||||||
|
private int exitValue;
|
||||||
|
private String out;
|
||||||
|
private String err;
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// ////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CmdExec(final String command)
|
||||||
|
{
|
||||||
|
run(command, StreamGobbler.StreamWay.BUFFER, StreamGobbler.StreamWay.BUFFER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CmdExec(final String... command)
|
||||||
|
{
|
||||||
|
run(command, StreamGobbler.StreamWay.BUFFER, StreamGobbler.StreamWay.BUFFER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CmdExec(final String command, final StreamGobbler outputGobbler, final StreamGobbler errorGobbler)
|
||||||
|
{
|
||||||
|
run(command, outputGobbler, errorGobbler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CmdExec(final String command, final StreamGobbler.StreamWay stdout, final StreamGobbler.StreamWay stderr)
|
||||||
|
{
|
||||||
|
run(command, stdout, stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CmdExec(final String[] command, final StreamGobbler outputGobbler, final StreamGobbler errorGobbler)
|
||||||
|
{
|
||||||
|
run(command, outputGobbler, errorGobbler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CmdExec(final String[] command, final StreamGobbler.StreamWay stdout, final StreamGobbler.StreamWay stderr)
|
||||||
|
{
|
||||||
|
run(command, stdout, stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// ////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getErrStream()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.err;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int getExitValue()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.exitValue;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getOutStream()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.out;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param command
|
||||||
|
* : not a shell command, it must be a executable program.
|
||||||
|
* @param outputGobbler
|
||||||
|
* @param errorGobbler
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int run(final String command, final StreamGobbler outputGobbler, final StreamGobbler errorGobbler)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
logger.info("CmdExec(command) = [" + command + "]");
|
||||||
|
|
||||||
|
String[] commands = command.split("[ \t\n\r\f]");
|
||||||
|
|
||||||
|
result = run(commands, outputGobbler, errorGobbler);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int run(final String command, final StreamWay stdout, final StreamWay stderr)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = run(command, new StreamGobbler("OUTPUT", stdout), new StreamGobbler("ERROR", stderr));
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note: this code is inspired by an article of Michael C. Daconta published
|
||||||
|
* in JavaWorld Dec 29, 2000 (http://www.javaworld.com/article/2071275
|
||||||
|
* /core-java/when-runtime-exec---won-t.html?page=2).
|
||||||
|
*
|
||||||
|
* @param command
|
||||||
|
* not a shell command, it must be a executable program.
|
||||||
|
* @param outputGobbler
|
||||||
|
* @param errorGobbler
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int run(final String[] command, final StreamGobbler outputGobbler, final StreamGobbler errorGobbler)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
logger.info("CmdExec(command[]) = [" + StringListUtils.toStringSeparatedBy(command, " ") + "]");
|
||||||
|
logger.info("CmdExec(command[]) = [" + StringListUtils.toStringWithBrackets(command) + "]");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Runtime rt = Runtime.getRuntime();
|
||||||
|
|
||||||
|
Process process = rt.exec(command);
|
||||||
|
|
||||||
|
// Set a collector for error message.
|
||||||
|
errorGobbler.setInputStream(process.getErrorStream());
|
||||||
|
|
||||||
|
// Set a collector for output message.
|
||||||
|
outputGobbler.setInputStream(process.getInputStream());
|
||||||
|
|
||||||
|
// Collect messages.
|
||||||
|
errorGobbler.start();
|
||||||
|
outputGobbler.start();
|
||||||
|
|
||||||
|
// Wait and manage the exit value.
|
||||||
|
this.exitValue = process.waitFor();
|
||||||
|
logger.info("ExitValue: {}", this.exitValue);
|
||||||
|
|
||||||
|
// Sometimes, process ends before Gobblers read its outpout, so we
|
||||||
|
// must wait them.
|
||||||
|
while ((!outputGobbler.isOver()) || (!errorGobbler.isOver()))
|
||||||
|
{
|
||||||
|
Thread.sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store messages.
|
||||||
|
this.out = outputGobbler.getStream();
|
||||||
|
this.err = errorGobbler.getStream();
|
||||||
|
|
||||||
|
result = this.exitValue;
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
this.err = exception.getMessage();
|
||||||
|
this.exitValue = -77;
|
||||||
|
result = this.exitValue;
|
||||||
|
logger.error(exception.getMessage(), exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param command
|
||||||
|
* @param stdout
|
||||||
|
* @param stderr
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int run(final String[] command, final StreamGobbler.StreamWay stdout, final StreamGobbler.StreamWay stderr)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = run(command, new StreamGobbler("OUTPUT", stdout), new StreamGobbler("ERROR", stderr));
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param commands
|
||||||
|
* @return
|
||||||
|
* @throws CmdExecException
|
||||||
|
*/
|
||||||
|
public static String multirun(final String... commands) throws CmdExecException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
ArrayList<String> stdouts = new ArrayList<String>(commands.length);
|
||||||
|
|
||||||
|
boolean ended = false;
|
||||||
|
int commandCounter = 0;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (commandCounter < commands.length)
|
||||||
|
{
|
||||||
|
String command = commands[commandCounter];
|
||||||
|
|
||||||
|
if ((command == null) || (command.length() == 0))
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
commandCounter += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stdouts.add(CmdExec.run(command));
|
||||||
|
commandCounter += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int resultLength = 0;
|
||||||
|
for (String stdout : stdouts)
|
||||||
|
{
|
||||||
|
resultLength += stdout.length();
|
||||||
|
}
|
||||||
|
StringBuffer buffer = new StringBuffer(resultLength);
|
||||||
|
for (String stdout : stdouts)
|
||||||
|
{
|
||||||
|
buffer.append(stdout);
|
||||||
|
}
|
||||||
|
result = buffer.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// ////////////////////////////////////////////////////////////////////
|
||||||
|
/**
|
||||||
|
* @throws CmdExecException
|
||||||
|
*/
|
||||||
|
public static String run(final String command) throws CmdExecException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = CmdExec.run(command.split("[ \t\n\r\f]"));
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws CmdExecException
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String run(final String... command) throws CmdExecException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if ((command == null) || (command.length == 0))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Empty command");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CmdExec cmd = new CmdExec(command, StreamGobbler.StreamWay.BUFFER, StreamGobbler.StreamWay.BUFFER);
|
||||||
|
|
||||||
|
if (cmd.getExitValue() == 0)
|
||||||
|
{
|
||||||
|
result = cmd.getOutStream();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.error("Command=\"" + StringListUtils.toStringWithBrackets(command));
|
||||||
|
logger.error("Command=\"[" + StringListUtils.toString(command) + "]\n out => [" + cmd.getOutStream() + "]\n " + "err => (" + cmd.getErrStream().length() + ")[" + cmd.getErrStream()
|
||||||
|
+ "]");
|
||||||
|
throw new CmdExecException(cmd.getErrStream());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* run("sudo", "setfacl", "-m", "g:cpm:rwX", "/tmp/toto");
|
||||||
|
*
|
||||||
|
* run("sudo", "setfacl", "-R", "-m", "g:cpm:rwX", "/tmp/toto");
|
||||||
|
*
|
||||||
|
* @throws CmdExecException
|
||||||
|
*/
|
||||||
|
public static String run(final String program1, final String program2, final String[] args, final int min, final int max) throws CmdExecException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
//
|
||||||
|
boolean nullArg = false;
|
||||||
|
boolean ended = false;
|
||||||
|
int argumentIndex = 0;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (argumentIndex >= args.length)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
nullArg = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (args[argumentIndex] == null)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
nullArg = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
argumentIndex += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (program1 == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Null program parameter 1 detected: [" + program1 + "].");
|
||||||
|
}
|
||||||
|
else if (program2 == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Null program parameter 2 detected: [" + program2 + "].");
|
||||||
|
}
|
||||||
|
else if (nullArg)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Null parameter detected in position " + argumentIndex + " for " + StringListUtils.toStringWithBrackets(args) + ".");
|
||||||
|
}
|
||||||
|
else if ((args.length < min) || (args.length > max))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Bad number of parameters: " + args.length + " for " + StringListUtils.toStringWithBrackets(args) + ".");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
String[] command = new String[args.length + 2];
|
||||||
|
command[0] = program1;
|
||||||
|
command[1] = program2;
|
||||||
|
for (argumentIndex = 0; argumentIndex < args.length; argumentIndex++)
|
||||||
|
{
|
||||||
|
command[argumentIndex + 2] = args[argumentIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
result = CmdExec.run(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* run("setfacl", "-m", "g:cpm:rwX", "/tmp/toto");
|
||||||
|
*
|
||||||
|
* run("setfacl", "-R", "-m", "g:cpm:rwX", "/tmp/toto");
|
||||||
|
*
|
||||||
|
* @throws CmdExecException
|
||||||
|
*/
|
||||||
|
public static String run(final String program, final String[] args, final int min, final int max) throws CmdExecException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
//
|
||||||
|
boolean nullArg = false;
|
||||||
|
boolean ended = false;
|
||||||
|
int argumentCounter = 0;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (argumentCounter >= args.length)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
nullArg = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (args[argumentCounter] == null)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
nullArg = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
argumentCounter += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (program == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Null program parameter detected: [" + program + "].");
|
||||||
|
}
|
||||||
|
else if (nullArg)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Null parameter detected in position " + argumentCounter + " for " + StringListUtils.toStringWithBrackets(args) + ".");
|
||||||
|
}
|
||||||
|
else if ((args.length < min) || (args.length > max))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Bad number of parameters: " + args.length + " for " + StringListUtils.toStringWithBrackets(args) + ".");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
String[] command = new String[args.length + 1];
|
||||||
|
command[0] = program;
|
||||||
|
for (argumentCounter = 0; argumentCounter < args.length; argumentCounter++)
|
||||||
|
{
|
||||||
|
command[argumentCounter + 1] = args[argumentCounter];
|
||||||
|
}
|
||||||
|
|
||||||
|
result = CmdExec.run(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
65
src/fr/devinsy/util/cmdexec/CmdExecException.java
Normal file
65
src/fr/devinsy/util/cmdexec/CmdExecException.java
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2016 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.cmdexec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class CmdExecException extends Exception
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 3264886426311529668L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CmdExecException()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
*/
|
||||||
|
public CmdExecException(final String message)
|
||||||
|
{
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param cause
|
||||||
|
*/
|
||||||
|
public CmdExecException(final String message, final Throwable cause)
|
||||||
|
{
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param cause
|
||||||
|
*/
|
||||||
|
public CmdExecException(final Throwable cause)
|
||||||
|
{
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
}
|
196
src/fr/devinsy/util/cmdexec/StreamGobbler.java
Normal file
196
src/fr/devinsy/util/cmdexec/StreamGobbler.java
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2005-2008, 2010, 2013, 2016 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.cmdexec;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class StreamGobbler extends Thread
|
||||||
|
{
|
||||||
|
public enum StreamWay
|
||||||
|
{
|
||||||
|
NONE,
|
||||||
|
PRINT,
|
||||||
|
BUFFER
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(CmdExec.class);
|
||||||
|
|
||||||
|
private InputStream is;
|
||||||
|
private String name;
|
||||||
|
private StreamWay streamWay;
|
||||||
|
private StringBuffer stream;
|
||||||
|
|
||||||
|
// Important if the caller wants have complete stream in case of very short
|
||||||
|
// command.
|
||||||
|
private boolean isOverStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
StreamGobbler()
|
||||||
|
{
|
||||||
|
this.is = null;
|
||||||
|
this.name = "";
|
||||||
|
this.streamWay = StreamWay.NONE;
|
||||||
|
this.stream = new StringBuffer();
|
||||||
|
this.isOverStatus = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param is
|
||||||
|
* @param name
|
||||||
|
*/
|
||||||
|
StreamGobbler(final InputStream is, final String name)
|
||||||
|
{
|
||||||
|
this.is = is;
|
||||||
|
this.name = name;
|
||||||
|
this.streamWay = StreamWay.NONE;
|
||||||
|
this.stream = new StringBuffer();
|
||||||
|
this.isOverStatus = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param is
|
||||||
|
* @param name
|
||||||
|
* @param streamWay
|
||||||
|
*/
|
||||||
|
StreamGobbler(final InputStream is, final String name, final StreamWay streamWay)
|
||||||
|
{
|
||||||
|
this.is = is;
|
||||||
|
this.name = name;
|
||||||
|
this.streamWay = streamWay;
|
||||||
|
this.stream = new StringBuffer();
|
||||||
|
this.isOverStatus = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param type
|
||||||
|
* @param streamWay
|
||||||
|
*/
|
||||||
|
StreamGobbler(final String type, final StreamWay streamWay)
|
||||||
|
{
|
||||||
|
this.name = type;
|
||||||
|
this.streamWay = streamWay;
|
||||||
|
this.stream = new StringBuffer();
|
||||||
|
this.isOverStatus = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getStream()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (this.stream != null)
|
||||||
|
{
|
||||||
|
result = this.stream.toString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isOver()
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = this.isOverStatus;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
InputStreamReader isr = new InputStreamReader(this.is);
|
||||||
|
BufferedReader buffer = new BufferedReader(isr);
|
||||||
|
String line = null;
|
||||||
|
switch (this.streamWay)
|
||||||
|
{
|
||||||
|
case NONE:
|
||||||
|
while ((line = buffer.readLine()) != null)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRINT:
|
||||||
|
while ((line = buffer.readLine()) != null)
|
||||||
|
{
|
||||||
|
System.out.println(this.name + ">" + line);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BUFFER:
|
||||||
|
while ((line = buffer.readLine()) != null)
|
||||||
|
{
|
||||||
|
this.stream.append(line + "\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
logger.warn("unknow way for stream");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException exception)
|
||||||
|
{
|
||||||
|
logger.error(exception.getMessage(), exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.isOverStatus = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param is
|
||||||
|
*/
|
||||||
|
public void setInputStream(final InputStream is)
|
||||||
|
{
|
||||||
|
this.is = is;
|
||||||
|
}
|
||||||
|
}
|
214
src/fr/devinsy/util/rss/RSSCache.java
Normal file
214
src/fr/devinsy/util/rss/RSSCache.java
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.rss;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import fr.devinsy.util.strings.StringList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class RSSCache
|
||||||
|
{
|
||||||
|
private static RSSCache instance = new RSSCache();
|
||||||
|
private HashMap<String, String> cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private RSSCache()
|
||||||
|
{
|
||||||
|
this.cache = new HashMap<String, String>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
* @param locale
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String get(final String name)
|
||||||
|
{
|
||||||
|
return get(name, Locale.ROOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param locale
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String get(final String name, final Locale locale)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (name == null)
|
||||||
|
{
|
||||||
|
throw new NullPointerException("name is null.");
|
||||||
|
}
|
||||||
|
else if (locale == null)
|
||||||
|
{
|
||||||
|
result = get(name, Locale.ROOT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = this.cache.get(key(name, locale));
|
||||||
|
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
result = this.cache.get(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param locale
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String key(final String name, final Locale locale)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (locale.getLanguage().length() == 0)
|
||||||
|
{
|
||||||
|
result = name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = name + "_" + locale.getLanguage();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
* @param locale
|
||||||
|
* @param rss
|
||||||
|
*/
|
||||||
|
public void put(final String name, final Locale locale, final String rss)
|
||||||
|
{
|
||||||
|
if (name == null)
|
||||||
|
{
|
||||||
|
throw new NullPointerException("name is null.");
|
||||||
|
}
|
||||||
|
else if (locale == null)
|
||||||
|
{
|
||||||
|
put(name, Locale.ROOT, rss);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.cache.put(key(name, locale), rss);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param locale
|
||||||
|
* @param rss
|
||||||
|
*/
|
||||||
|
public void put(final String name, final String rss)
|
||||||
|
{
|
||||||
|
put(name, Locale.ROOT, rss);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
*/
|
||||||
|
public void remove(final String name)
|
||||||
|
{
|
||||||
|
remove(name, Locale.ROOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
*/
|
||||||
|
public void remove(final String name, final Locale locale)
|
||||||
|
{
|
||||||
|
if (name == null)
|
||||||
|
{
|
||||||
|
throw new NullPointerException("key is null.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.cache.remove(name + "-" + locale.getLanguage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
*/
|
||||||
|
public void setOudated(final String name)
|
||||||
|
{
|
||||||
|
for (String subkey : subkeys(name))
|
||||||
|
{
|
||||||
|
if (subkey.startsWith(name))
|
||||||
|
{
|
||||||
|
this.cache.remove(subkey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
*/
|
||||||
|
public StringList subkeys(final String name)
|
||||||
|
{
|
||||||
|
StringList result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = new StringList();
|
||||||
|
|
||||||
|
//
|
||||||
|
for (String key : this.cache.keySet())
|
||||||
|
{
|
||||||
|
if (key.startsWith(name))
|
||||||
|
{
|
||||||
|
result.add(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static RSSCache instance()
|
||||||
|
{
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
154
src/fr/devinsy/util/rss/RSSElement.java
Normal file
154
src/fr/devinsy/util/rss/RSSElement.java
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.rss;
|
||||||
|
|
||||||
|
import org.joda.time.DateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class RSSElement
|
||||||
|
{
|
||||||
|
public static final String DATE_PATTERN = "dd MMM YYYY hh:mm:ss Z";
|
||||||
|
private String name;
|
||||||
|
private String value;
|
||||||
|
private String[] attributes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public RSSElement(final String name, final DateTime value)
|
||||||
|
{
|
||||||
|
setName(name);
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
this.value = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.value = value.toString(DATE_PATTERN);
|
||||||
|
}
|
||||||
|
this.attributes = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public RSSElement(final String name, final long value)
|
||||||
|
{
|
||||||
|
setName(name);
|
||||||
|
this.value = String.valueOf(value);
|
||||||
|
this.attributes = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public RSSElement(final String name, final long value, final String... attributes)
|
||||||
|
{
|
||||||
|
setName(name);
|
||||||
|
this.value = String.valueOf(value);
|
||||||
|
this.attributes = attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public RSSElement(final String name, final String value)
|
||||||
|
{
|
||||||
|
setName(name);
|
||||||
|
this.value = value;
|
||||||
|
this.attributes = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public RSSElement(final String name, final String value, final String... attributes)
|
||||||
|
{
|
||||||
|
setName(name);
|
||||||
|
this.value = value;
|
||||||
|
this.attributes = attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getAttributes()
|
||||||
|
{
|
||||||
|
return this.attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getValue()
|
||||||
|
{
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAttributes(final String[] attributes)
|
||||||
|
{
|
||||||
|
this.attributes = attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
*/
|
||||||
|
public void setName(final String name)
|
||||||
|
{
|
||||||
|
if (name == null)
|
||||||
|
{
|
||||||
|
throw new NullPointerException("name is null");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public void setValue(final String value)
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
172
src/fr/devinsy/util/rss/RSSWriter.java
Normal file
172
src/fr/devinsy/util/rss/RSSWriter.java
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.rss;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.io.Writer;
|
||||||
|
|
||||||
|
import fr.devinsy.util.xml.XMLWriter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class RSSWriter
|
||||||
|
{
|
||||||
|
private XMLWriter out;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public RSSWriter(final File file) throws UnsupportedEncodingException, FileNotFoundException
|
||||||
|
{
|
||||||
|
this.out = new XMLWriter(file);
|
||||||
|
writeRSSHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param target
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public RSSWriter(final OutputStream target) throws UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
this.out = new XMLWriter(target);
|
||||||
|
writeRSSHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param target
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public RSSWriter(final Writer target) throws UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
this.out = new XMLWriter(target);
|
||||||
|
writeRSSHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void close() throws IOException
|
||||||
|
{
|
||||||
|
if (this.out != null)
|
||||||
|
{
|
||||||
|
this.out.writeEndTag("channel");
|
||||||
|
this.out.writeEndTag("rss");
|
||||||
|
this.out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void flush() throws IOException
|
||||||
|
{
|
||||||
|
if (this.out != null)
|
||||||
|
{
|
||||||
|
this.out.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void writeChannel(final String title, final String link, final String description, final RSSElement... elements)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
this.out.writeStartTag("channel");
|
||||||
|
|
||||||
|
//
|
||||||
|
this.out.writeTag("title", title);
|
||||||
|
this.out.writeTag("link", link);
|
||||||
|
this.out.writeTag("description", description);
|
||||||
|
|
||||||
|
//
|
||||||
|
if ((elements != null) && (elements.length > 0))
|
||||||
|
{
|
||||||
|
for (RSSElement element : elements)
|
||||||
|
{
|
||||||
|
this.out.writeTag(element.getName(), element.getValue(), element.getAttributes());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param comment
|
||||||
|
*/
|
||||||
|
public void writeComment(final String comment)
|
||||||
|
{
|
||||||
|
this.out.writeComment(comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void writeItem(final String title, final String link, final String description, final RSSElement... elements)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
this.out.writeStartTag("item");
|
||||||
|
|
||||||
|
//
|
||||||
|
this.out.writeTag("title", title);
|
||||||
|
if (link != null)
|
||||||
|
{
|
||||||
|
this.out.writeTag("link", link);
|
||||||
|
}
|
||||||
|
if (description == null)
|
||||||
|
{
|
||||||
|
this.out.writeTag("description", "n/a");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.out.writeTag("description", description);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if ((elements != null) && (elements.length > 0))
|
||||||
|
{
|
||||||
|
for (RSSElement element : elements)
|
||||||
|
{
|
||||||
|
this.out.writeTag(element.getName(), element.getValue(), element.getAttributes());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
this.out.writeEndTag("item");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private void writeRSSHeader()
|
||||||
|
{
|
||||||
|
this.out.writeXMLHeader();
|
||||||
|
this.out.writeStartTag("rss", "version", "2.0");
|
||||||
|
}
|
||||||
|
}
|
46
src/fr/devinsy/util/strings/BufferedStringListReader.java
Normal file
46
src/fr/devinsy/util/strings/BufferedStringListReader.java
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
package fr.devinsy.util.strings;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class BufferedStringListReader implements StringListReader
|
||||||
|
{
|
||||||
|
private BufferedReader in;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param in
|
||||||
|
*/
|
||||||
|
public BufferedStringListReader(final BufferedReader in)
|
||||||
|
{
|
||||||
|
this.in = in;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void close()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String readLine() throws IOException
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.in.readLine();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,34 +1,16 @@
|
||||||
/*
|
package fr.devinsy.util.strings;
|
||||||
* Copyright (C) 2013-2018 Christian Pierre MOMON
|
|
||||||
*
|
|
||||||
* This file is part of Devinsy-strings.
|
|
||||||
*
|
|
||||||
* Devinsy-strings is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Devinsy-strings is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Devinsy-strings. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
package fr.devinsy.strings;
|
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class StringLengthComparator.
|
*
|
||||||
*/
|
*/
|
||||||
public class StringLengthComparator implements Comparator<String>
|
public class StringLengthComparator implements Comparator<String>
|
||||||
{
|
{
|
||||||
private static StringLengthComparator instance;
|
private static StringLengthComparator instance;
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/**
|
||||||
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
|
*
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int compare(final String alpha, final String bravo)
|
public int compare(final String alpha, final String bravo)
|
||||||
|
@ -39,10 +21,13 @@ public class StringLengthComparator implements Comparator<String>
|
||||||
Integer alphaValue;
|
Integer alphaValue;
|
||||||
if (alpha == null)
|
if (alpha == null)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
alphaValue = null;
|
alphaValue = null;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//
|
||||||
alphaValue = alpha.length();
|
alphaValue = alpha.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,10 +35,13 @@ public class StringLengthComparator implements Comparator<String>
|
||||||
Integer bravoValue;
|
Integer bravoValue;
|
||||||
if (bravo == null)
|
if (bravo == null)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
bravoValue = null;
|
bravoValue = null;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//
|
||||||
bravoValue = bravo.length();
|
bravoValue = bravo.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,8 +59,8 @@ public class StringLengthComparator implements Comparator<String>
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* compare(null, null) = 0
|
* compare(null, null) = 0
|
||||||
* compare(null, bravo) < 0
|
* compare(null, bravo) < 0
|
||||||
* compare(alpha, null) > 0
|
* compare(alpha, null) > 0
|
||||||
* compare(alpha, bravo) = alpha.compareTo(bravo)
|
* compare(alpha, bravo) = alpha.compareTo(bravo)
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -92,18 +80,25 @@ public class StringLengthComparator implements Comparator<String>
|
||||||
//
|
//
|
||||||
if ((alpha == null) && (bravo == null))
|
if ((alpha == null) && (bravo == null))
|
||||||
{
|
{
|
||||||
|
//
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (alpha == null)
|
else if (alpha == null)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
result = -1;
|
result = -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (bravo == null)
|
else if (bravo == null)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
result = +1;
|
result = +1;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//
|
||||||
result = alpha.compareTo(bravo);
|
result = alpha.compareTo(bravo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,9 +107,8 @@ public class StringLengthComparator implements Comparator<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instance.
|
|
||||||
*
|
*
|
||||||
* @return the string length comparator
|
* @return
|
||||||
*/
|
*/
|
||||||
public static StringLengthComparator instance()
|
public static StringLengthComparator instance()
|
||||||
{
|
{
|
1130
src/fr/devinsy/strings/StringList.java → src/fr/devinsy/util/strings/StringList.java
Normal file → Executable file
1130
src/fr/devinsy/strings/StringList.java → src/fr/devinsy/util/strings/StringList.java
Normal file → Executable file
File diff suppressed because it is too large
Load diff
|
@ -1,38 +1,36 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2014-2015,2017-2018 Christian Pierre MOMON
|
* Copyright (C) 2014-2015 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Devinsy-strings.
|
* This file is part of Devinsy-utils.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is free software: you can redistribute it and/or modify
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is distributed in the hope that it will be useful,
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU Lesser General Public License for more details.
|
* GNU Lesser General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
* along with Devinsy-strings. If not, see <http://www.gnu.org/licenses/>
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.strings;
|
package fr.devinsy.util.strings;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class StringListCharIterator.
|
*
|
||||||
*/
|
*/
|
||||||
public class StringListCharIterator implements Iterator<Character>
|
public class StringListCharIterator implements Iterator<Character>
|
||||||
{
|
{
|
||||||
private StringList source;
|
private StringList source;
|
||||||
|
private StringListCharPosition currentPosition;
|
||||||
private StringListCharPosition nextPosition;
|
private StringListCharPosition nextPosition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list char iterator.
|
|
||||||
*
|
*
|
||||||
* @param source
|
|
||||||
* the source
|
|
||||||
*/
|
*/
|
||||||
public StringListCharIterator(final StringList source)
|
public StringListCharIterator(final StringList source)
|
||||||
{
|
{
|
||||||
|
@ -42,8 +40,8 @@ public class StringListCharIterator implements Iterator<Character>
|
||||||
this.nextPosition = new StringListCharPosition();
|
this.nextPosition = new StringListCharPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/**
|
||||||
* @see java.util.Iterator#hasNext()
|
*
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext()
|
public boolean hasNext()
|
||||||
|
@ -70,8 +68,8 @@ public class StringListCharIterator implements Iterator<Character>
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/**
|
||||||
* @see java.util.Iterator#next()
|
*
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Character next()
|
public Character next()
|
||||||
|
@ -111,9 +109,8 @@ public class StringListCharIterator implements Iterator<Character>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Next position.
|
|
||||||
*
|
*
|
||||||
* @return the string list char position
|
* @return
|
||||||
*/
|
*/
|
||||||
public StringListCharPosition nextPosition()
|
public StringListCharPosition nextPosition()
|
||||||
{
|
{
|
|
@ -1,22 +1,22 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2013-2015,2017-2018 Christian Pierre MOMON
|
* Copyright (C) 2013-2015 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Devinsy-strings.
|
* This file is part of Devinsy-utils.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is free software: you can redistribute it and/or modify
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is distributed in the hope that it will be useful,
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU Lesser General Public License for more details.
|
* GNU Lesser General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
* along with Devinsy-strings. If not, see <http://www.gnu.org/licenses/>
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.strings;
|
package fr.devinsy.util.strings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class manages a char position in a StringList object.
|
* This class manages a char position in a StringList object.
|
||||||
|
@ -30,7 +30,10 @@ public class StringListCharPosition
|
||||||
private int localCharIndex;
|
private int localCharIndex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list char position.
|
*
|
||||||
|
* @param index
|
||||||
|
* @param stringIndex
|
||||||
|
* @param localIndex
|
||||||
*/
|
*/
|
||||||
public StringListCharPosition()
|
public StringListCharPosition()
|
||||||
{
|
{
|
||||||
|
@ -40,14 +43,10 @@ public class StringListCharPosition
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list char position.
|
|
||||||
*
|
*
|
||||||
* @param index
|
* @param index
|
||||||
* the index
|
|
||||||
* @param stringIndex
|
* @param stringIndex
|
||||||
* the string index
|
|
||||||
* @param localIndex
|
* @param localIndex
|
||||||
* the local index
|
|
||||||
*/
|
*/
|
||||||
public StringListCharPosition(final int index, final int stringIndex, final int localIndex)
|
public StringListCharPosition(final int index, final int stringIndex, final int localIndex)
|
||||||
{
|
{
|
||||||
|
@ -57,10 +56,8 @@ public class StringListCharPosition
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list char position.
|
|
||||||
*
|
*
|
||||||
* @param source
|
* @param source
|
||||||
* the source
|
|
||||||
*/
|
*/
|
||||||
public StringListCharPosition(final StringListCharPosition source)
|
public StringListCharPosition(final StringListCharPosition source)
|
||||||
{
|
{
|
||||||
|
@ -69,84 +66,46 @@ public class StringListCharPosition
|
||||||
this.localCharIndex = source.getLocalCharIndex();
|
this.localCharIndex = source.getLocalCharIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the char index.
|
|
||||||
*
|
|
||||||
* @return the char index
|
|
||||||
*/
|
|
||||||
public int getCharIndex()
|
public int getCharIndex()
|
||||||
{
|
{
|
||||||
return this.charIndex;
|
return this.charIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the local char index.
|
|
||||||
*
|
|
||||||
* @return the local char index
|
|
||||||
*/
|
|
||||||
public int getLocalCharIndex()
|
public int getLocalCharIndex()
|
||||||
{
|
{
|
||||||
return this.localCharIndex;
|
return this.localCharIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the string index.
|
|
||||||
*
|
|
||||||
* @return the string index
|
|
||||||
*/
|
|
||||||
public int getStringIndex()
|
public int getStringIndex()
|
||||||
{
|
{
|
||||||
return this.stringIndex;
|
return this.stringIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Next.
|
|
||||||
*/
|
|
||||||
public void next()
|
public void next()
|
||||||
{
|
{
|
||||||
this.charIndex += 1;
|
this.charIndex += 1;
|
||||||
this.localCharIndex += 1;
|
this.localCharIndex += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Next end of line.
|
|
||||||
*/
|
|
||||||
public void nextEndOfLine()
|
public void nextEndOfLine()
|
||||||
{
|
{
|
||||||
this.localCharIndex = 0;
|
this.localCharIndex = 0;
|
||||||
this.stringIndex += 1;
|
this.stringIndex += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the char index.
|
|
||||||
*
|
|
||||||
* @param charIndex
|
|
||||||
* the new char index
|
|
||||||
*/
|
|
||||||
public void setCharIndex(final int charIndex)
|
public void setCharIndex(final int charIndex)
|
||||||
{
|
{
|
||||||
this.charIndex = charIndex;
|
this.charIndex = charIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the local char index.
|
|
||||||
*
|
|
||||||
* @param localCharIndex
|
|
||||||
* the new local char index
|
|
||||||
*/
|
|
||||||
public void setLocalCharIndex(final int localCharIndex)
|
public void setLocalCharIndex(final int localCharIndex)
|
||||||
{
|
{
|
||||||
this.localCharIndex = localCharIndex;
|
this.localCharIndex = localCharIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the string index.
|
|
||||||
*
|
|
||||||
* @param stringIndex
|
|
||||||
* the new string index
|
|
||||||
*/
|
|
||||||
public void setStringIndex(final int stringIndex)
|
public void setStringIndex(final int stringIndex)
|
||||||
{
|
{
|
||||||
this.stringIndex = stringIndex;
|
this.stringIndex = stringIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,35 +1,35 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2013-2020 Christian Pierre MOMON
|
* Copyright (C) 2013-2015 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Devinsy-strings.
|
* This file is part of Devinsy-utils.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is free software: you can redistribute it and/or modify
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is distributed in the hope that it will be useful,
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU Lesser General Public License for more details.
|
* GNU Lesser General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
* along with Devinsy-strings. If not, see <http://www.gnu.org/licenses/>
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.strings;
|
package fr.devinsy.util.strings;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class StringListInputStream.
|
* TODO CREATION STEP.
|
||||||
*/
|
*/
|
||||||
public class StringListInputStream extends InputStream
|
public class StringListInputStream extends InputStream
|
||||||
{
|
{
|
||||||
private StringList in;
|
private StringList in;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list input stream.
|
*
|
||||||
*/
|
*/
|
||||||
public StringListInputStream()
|
public StringListInputStream()
|
||||||
{
|
{
|
||||||
|
@ -37,10 +37,7 @@ public class StringListInputStream extends InputStream
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list input stream.
|
|
||||||
*
|
*
|
||||||
* @param size
|
|
||||||
* the size
|
|
||||||
*/
|
*/
|
||||||
public StringListInputStream(final int size)
|
public StringListInputStream(final int size)
|
||||||
{
|
{
|
||||||
|
@ -48,16 +45,13 @@ public class StringListInputStream extends InputStream
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list input stream.
|
|
||||||
*
|
*
|
||||||
* @param source
|
|
||||||
* the source
|
|
||||||
*/
|
*/
|
||||||
public StringListInputStream(final StringList source)
|
public StringListInputStream(final StringList source)
|
||||||
{
|
{
|
||||||
if (source == null)
|
if (source == null)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("source is null.");
|
throw new NullPointerException("source is null.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
23
src/fr/devinsy/util/strings/StringListReader.java
Normal file
23
src/fr/devinsy/util/strings/StringListReader.java
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package fr.devinsy.util.strings;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface StringListReader extends Closeable
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
void close();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String readLine() throws IOException;
|
||||||
|
}
|
1038
src/fr/devinsy/util/strings/StringListUtils.java
Normal file
1038
src/fr/devinsy/util/strings/StringListUtils.java
Normal file
File diff suppressed because it is too large
Load diff
58
src/fr/devinsy/strings/StringListWriter.java → src/fr/devinsy/util/strings/StringListWriter.java
Normal file → Executable file
58
src/fr/devinsy/strings/StringListWriter.java → src/fr/devinsy/util/strings/StringListWriter.java
Normal file → Executable file
|
@ -1,35 +1,35 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2013-2020 Christian Pierre MOMON
|
* Copyright (C) 2013-2015 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Devinsy-strings.
|
* This file is part of Devinsy-utils.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is free software: you can redistribute it and/or modify
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is distributed in the hope that it will be useful,
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU Lesser General Public License for more details.
|
* GNU Lesser General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
* along with Devinsy-strings. If not, see <http://www.gnu.org/licenses/>
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.strings;
|
package fr.devinsy.util.strings;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class StringListWriter.
|
*
|
||||||
*/
|
*/
|
||||||
public class StringListWriter extends Writer
|
public class StringListWriter extends Writer
|
||||||
{
|
{
|
||||||
private StringList out;
|
private StringList out;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list writer.
|
*
|
||||||
*/
|
*/
|
||||||
public StringListWriter()
|
public StringListWriter()
|
||||||
{
|
{
|
||||||
|
@ -37,27 +37,21 @@ public class StringListWriter extends Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list writer.
|
|
||||||
*
|
*
|
||||||
* @param initialCapacity
|
|
||||||
* the initial capacity
|
|
||||||
*/
|
*/
|
||||||
public StringListWriter(final int initialCapacity)
|
public StringListWriter(final int size)
|
||||||
{
|
{
|
||||||
this.out = new StringList(initialCapacity);
|
this.out = new StringList(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string list writer.
|
|
||||||
*
|
*
|
||||||
* @param target
|
|
||||||
* the target
|
|
||||||
*/
|
*/
|
||||||
public StringListWriter(final StringList target)
|
public StringListWriter(final StringList target)
|
||||||
{
|
{
|
||||||
if (target == null)
|
if (target == null)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("target is null.");
|
throw new NullPointerException("target is null.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -65,9 +59,6 @@ public class StringListWriter extends Writer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see java.io.Writer#close()
|
|
||||||
*/
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -77,9 +68,6 @@ public class StringListWriter extends Writer
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see java.io.Writer#flush()
|
|
||||||
*/
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -89,8 +77,8 @@ public class StringListWriter extends Writer
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
* @see java.lang.Object#toString()
|
*
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
|
@ -104,9 +92,8 @@ public class StringListWriter extends Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To string list.
|
|
||||||
*
|
*
|
||||||
* @return the string list
|
* @return
|
||||||
*/
|
*/
|
||||||
public StringList toStringList()
|
public StringList toStringList()
|
||||||
{
|
{
|
||||||
|
@ -118,21 +105,16 @@ public class StringListWriter extends Writer
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Write.
|
|
||||||
*
|
*
|
||||||
* @param c
|
|
||||||
* the c
|
|
||||||
* @throws IOException
|
|
||||||
* Signals that an I/O exception has occurred.
|
|
||||||
*/
|
*/
|
||||||
public void write(final char c) throws IOException
|
public void write(final char c) throws IOException
|
||||||
{
|
{
|
||||||
this.out.append(c);
|
this.out.append(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
* @see java.io.Writer#write(char[], int, int)
|
*
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void write(final char[] cbuf, final int off, final int len) throws IOException
|
public void write(final char[] cbuf, final int off, final int len) throws IOException
|
||||||
|
@ -155,8 +137,8 @@ public class StringListWriter extends Writer
|
||||||
this.out.append(new String(target));
|
this.out.append(new String(target));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
* @see java.io.Writer#write(java.lang.String)
|
*
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void write(final String string) throws IOException
|
public void write(final String string) throws IOException
|
|
@ -1,36 +1,37 @@
|
||||||
/*
|
/**
|
||||||
* Copyright (C) 2014-2018 Christian Pierre MOMON
|
* Copyright (C) 2014-2016 Christian Pierre MOMON
|
||||||
*
|
*
|
||||||
* This file is part of Devinsy-strings.
|
* This file is part of Devinsy-utils.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is free software: you can redistribute it and/or modify
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* Devinsy-strings is distributed in the hope that it will be useful,
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU Lesser General Public License for more details.
|
* GNU Lesser General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
* along with Devinsy-strings. If not, see <http://www.gnu.org/licenses/>
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
package fr.devinsy.strings;
|
package fr.devinsy.util.strings;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is a set of String objects with specific methods. It makes possible to build a string without any copy.
|
* This class is a set of String objects with specific methods. It makes
|
||||||
* The goal is to make easier the use of set of strings.
|
* possible to build a string without any copy. The goal is to make easier the
|
||||||
|
* use of set of strings.
|
||||||
*/
|
*/
|
||||||
public class StringSet extends HashSet<String>
|
public class StringSet extends HashSet<String>
|
||||||
{
|
{
|
||||||
private static final long serialVersionUID = 6674838743930005326L;
|
private static final long serialVersionUID = 6674838743930005326L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string set.
|
*
|
||||||
*/
|
*/
|
||||||
public StringSet()
|
public StringSet()
|
||||||
{
|
{
|
||||||
|
@ -38,11 +39,10 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a list of string of the specified collection, in the order they are returned by the collection's
|
* Constructs a list of string of the specified collection, in the order
|
||||||
* iterator.
|
* they are returned by the collection's iterator.
|
||||||
*
|
*
|
||||||
* @param source
|
* @param source
|
||||||
* the source
|
|
||||||
*/
|
*/
|
||||||
public StringSet(final Collection<String> source)
|
public StringSet(final Collection<String> source)
|
||||||
{
|
{
|
||||||
|
@ -59,10 +59,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string set.
|
|
||||||
*
|
*
|
||||||
* @param initialCapacity
|
|
||||||
* the initial capacity
|
|
||||||
*/
|
*/
|
||||||
public StringSet(final int initialCapacity)
|
public StringSet(final int initialCapacity)
|
||||||
{
|
{
|
||||||
|
@ -70,10 +67,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string set.
|
|
||||||
*
|
*
|
||||||
* @param source
|
|
||||||
* the source
|
|
||||||
*/
|
*/
|
||||||
public StringSet(final String[] source)
|
public StringSet(final String[] source)
|
||||||
{
|
{
|
||||||
|
@ -81,6 +75,7 @@ public class StringSet extends HashSet<String>
|
||||||
|
|
||||||
if (source != null)
|
if (source != null)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
for (String string : source)
|
for (String string : source)
|
||||||
{
|
{
|
||||||
this.add(string);
|
this.add(string);
|
||||||
|
@ -89,10 +84,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new string set.
|
|
||||||
*
|
*
|
||||||
* @param source
|
|
||||||
* the source
|
|
||||||
*/
|
*/
|
||||||
public StringSet(final StringSet source)
|
public StringSet(final StringSet source)
|
||||||
{
|
{
|
||||||
|
@ -100,6 +92,7 @@ public class StringSet extends HashSet<String>
|
||||||
|
|
||||||
if (source != null)
|
if (source != null)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
for (String string : source)
|
for (String string : source)
|
||||||
{
|
{
|
||||||
this.add(string);
|
this.add(string);
|
||||||
|
@ -109,23 +102,21 @@ public class StringSet extends HashSet<String>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check null parameter before add.
|
* Check null parameter before add.
|
||||||
*
|
|
||||||
* @param string
|
|
||||||
* the string
|
|
||||||
* @return true, if successful
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean add(final String string)
|
public boolean add(final String string)
|
||||||
{
|
{
|
||||||
boolean result;
|
boolean result;
|
||||||
|
|
||||||
if (string == null)
|
if (string != null)
|
||||||
{
|
{
|
||||||
result = false;
|
//
|
||||||
|
result = super.add(string);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = super.add(string);
|
//
|
||||||
|
result = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -133,11 +124,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds the.
|
|
||||||
*
|
*
|
||||||
* @param strings
|
|
||||||
* the strings
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet add(final StringSet strings)
|
public StringSet add(final StringSet strings)
|
||||||
{
|
{
|
||||||
|
@ -158,9 +145,10 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deep copy and shallow copy have no sense about a list of immutable objects.
|
* Deep copy and shallow copy have no sense about a list of immutable
|
||||||
|
* objects.
|
||||||
*
|
*
|
||||||
* @return the string set
|
* @return
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public StringSet clone()
|
public StringSet clone()
|
||||||
|
@ -179,9 +167,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Length.
|
|
||||||
*
|
*
|
||||||
* @return the int
|
|
||||||
*/
|
*/
|
||||||
public int length()
|
public int length()
|
||||||
{
|
{
|
||||||
|
@ -197,9 +183,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merge.
|
|
||||||
*
|
*
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet merge()
|
public StringSet merge()
|
||||||
{
|
{
|
||||||
|
@ -223,11 +207,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put.
|
|
||||||
*
|
*
|
||||||
* @param character
|
|
||||||
* the character
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet put(final char character)
|
public StringSet put(final char character)
|
||||||
{
|
{
|
||||||
|
@ -242,11 +222,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put.
|
|
||||||
*
|
*
|
||||||
* @param value
|
|
||||||
* the value
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet put(final double value)
|
public StringSet put(final double value)
|
||||||
{
|
{
|
||||||
|
@ -259,11 +235,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put.
|
|
||||||
*
|
*
|
||||||
* @param value
|
|
||||||
* the value
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet put(final int value)
|
public StringSet put(final int value)
|
||||||
{
|
{
|
||||||
|
@ -276,11 +248,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put.
|
|
||||||
*
|
*
|
||||||
* @param value
|
|
||||||
* the value
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet put(final long value)
|
public StringSet put(final long value)
|
||||||
{
|
{
|
||||||
|
@ -293,11 +261,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put.
|
|
||||||
*
|
*
|
||||||
* @param value
|
|
||||||
* the value
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet put(final Object value)
|
public StringSet put(final Object value)
|
||||||
{
|
{
|
||||||
|
@ -316,10 +280,6 @@ public class StringSet extends HashSet<String>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check null parameter before add.
|
* Check null parameter before add.
|
||||||
*
|
|
||||||
* @param string
|
|
||||||
* the string
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet put(final String string)
|
public StringSet put(final String string)
|
||||||
{
|
{
|
||||||
|
@ -337,11 +297,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put.
|
|
||||||
*
|
*
|
||||||
* @param strings
|
|
||||||
* the strings
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet put(final String... strings)
|
public StringSet put(final String... strings)
|
||||||
{
|
{
|
||||||
|
@ -362,11 +318,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put.
|
|
||||||
*
|
*
|
||||||
* @param strings
|
|
||||||
* the strings
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet put(final StringList strings)
|
public StringSet put(final StringList strings)
|
||||||
{
|
{
|
||||||
|
@ -387,11 +339,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put.
|
|
||||||
*
|
*
|
||||||
* @param strings
|
|
||||||
* the strings
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet put(final StringSet strings)
|
public StringSet put(final StringSet strings)
|
||||||
{
|
{
|
||||||
|
@ -412,11 +360,7 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Put nullable.
|
|
||||||
*
|
*
|
||||||
* @param value
|
|
||||||
* the value
|
|
||||||
* @return the string set
|
|
||||||
*/
|
*/
|
||||||
public StringSet putNullable(final Object value)
|
public StringSet putNullable(final Object value)
|
||||||
{
|
{
|
||||||
|
@ -437,8 +381,8 @@ public class StringSet extends HashSet<String>
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/**
|
||||||
* @see java.util.AbstractCollection#toString()
|
*
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
|
@ -452,9 +396,8 @@ public class StringSet extends HashSet<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To string list.
|
|
||||||
*
|
*
|
||||||
* @return the string list
|
* @return
|
||||||
*/
|
*/
|
||||||
public StringList toStringList()
|
public StringList toStringList()
|
||||||
{
|
{
|
134
src/fr/devinsy/util/unix/CachedFile.java
Normal file
134
src/fr/devinsy/util/unix/CachedFile.java
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class CachedFile
|
||||||
|
{
|
||||||
|
public enum Status
|
||||||
|
{
|
||||||
|
NOT_LOAD, EXPIRED, UPDATED
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(CachedFile.class);
|
||||||
|
|
||||||
|
protected String sourceName;
|
||||||
|
protected long sourceTime;
|
||||||
|
protected Status status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CachedFile(final String fileName)
|
||||||
|
{
|
||||||
|
this.sourceName = fileName;
|
||||||
|
this.sourceTime = 0;
|
||||||
|
this.status = Status.NOT_LOAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected File getSourceFile()
|
||||||
|
{
|
||||||
|
File result;
|
||||||
|
|
||||||
|
if (this.sourceName == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
File source = new File(this.sourceName);
|
||||||
|
|
||||||
|
if (!source.exists())
|
||||||
|
{
|
||||||
|
logger.error("source file defined but not found");
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected Status getStatus()
|
||||||
|
{
|
||||||
|
Status result;
|
||||||
|
|
||||||
|
File source = getSourceFile();
|
||||||
|
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
this.status = Status.NOT_LOAD;
|
||||||
|
}
|
||||||
|
else if (this.sourceTime != source.lastModified())
|
||||||
|
{
|
||||||
|
this.status = Status.EXPIRED;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = this.status;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setNotLoad()
|
||||||
|
{
|
||||||
|
this.status = Status.NOT_LOAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setUpdated()
|
||||||
|
{
|
||||||
|
File source = getSourceFile();
|
||||||
|
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
this.status = Status.NOT_LOAD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.sourceTime = source.lastModified();
|
||||||
|
this.status = Status.UPDATED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
200
src/fr/devinsy/util/unix/EtcGroupFile.java
Normal file
200
src/fr/devinsy/util/unix/EtcGroupFile.java
Normal file
|
@ -0,0 +1,200 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class EtcGroupFile extends CachedFile
|
||||||
|
{
|
||||||
|
// static private final Logger logger =
|
||||||
|
// LoggerFactory.getLogger(EtcGroupFile.class);
|
||||||
|
|
||||||
|
private static EtcGroupFile instance = null;
|
||||||
|
protected Groups groups;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected EtcGroupFile()
|
||||||
|
{
|
||||||
|
super("/etc/group");
|
||||||
|
this.groups = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean contains(final String name)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
Groups groups = updatedGroups();
|
||||||
|
|
||||||
|
if (groups == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = groups.contains(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Group get(final int gid)
|
||||||
|
{
|
||||||
|
Group result;
|
||||||
|
|
||||||
|
Groups groups = updatedGroups();
|
||||||
|
|
||||||
|
if (groups == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = groups.getByGid(gid);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Group get(final String name)
|
||||||
|
{
|
||||||
|
Group result;
|
||||||
|
|
||||||
|
Groups groups = updatedGroups();
|
||||||
|
|
||||||
|
if (groups == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = groups.getByName(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Vector<String> getLoginGroups(final String login)
|
||||||
|
{
|
||||||
|
Vector<String> result;
|
||||||
|
|
||||||
|
Groups groups = updatedGroups();
|
||||||
|
|
||||||
|
result = groups.getLoginGroups(login);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getLoginGroupsString(final String login)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
this.groups = updatedGroups();
|
||||||
|
|
||||||
|
result = this.groups.getLoginGroupsString(login);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.groups.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected Groups updatedGroups()
|
||||||
|
{
|
||||||
|
Groups result;
|
||||||
|
|
||||||
|
if (getStatus() != Status.UPDATED)
|
||||||
|
{
|
||||||
|
this.groups = EtcGroupFileReader.load();
|
||||||
|
|
||||||
|
if (this.groups == null)
|
||||||
|
{
|
||||||
|
setNotLoad();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = this.groups;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static public EtcGroupFile instance()
|
||||||
|
{
|
||||||
|
EtcGroupFile result;
|
||||||
|
|
||||||
|
if (EtcGroupFile.instance == null)
|
||||||
|
{
|
||||||
|
EtcGroupFile.instance = new EtcGroupFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
result = EtcGroupFile.instance;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
102
src/fr/devinsy/util/unix/EtcGroupFileReader.java
Normal file
102
src/fr/devinsy/util/unix/EtcGroupFileReader.java
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileReader;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class EtcGroupFileReader
|
||||||
|
{
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(EtcGroupFileReader.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static Groups load()
|
||||||
|
{
|
||||||
|
Groups result;
|
||||||
|
|
||||||
|
BufferedReader file;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
file = new BufferedReader(new FileReader("/etc/group"));
|
||||||
|
}
|
||||||
|
catch (FileNotFoundException exception)
|
||||||
|
{
|
||||||
|
logger.error("File not found");
|
||||||
|
file = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = new Groups();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String line;
|
||||||
|
while ((line = file.readLine()) != null)
|
||||||
|
{
|
||||||
|
String[] tokens = line.split(":");
|
||||||
|
|
||||||
|
Group group = new Group();
|
||||||
|
group.setName(tokens[0]);
|
||||||
|
group.setPassword(tokens[1]);
|
||||||
|
group.setGid((new Integer(tokens[2])).intValue());
|
||||||
|
|
||||||
|
// Manage the case of empty shell.
|
||||||
|
if (tokens.length == 4)
|
||||||
|
{
|
||||||
|
String[] tokensBis = tokens[3].split(",");
|
||||||
|
|
||||||
|
for (int tokenCounter = 0; tokenCounter < tokensBis.length; tokenCounter++)
|
||||||
|
{
|
||||||
|
group.addMember(tokensBis[tokenCounter]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.add(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
catch (java.io.IOException exception)
|
||||||
|
{
|
||||||
|
logger.error("Exception here.");
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
186
src/fr/devinsy/util/unix/EtcPasswdFile.java
Normal file
186
src/fr/devinsy/util/unix/EtcPasswdFile.java
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class EtcPasswdFile extends CachedFile
|
||||||
|
{
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(EtcPasswdFile.class);
|
||||||
|
|
||||||
|
private static EtcPasswdFile instance = null;
|
||||||
|
protected Users users;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected EtcPasswdFile()
|
||||||
|
{
|
||||||
|
super("/etc/passwd");
|
||||||
|
this.users = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean contains(final String login)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
Users users = updatedUsers();
|
||||||
|
|
||||||
|
if (users == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = users.contains(login);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public User get(final int uid)
|
||||||
|
{
|
||||||
|
User result;
|
||||||
|
|
||||||
|
Users users = updatedUsers();
|
||||||
|
|
||||||
|
if (users == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = users.getByUid(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public User get(final String login)
|
||||||
|
{
|
||||||
|
User result;
|
||||||
|
|
||||||
|
Users users = updatedUsers();
|
||||||
|
|
||||||
|
if (users == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = users.getByLogin(login);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.users.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected Users update()
|
||||||
|
{
|
||||||
|
Users result;
|
||||||
|
|
||||||
|
logger.debug("updating");
|
||||||
|
this.users = EtcPasswdFileReader.load();
|
||||||
|
|
||||||
|
if (this.users == null)
|
||||||
|
{
|
||||||
|
setNotLoad();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
result = this.users;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected Users updatedUsers()
|
||||||
|
{
|
||||||
|
Users result;
|
||||||
|
|
||||||
|
if (getStatus() != Status.UPDATED)
|
||||||
|
{
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
result = this.users;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static EtcPasswdFile instance()
|
||||||
|
{
|
||||||
|
EtcPasswdFile result;
|
||||||
|
|
||||||
|
if (EtcPasswdFile.instance == null)
|
||||||
|
{
|
||||||
|
EtcPasswdFile.instance = new EtcPasswdFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
result = EtcPasswdFile.instance;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
105
src/fr/devinsy/util/unix/EtcPasswdFileReader.java
Normal file
105
src/fr/devinsy/util/unix/EtcPasswdFileReader.java
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileReader;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class EtcPasswdFileReader
|
||||||
|
{
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(EtcPasswdFileReader.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static Users load()
|
||||||
|
{
|
||||||
|
Users result;
|
||||||
|
|
||||||
|
BufferedReader file;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
file = new BufferedReader(new FileReader("/etc/passwd"));
|
||||||
|
}
|
||||||
|
catch (FileNotFoundException exception)
|
||||||
|
{
|
||||||
|
logger.error("File not found");
|
||||||
|
file = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = new Users();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String line;
|
||||||
|
while ((line = file.readLine()) != null)
|
||||||
|
{
|
||||||
|
String[] tokens = line.split(":");
|
||||||
|
|
||||||
|
User user = new User();
|
||||||
|
user.setLogin(tokens[0]);
|
||||||
|
user.setPassword(tokens[1]);
|
||||||
|
user.setUid((new Integer(tokens[2])).intValue());
|
||||||
|
user.setGid((new Integer(tokens[3])).intValue());
|
||||||
|
user.setRealName(tokens[4]);
|
||||||
|
user.setHomeDirectory(tokens[5]);
|
||||||
|
|
||||||
|
// Manage the case of empty shell.
|
||||||
|
if (tokens.length == 7)
|
||||||
|
{
|
||||||
|
user.setShell(tokens[6]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
user.setShell("");
|
||||||
|
}
|
||||||
|
|
||||||
|
result.add(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
catch (java.io.IOException exception)
|
||||||
|
{
|
||||||
|
logger.error("Exception here.");
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
223
src/fr/devinsy/util/unix/Group.java
Normal file
223
src/fr/devinsy/util/unix/Group.java
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class Group
|
||||||
|
{
|
||||||
|
// static private final Logger logger =
|
||||||
|
// LoggerFactory.getLogger(Group.class);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* /usr/include/grp.h
|
||||||
|
*
|
||||||
|
* The group structure.
|
||||||
|
* struct group
|
||||||
|
* {
|
||||||
|
* char *gr_name; Group name.
|
||||||
|
* char *gr_passwd; Password.
|
||||||
|
* __gid_t gr_gid; Group ID.
|
||||||
|
* char **gr_mem; Member list.
|
||||||
|
* };
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected String name;
|
||||||
|
protected String password;
|
||||||
|
protected int gid;
|
||||||
|
protected Vector<String> members;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Group()
|
||||||
|
{
|
||||||
|
this.name = null;
|
||||||
|
this.password = null;
|
||||||
|
this.gid = -1;
|
||||||
|
this.members = new Vector<String>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void addMember(final String login)
|
||||||
|
{
|
||||||
|
if ((login != null) && (login.length() != 0))
|
||||||
|
{
|
||||||
|
this.members.add(login);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getGid()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.gid;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Vector<String> getMembers()
|
||||||
|
{
|
||||||
|
Vector<String> result;
|
||||||
|
|
||||||
|
result = this.members;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.name;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getPassword()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.password;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int gid()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.gid;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Vector<String> members()
|
||||||
|
{
|
||||||
|
Vector<String> result;
|
||||||
|
|
||||||
|
result = this.members;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String name()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.name;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String passwd()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.password;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setGid(final int gid)
|
||||||
|
{
|
||||||
|
this.gid = gid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setName(final String name)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setPasswd(final String password)
|
||||||
|
{
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setPassword(final String password)
|
||||||
|
{
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = "|" + this.name + "|" + this.password + "|" + this.gid + "|" + this.members + "|";
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
233
src/fr/devinsy/util/unix/Groups.java
Normal file
233
src/fr/devinsy/util/unix/Groups.java
Normal file
|
@ -0,0 +1,233 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class Groups extends Vector<Group>
|
||||||
|
{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 5802487312198869603L;
|
||||||
|
|
||||||
|
// static private final Logger logger =
|
||||||
|
// LoggerFactory.getLogger(Groups.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Groups()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean contains(final int gid)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (getByGid(gid) == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean contains(final String name)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (getByName(name) == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Group getByGid(final int gid)
|
||||||
|
{
|
||||||
|
Group result;
|
||||||
|
|
||||||
|
result = null;
|
||||||
|
boolean ended = false;
|
||||||
|
Iterator<Group> iterator = this.iterator();
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (iterator.hasNext())
|
||||||
|
{
|
||||||
|
Group group = iterator.next();
|
||||||
|
if (group.getGid() == gid)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = group;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Group getByName(final String name)
|
||||||
|
{
|
||||||
|
Group result;
|
||||||
|
|
||||||
|
if (name == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
boolean ended = false;
|
||||||
|
Iterator<Group> iterator = this.iterator();
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (iterator.hasNext())
|
||||||
|
{
|
||||||
|
Group group = iterator.next();
|
||||||
|
if (group.getName().equals(name))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = group;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Vector<String> getLoginGroups(final String login)
|
||||||
|
{
|
||||||
|
Vector<String> result;
|
||||||
|
|
||||||
|
result = new Vector<String>();
|
||||||
|
Iterator<Group> iterator = this.iterator();
|
||||||
|
|
||||||
|
while (iterator.hasNext())
|
||||||
|
{
|
||||||
|
Group group = iterator.next();
|
||||||
|
|
||||||
|
if (group.members().contains(login))
|
||||||
|
{
|
||||||
|
result.add(group.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getLoginGroupsString(final String login)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
Vector<String> groups = getLoginGroups(login);
|
||||||
|
|
||||||
|
StringBuffer string = new StringBuffer();
|
||||||
|
|
||||||
|
for (String group : groups)
|
||||||
|
{
|
||||||
|
if (string.length() == 0)
|
||||||
|
{
|
||||||
|
string.append(group);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string.append(",");
|
||||||
|
string.append(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = string.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
StringBuffer out = new StringBuffer();
|
||||||
|
|
||||||
|
Iterator<Group> iterator = this.iterator();
|
||||||
|
|
||||||
|
while (iterator.hasNext())
|
||||||
|
{
|
||||||
|
out.append(iterator.next().toString() + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
result = out.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
597
src/fr/devinsy/util/unix/Unix.java
Normal file
597
src/fr/devinsy/util/unix/Unix.java
Normal file
|
@ -0,0 +1,597 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2015 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.util.cmdexec.CmdExec;
|
||||||
|
import fr.devinsy.util.strings.StringListUtils;
|
||||||
|
import fr.devinsy.util.unix.acl.Acl;
|
||||||
|
import fr.devinsy.util.unix.acl.AclManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class Unix
|
||||||
|
{
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(Unix.class);
|
||||||
|
public static final String SUDO = "/usr/bin/sudo";
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void appendToFile(final String text, final String path) throws Exception
|
||||||
|
{
|
||||||
|
if ((text == null) || (text.length() == 0) || (path == null) || (path.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Parameter undefined: [" + text + "][" + path + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CmdExec.run(SUDO, "bash", "-c", "echo \"" + text + "\" >> " + path);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error detected appending text to file [" + path + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void chmod(final String changes, final String path) throws Exception
|
||||||
|
{
|
||||||
|
if ((changes == null) || (changes.length() == 0) || (path == null) || (path.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Parameter undefined: [" + changes + "][" + path + "].");
|
||||||
|
}
|
||||||
|
else if (!new File(path).exists())
|
||||||
|
{
|
||||||
|
throw new Exception("Path not found: [" + path + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CmdExec.run(SUDO, "chmod", changes, path);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error running chmod command for [" + changes + "][" + path + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void clearAcl(final String id, final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
AclManager.clearId(id, filePathName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void clearAclGroup(final String group, final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
AclManager.clearGroup(group, filePathName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void clearAclUser(final String login, final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
AclManager.clearUser(login, filePathName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void createUserAccount(final String login) throws Exception
|
||||||
|
{
|
||||||
|
if ((login == null) || (login.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Login parameter undefined.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
createUserAccount(login, login);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void createUserAccount(final String login, final String name) throws Exception
|
||||||
|
{
|
||||||
|
if ((login == null) || (login.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Login parameter undefined.");
|
||||||
|
}
|
||||||
|
else if ((name == null) || (name.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Name parameter undefined.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
createUserAccount(login, name, "/home/" + login);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void createUserAccount(final String login, final String name, final String home) throws Exception
|
||||||
|
{
|
||||||
|
if ((login == null) || (login.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Login parameter undefined.");
|
||||||
|
}
|
||||||
|
else if ((name == null) || (name.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Name parameter undefined.");
|
||||||
|
}
|
||||||
|
else if ((home == null) || (home.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Home parameter undefined.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.info("Creating user account for [" + login + "].");
|
||||||
|
CmdExec.run(SUDO, "/usr/sbin/useradd", "-m", "-c", name, "-d", home, login);
|
||||||
|
EtcPasswdFile.instance().update();
|
||||||
|
logger.info("User account created for [" + login + "].");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error detected creating user account [" + login + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void createUserAccount(final String login, final String name, final String home, final String password) throws Exception
|
||||||
|
{
|
||||||
|
if ((password == null) || (password.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Password parameter undefined.");
|
||||||
|
}
|
||||||
|
else if (Unix.isLogin(login))
|
||||||
|
{
|
||||||
|
throw new Exception("Login [" + login + "] already in use");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
createUserAccount(login, name, home);
|
||||||
|
setPassword(login, password);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void deleteGroup(final String group) throws Exception
|
||||||
|
{
|
||||||
|
if ((group == null) || (group.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Group parameter undefined.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.info("Deleting group for [" + group + "].");
|
||||||
|
CmdExec.run(SUDO + " groupdel " + group);
|
||||||
|
logger.info("Group deleted for [" + group + "].");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error running groupdel command for group [" + group + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void deleteUserAccount(final String login) throws Exception
|
||||||
|
{
|
||||||
|
if ((login == null) || (login.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Login parameter undefined.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.info("Deleting user account for [" + login + "].");
|
||||||
|
CmdExec.run(SUDO + " /usr/sbin/userdel " + login);
|
||||||
|
logger.info("User account delted for [" + login + "].");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error running userdel command for login [" + login + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String getAclData(final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = AclManager.getAclData(filePathName);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String[] getAclUsers(final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
String[] result;
|
||||||
|
|
||||||
|
Acl acl = AclManager.getAcl(filePathName);
|
||||||
|
|
||||||
|
result = acl.currentAcl().getUserIds();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isGroup(final String groupName)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = EtcGroupFile.instance().contains(groupName);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isLogin(final String login)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = EtcPasswdFile.instance().contains(login);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void link(final String sourcePath, final String targetPath) throws Exception
|
||||||
|
{
|
||||||
|
logger.info("[" + sourcePath + "][" + targetPath + "]");
|
||||||
|
if ((sourcePath == null) || (sourcePath.length() == 0) || (targetPath == null) || (targetPath.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Parameter undefined: [" + sourcePath + "][" + targetPath + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
File sourceFile = new File(sourcePath);
|
||||||
|
File targetFile = new File(targetPath);
|
||||||
|
|
||||||
|
if (!sourceFile.exists())
|
||||||
|
{
|
||||||
|
throw new Exception("Source does not exist: [" + sourcePath + "].");
|
||||||
|
}
|
||||||
|
else if ((targetFile.exists()) && (!targetFile.isDirectory()))
|
||||||
|
{
|
||||||
|
throw new Exception("Target already exists: [" + targetPath + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CmdExec.run(SUDO, "ln", "-s", sourcePath, targetPath);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error detected linking [" + sourcePath + "][" + targetPath + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void modifyLogin(final String sourceLogin, final String targetLogin, final String sourceHomeDirectory) throws Exception
|
||||||
|
{
|
||||||
|
logger.info("Starting login modifying: [" + sourceLogin + "] -> [" + targetLogin + "]");
|
||||||
|
if ((sourceLogin == null) || (sourceLogin.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Original login parameters undefined");
|
||||||
|
}
|
||||||
|
else if ((targetLogin == null) || (targetLogin.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("New login parameters undefined");
|
||||||
|
}
|
||||||
|
else if (!Unix.isLogin(sourceLogin))
|
||||||
|
{
|
||||||
|
throw new Exception("Original login unknow: [" + sourceLogin + "].");
|
||||||
|
}
|
||||||
|
else if (Unix.isLogin(targetLogin))
|
||||||
|
{
|
||||||
|
throw new Exception("New login unknow: [" + targetLogin + "].");
|
||||||
|
}
|
||||||
|
else if (sourceHomeDirectory == null)
|
||||||
|
{
|
||||||
|
throw new Exception("sourceHomeDirectory parameter undefined, thus no home directory move.");
|
||||||
|
}
|
||||||
|
else if (!new File(sourceHomeDirectory).exists())
|
||||||
|
{
|
||||||
|
throw new Exception("Source home directory does not exist: [" + sourceHomeDirectory + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
String targetHomeDirectory = new File(sourceHomeDirectory).getParent().toString() + "/" + targetLogin;
|
||||||
|
if (new File(targetHomeDirectory).exists())
|
||||||
|
{
|
||||||
|
throw new Exception("Target home directory already exists: [" + targetHomeDirectory + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.info("Login modifying: [" + sourceLogin + "] -> [" + targetLogin + "]");
|
||||||
|
CmdExec.run(SUDO + " usermod -l " + targetLogin + " " + sourceLogin);
|
||||||
|
logger.info("Login modified: [" + sourceLogin + "] -> [" + targetLogin + "]");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Login modification failed for [" + sourceLogin + "].", exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.info("Renaming home directory: [" + sourceHomeDirectory + "] -> [" + targetLogin + "]");
|
||||||
|
CmdExec.run(SUDO + " mv " + sourceHomeDirectory + " " + targetHomeDirectory);
|
||||||
|
logger.info("Home directory renamed: [" + sourceHomeDirectory + "] -> [" + targetLogin + "]");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Home directory rename failed for [" + sourceHomeDirectory + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.info("Login modifying done: [" + sourceLogin + "] -> [" + targetLogin + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void recursiveChmod(final String changes, final String path) throws Exception
|
||||||
|
{
|
||||||
|
if ((changes == null) || (changes.length() == 0) || (path == null) || (path.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Parameter undefined: [" + changes + "][" + path + "].");
|
||||||
|
}
|
||||||
|
else if (!new File(path).exists())
|
||||||
|
{
|
||||||
|
throw new Exception("Path not found: [" + path + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CmdExec.run(SUDO, "chmod", "-R", changes, path);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error running recursive chmod command for [" + changes + "][" + path + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void renameGroup(final String sourceGroup, final String targetGroup) throws Exception
|
||||||
|
{
|
||||||
|
logger.info("Starting group renaming: [" + sourceGroup + "] -> [" + targetGroup + "]");
|
||||||
|
if ((sourceGroup == null) || (sourceGroup.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Original group name parameters undefined");
|
||||||
|
}
|
||||||
|
else if ((targetGroup == null) || (targetGroup.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("New group name parameters undefined");
|
||||||
|
}
|
||||||
|
else if (!Unix.isGroup(sourceGroup))
|
||||||
|
{
|
||||||
|
throw new Exception("Original group unknow: [" + sourceGroup + "].");
|
||||||
|
}
|
||||||
|
else if (Unix.isGroup(targetGroup))
|
||||||
|
{
|
||||||
|
throw new Exception("New group unknow: [" + targetGroup + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.info("Login modifying: [" + sourceGroup + "] -> [" + targetGroup + "]");
|
||||||
|
CmdExec.run(SUDO + " groupmod -n " + targetGroup + " " + sourceGroup);
|
||||||
|
logger.info("Login modified: [" + sourceGroup + "] -> [" + targetGroup + "]");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Group renaming failed for [" + sourceGroup + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.info("Group renaming done: [" + sourceGroup + "] -> [" + targetGroup + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static Group searchGroup(final String groupName)
|
||||||
|
{
|
||||||
|
Group result;
|
||||||
|
|
||||||
|
result = EtcGroupFile.instance().get(groupName);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static User searchLogin(final String login)
|
||||||
|
{
|
||||||
|
User result;
|
||||||
|
|
||||||
|
result = EtcPasswdFile.instance().get(login);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static Vector<String> searchLoginGroups(final String login)
|
||||||
|
{
|
||||||
|
Vector<String> result;
|
||||||
|
|
||||||
|
result = EtcGroupFile.instance().getLoginGroups(login);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void setfacl(final String... args) throws Exception
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CmdExec.run(SUDO, "setfacl", args, 1, 6);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error running setfacl command for " + StringListUtils.toStringWithBrackets(args) + ":" + exception.getMessage() + ".", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* As 'passwd' command has not the option '--stdin' in all systems (eg.
|
||||||
|
* Debian), this method uses the 'chpasswd' command.
|
||||||
|
*/
|
||||||
|
public static void setPassword(final String login, final String newPassword) throws Exception
|
||||||
|
{
|
||||||
|
if ((login == null) || (login.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Login parameter undefined.");
|
||||||
|
}
|
||||||
|
else if (newPassword == null)
|
||||||
|
{
|
||||||
|
throw new Exception("New password parameter undefined.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.info("Password setting for [" + login + "].");
|
||||||
|
CmdExec.run(SUDO, "bash", "-c", "echo \"" + login + ":" + newPassword + "\"| chpasswd ");
|
||||||
|
logger.info("Password set for [" + login + "].");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error detected on setting of the new password for [" + login + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* chfn [ -f full-name ] [ username ]
|
||||||
|
*/
|
||||||
|
public static void setRealName(final String login, final String newRealName) throws Exception
|
||||||
|
{
|
||||||
|
if ((login == null) || (login.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Login parameter undefined.");
|
||||||
|
}
|
||||||
|
else if (newRealName == null)
|
||||||
|
{
|
||||||
|
throw new Exception("New real name parameter undefined.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.info("Real name changing for user [" + login + "].");
|
||||||
|
CmdExec.run(SUDO, "chfn", "-f", newRealName, login);
|
||||||
|
EtcPasswdFile.instance().update();
|
||||||
|
logger.info("Real name changed for user [" + login + "].");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error detected on setting of the new real name for [" + login + "].", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void unlink(final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
logger.info("[" + filePathName + "]");
|
||||||
|
if (filePathName == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Parameter undefined: [" + filePathName + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
new File(filePathName).delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
355
src/fr/devinsy/util/unix/User.java
Normal file
355
src/fr/devinsy/util/unix/User.java
Normal file
|
@ -0,0 +1,355 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class User
|
||||||
|
{
|
||||||
|
// private static final Logger logger = LoggerFactory.getLogger(User.class);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* /usr/include/pwd.h
|
||||||
|
*
|
||||||
|
* The passwd structure.
|
||||||
|
* struct passwd
|
||||||
|
* {
|
||||||
|
* char *pw_name;D Username.
|
||||||
|
* char *pw_passwd; Password.
|
||||||
|
* __uid_t pw_uid; User ID.
|
||||||
|
* __gid_t pw_gid; Group ID.
|
||||||
|
* char *pw_gecos; Real name.
|
||||||
|
* char *pw_dir; Home directory.
|
||||||
|
* char *pw_shell; Shell program.
|
||||||
|
* };
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected String login;
|
||||||
|
protected String password;
|
||||||
|
protected int uid;
|
||||||
|
protected int gid;
|
||||||
|
protected String realName;
|
||||||
|
protected String homeDirectory;
|
||||||
|
protected String shell;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public User()
|
||||||
|
{
|
||||||
|
this.login = null;
|
||||||
|
this.password = null;
|
||||||
|
this.uid = -1;
|
||||||
|
this.gid = -1;
|
||||||
|
this.realName = null;
|
||||||
|
this.homeDirectory = null;
|
||||||
|
this.shell = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public User(final User user)
|
||||||
|
{
|
||||||
|
this.login = user.login();
|
||||||
|
this.password = user.passwd();
|
||||||
|
this.uid = user.uid();
|
||||||
|
this.gid = user.gid();
|
||||||
|
this.realName = user.realName();
|
||||||
|
this.homeDirectory = user.homeDirectory();
|
||||||
|
this.shell = user.shell();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getGid()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.gid;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getHomeDirectory()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.homeDirectory;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getLogin()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.login;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getPasswd()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.password;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getPassword()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.password;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getRealName()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.realName;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getShell()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.shell;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getUid()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.uid;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int gid()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.gid;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String homeDirectory()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.homeDirectory;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String login()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.login;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String passwd()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.password;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String realName()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.realName;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setGid(final int gid)
|
||||||
|
{
|
||||||
|
this.gid = gid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setHomeDirectory(final String homeDirectory)
|
||||||
|
{
|
||||||
|
this.homeDirectory = homeDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setLogin(final String login)
|
||||||
|
{
|
||||||
|
this.login = login;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setPasswd(final String password)
|
||||||
|
{
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setPassword(final String password)
|
||||||
|
{
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setRealName(final String realName)
|
||||||
|
{
|
||||||
|
this.realName = realName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setShell(final String shell)
|
||||||
|
{
|
||||||
|
this.shell = shell;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setUid(final int uid)
|
||||||
|
{
|
||||||
|
this.uid = uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String shell()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.shell;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = "|" + this.login + "|" + this.password + "|" + this.uid + "|" + this.gid + "|" + this.realName + "|" + this.homeDirectory + "|" + this.shell + "|";
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int uid()
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = this.uid;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
179
src/fr/devinsy/util/unix/Users.java
Normal file
179
src/fr/devinsy/util/unix/Users.java
Normal file
|
@ -0,0 +1,179 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2006-2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class Users extends Vector<User>
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = -7178304512851592399L;
|
||||||
|
|
||||||
|
// private static final Logger logger =
|
||||||
|
// LoggerFactory.getLogger(Users.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Users()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean contains(final int uid)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (getByUid(uid) == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean contains(final String login)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (getByLogin(login) == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public User getByLogin(final String login)
|
||||||
|
{
|
||||||
|
User result;
|
||||||
|
|
||||||
|
if (login == null)
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
boolean ended = false;
|
||||||
|
Iterator<User> iterator = this.iterator();
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (iterator.hasNext())
|
||||||
|
{
|
||||||
|
User user = iterator.next();
|
||||||
|
if (user.getLogin().equals(login))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public User getByUid(final int uid)
|
||||||
|
{
|
||||||
|
User result;
|
||||||
|
|
||||||
|
result = null;
|
||||||
|
boolean ended = false;
|
||||||
|
Iterator<User> iterator = this.iterator();
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (iterator.hasNext())
|
||||||
|
{
|
||||||
|
User user = iterator.next();
|
||||||
|
if (user.getUid() == uid)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
StringBuffer out;
|
||||||
|
out = new StringBuffer();
|
||||||
|
|
||||||
|
Iterator<User> iterator = this.iterator();
|
||||||
|
|
||||||
|
while (iterator.hasNext())
|
||||||
|
{
|
||||||
|
out.append(iterator.next().toString() + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
result = out.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
216
src/fr/devinsy/util/unix/acl/Acl.java
Normal file
216
src/fr/devinsy/util/unix/acl/Acl.java
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix.acl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class Acl
|
||||||
|
{
|
||||||
|
// private static final Logger logger = LoggerFactory.getLogger(Acl.class);
|
||||||
|
|
||||||
|
/*
|
||||||
|
# file: goo39
|
||||||
|
# owner: goo39
|
||||||
|
# group: goo39
|
||||||
|
user::rwx
|
||||||
|
user:cpm:rwx #effective:rwx
|
||||||
|
user:goo39:rwx #effective:rwx
|
||||||
|
group::--- #effective:---
|
||||||
|
group:goo40:rwx #effective:rwx
|
||||||
|
mask::rwx
|
||||||
|
other::---
|
||||||
|
default:user::rwx
|
||||||
|
default:user:cpm:rwx #effective:rwx
|
||||||
|
default:group::--- #effective:---
|
||||||
|
default:group:cpm:rwx #effective:rwx
|
||||||
|
default:group:goo40:rwx #effective:rwx
|
||||||
|
default:mask::rwx
|
||||||
|
default:other::---
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected String filePathname;
|
||||||
|
protected String owner;
|
||||||
|
protected String group;
|
||||||
|
|
||||||
|
protected AclEntries currentAcl;
|
||||||
|
protected AclEntries defaultAcl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Acl(final String filePathname)
|
||||||
|
{
|
||||||
|
this.filePathname = filePathname;
|
||||||
|
this.owner = "";
|
||||||
|
this.group = "";
|
||||||
|
this.currentAcl = new AclEntries();
|
||||||
|
this.defaultAcl = new AclEntries();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean contains(final AclEntry.Type type, final String id)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if ((this.currentAcl().contains(type, id)) || (this.defaultAcl().contains(type, id)))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean containsGroup(final String group)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = contains(AclEntry.Type.GROUP, group);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean containsId(final String id)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if ((containsUser(id) || containsGroup(id)))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean containsUser(final String login)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = contains(AclEntry.Type.USER, login);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public AclEntries currentAcl()
|
||||||
|
{
|
||||||
|
AclEntries result;
|
||||||
|
|
||||||
|
result = this.currentAcl;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public AclEntries defaultAcl()
|
||||||
|
{
|
||||||
|
AclEntries result;
|
||||||
|
|
||||||
|
result = this.defaultAcl;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String filePathname()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.filePathname;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String group()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.group;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String owner()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.owner;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setGroup(final String group)
|
||||||
|
{
|
||||||
|
this.group = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setOwner(final String owner)
|
||||||
|
{
|
||||||
|
this.owner = owner;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
216
src/fr/devinsy/util/unix/acl/AclEntries.java
Normal file
216
src/fr/devinsy/util/unix/acl/AclEntries.java
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix.acl;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class AclEntries extends Vector<AclEntry>
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 5802487312198869603L;
|
||||||
|
|
||||||
|
// private static final Logger logger =
|
||||||
|
// LoggerFactory.getLogger(AclEntries.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public AclEntries()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean contains(final AclEntry.Type type, final String id)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (this.get(type, id) == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean containsId(final String id)
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if ((this.get(AclEntry.Type.USER, id) == null) && (this.get(AclEntry.Type.GROUP, id) == null))
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public AclEntry get(final AclEntry.Type type, final String id)
|
||||||
|
{
|
||||||
|
AclEntry result;
|
||||||
|
|
||||||
|
result = null;
|
||||||
|
boolean ended = false;
|
||||||
|
Iterator<AclEntry> iterator = this.iterator();
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (iterator.hasNext())
|
||||||
|
{
|
||||||
|
AclEntry entry = iterator.next();
|
||||||
|
if ((type == entry.type()) && (entry.id().equals(id)))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String[] getGroupIds()
|
||||||
|
{
|
||||||
|
String[] result;
|
||||||
|
|
||||||
|
Vector<String> ids = new Vector<String>();
|
||||||
|
|
||||||
|
for (AclEntry entry : this)
|
||||||
|
{
|
||||||
|
if ((entry.type == AclEntry.Type.GROUP) && (!ids.contains(entry.id())))
|
||||||
|
{
|
||||||
|
ids.add(entry.id());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = (String[]) ids.toArray();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String[] getIds()
|
||||||
|
{
|
||||||
|
String[] result;
|
||||||
|
|
||||||
|
Vector<String> ids = new Vector<String>();
|
||||||
|
|
||||||
|
for (AclEntry entry : this)
|
||||||
|
{
|
||||||
|
if (!ids.contains(entry.id()))
|
||||||
|
{
|
||||||
|
ids.add(entry.id());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = (String[]) ids.toArray();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String[] getUserIds()
|
||||||
|
{
|
||||||
|
String[] result;
|
||||||
|
|
||||||
|
//
|
||||||
|
Vector<String> ids = new Vector<String>();
|
||||||
|
|
||||||
|
for (AclEntry entry : this)
|
||||||
|
{
|
||||||
|
if ((entry.type == AclEntry.Type.USER) && (!ids.contains(entry.id())))
|
||||||
|
{
|
||||||
|
ids.add(entry.id());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = new String[ids.size()];
|
||||||
|
|
||||||
|
for (int nId = 0; nId < ids.size(); nId++)
|
||||||
|
{
|
||||||
|
result[nId] = ids.get(nId);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
StringBuffer out;
|
||||||
|
out = new StringBuffer();
|
||||||
|
|
||||||
|
Iterator<AclEntry> iterator = this.iterator();
|
||||||
|
|
||||||
|
while (iterator.hasNext())
|
||||||
|
{
|
||||||
|
out.append(iterator.next().toString() + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
result = out.toString();
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
113
src/fr/devinsy/util/unix/acl/AclEntry.java
Normal file
113
src/fr/devinsy/util/unix/acl/AclEntry.java
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix.acl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class AclEntry
|
||||||
|
{
|
||||||
|
// private static final Logger logger =
|
||||||
|
// LoggerFactory.getLogger(AclEntry.class);
|
||||||
|
|
||||||
|
/*
|
||||||
|
user::rwx
|
||||||
|
user:cpm:rwx #effective:rwx
|
||||||
|
user:goo39:rwx #effective:rwx
|
||||||
|
group::--- #effective:---
|
||||||
|
group:goo40:rwx #effective:rwx
|
||||||
|
mask::rwx
|
||||||
|
other::---
|
||||||
|
*/
|
||||||
|
|
||||||
|
public enum Type
|
||||||
|
{
|
||||||
|
NONE, USER, GROUP, MASK, OTHER
|
||||||
|
};
|
||||||
|
|
||||||
|
protected Type type;
|
||||||
|
protected String id;
|
||||||
|
protected String permission;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public AclEntry(final Type type, final String id, final String permission)
|
||||||
|
{
|
||||||
|
this.type = type;
|
||||||
|
this.id = id;
|
||||||
|
this.permission = permission;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String id()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.id;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String permission()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.type.toString() + ":" + this.id + ":" + this.permission;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
result = this.permission;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Type type()
|
||||||
|
{
|
||||||
|
Type result;
|
||||||
|
|
||||||
|
result = this.type;
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
424
src/fr/devinsy/util/unix/acl/AclManager.java
Normal file
424
src/fr/devinsy/util/unix/acl/AclManager.java
Normal file
|
@ -0,0 +1,424 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2010, 2013-2015 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.unix.acl;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.util.cmdexec.CmdExec;
|
||||||
|
import fr.devinsy.util.strings.StringListUtils;
|
||||||
|
import fr.devinsy.util.unix.Unix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class AclManager
|
||||||
|
{
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(AclManager.class);
|
||||||
|
public static final String SUDO = "/usr/bin/sudo";
|
||||||
|
|
||||||
|
final static public Pattern USER_PATTERN = Pattern.compile("^user:(.*):(.*)$");
|
||||||
|
final static public Pattern GROUP_PATTERN = Pattern.compile("^group:(.*):(.*)$");
|
||||||
|
final static public Pattern MASK_PATTERN = Pattern.compile("^mask:(.*):(.*)$");
|
||||||
|
final static public Pattern OTHER_PATTERN = Pattern.compile("^other:(.*):(.*)$");
|
||||||
|
final static public Pattern DEFAULT_USER_PATTERN = Pattern.compile("^default:user:(.*):(.*)$");
|
||||||
|
final static public Pattern DEFAULT_GROUP_PATTERN = Pattern.compile("^default:group:(.*):(.*)$");
|
||||||
|
final static public Pattern DEFAULT_MASK_PATTERN = Pattern.compile("^default:mask:(.*):(.*)$");
|
||||||
|
final static public Pattern DEFAULT_OTHER_PATTERN = Pattern.compile("^default:other:(.*):(.*)$");
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void clearGroup(final String group, final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
if ((group == null) || (group.length() == 0) || (filePathName == null) || (filePathName.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Bad parameters [" + group + "][" + filePathName + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Unix.setfacl("-R", "-L", "-x", "group:" + group, filePathName);
|
||||||
|
Unix.setfacl("-R", "-L", "-d", "-x", "group:" + group, filePathName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void clearId(final String id, final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
clearUser(id, filePathName);
|
||||||
|
clearGroup(id, filePathName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void clearUser(final String login, final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
if ((login == null) || (login.length() == 0) || (filePathName == null) || (filePathName.length() == 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Bad parameters [" + login + "][" + filePathName + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Unix.setfacl("-R", "-L", "-x", "user:" + login, filePathName);
|
||||||
|
Unix.setfacl("-R", "-L", "-d", "-x", "user:" + login, filePathName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static Acl getAcl(final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
Acl result;
|
||||||
|
|
||||||
|
result = new Acl(filePathName);
|
||||||
|
|
||||||
|
String[] entries = getAclEntryLines(filePathName);
|
||||||
|
|
||||||
|
// Login pattern: "^[a-z_][a-z0-9_-]*$".
|
||||||
|
logger.debug("Line=[" + entries[1] + "]");
|
||||||
|
Matcher matcher = Pattern.compile("^#\\sowner:\\s([a-z_][a-z0-9_-]*)$").matcher(entries[1]);
|
||||||
|
if (matcher.matches())
|
||||||
|
{
|
||||||
|
logger.debug("group=[" + matcher.group(1) + "]");
|
||||||
|
result.setOwner(matcher.group(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Group pattern: "^[a-z_][a-z0-9_-]*$".
|
||||||
|
logger.debug("Line=[" + entries[2] + "]");
|
||||||
|
matcher = Pattern.compile("^#\\sgroup:\\s([a-z_][a-z0-9_-]*)$").matcher(entries[2]);
|
||||||
|
if (matcher.matches())
|
||||||
|
{
|
||||||
|
logger.debug("group=[" + matcher.group(1) + "]");
|
||||||
|
result.setOwner(matcher.group(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int nEntry = 3; nEntry < entries.length; nEntry++)
|
||||||
|
{
|
||||||
|
String entryLine = entries[nEntry];
|
||||||
|
logger.debug("Line=[" + entryLine + "]");
|
||||||
|
|
||||||
|
//
|
||||||
|
Matcher userMatcher = USER_PATTERN.matcher(entryLine);
|
||||||
|
Matcher groupMatcher = GROUP_PATTERN.matcher(entryLine);
|
||||||
|
Matcher maskMatcher = MASK_PATTERN.matcher(entryLine);
|
||||||
|
Matcher otherMatcher = OTHER_PATTERN.matcher(entryLine);
|
||||||
|
Matcher defaultUserMatcher = DEFAULT_USER_PATTERN.matcher(entryLine);
|
||||||
|
Matcher defaultGroupMatcher = DEFAULT_GROUP_PATTERN.matcher(entryLine);
|
||||||
|
Matcher defaultMaskMatcher = DEFAULT_MASK_PATTERN.matcher(entryLine);
|
||||||
|
Matcher defaultOtherMatcher = DEFAULT_OTHER_PATTERN.matcher(entryLine);
|
||||||
|
|
||||||
|
AclEntry entry;
|
||||||
|
if (userMatcher.matches())
|
||||||
|
{
|
||||||
|
entry = new AclEntry(AclEntry.Type.USER, userMatcher.group(1), userMatcher.group(2));
|
||||||
|
result.currentAcl().add(entry);
|
||||||
|
}
|
||||||
|
else if (groupMatcher.matches())
|
||||||
|
{
|
||||||
|
entry = new AclEntry(AclEntry.Type.GROUP, groupMatcher.group(1), groupMatcher.group(2));
|
||||||
|
result.currentAcl().add(entry);
|
||||||
|
}
|
||||||
|
else if (maskMatcher.matches())
|
||||||
|
{
|
||||||
|
entry = new AclEntry(AclEntry.Type.MASK, maskMatcher.group(1), maskMatcher.group(2));
|
||||||
|
result.currentAcl().add(entry);
|
||||||
|
}
|
||||||
|
else if (otherMatcher.matches())
|
||||||
|
{
|
||||||
|
entry = new AclEntry(AclEntry.Type.OTHER, otherMatcher.group(1), otherMatcher.group(2));
|
||||||
|
result.currentAcl().add(entry);
|
||||||
|
}
|
||||||
|
else if (defaultUserMatcher.matches())
|
||||||
|
{
|
||||||
|
entry = new AclEntry(AclEntry.Type.USER, defaultUserMatcher.group(1), defaultUserMatcher.group(2));
|
||||||
|
result.defaultAcl().add(entry);
|
||||||
|
}
|
||||||
|
else if (defaultGroupMatcher.matches())
|
||||||
|
{
|
||||||
|
entry = new AclEntry(AclEntry.Type.GROUP, defaultGroupMatcher.group(1), defaultGroupMatcher.group(2));
|
||||||
|
result.defaultAcl().add(entry);
|
||||||
|
}
|
||||||
|
else if (defaultMaskMatcher.matches())
|
||||||
|
{
|
||||||
|
entry = new AclEntry(AclEntry.Type.MASK, defaultMaskMatcher.group(1), defaultMaskMatcher.group(2));
|
||||||
|
result.defaultAcl().add(entry);
|
||||||
|
}
|
||||||
|
else if (defaultOtherMatcher.matches())
|
||||||
|
{
|
||||||
|
entry = new AclEntry(AclEntry.Type.OTHER, defaultOtherMatcher.group(1), defaultOtherMatcher.group(2));
|
||||||
|
result.defaultAcl().add(entry);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception("Unknow ACL entry line pattern for [" + entryLine + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug("Acl entry decoded: [" + entry.toString() + "]");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String getAclData(final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.info("Getting Acl data for [" + filePathName + "].");
|
||||||
|
result = CmdExec.run(SUDO, "/usr/bin/getfacl", "--no-effective", filePathName);
|
||||||
|
logger.info("Acl data got for [" + filePathName + "].");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error getting ACL for [" + filePathName + "].", exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String[] getAclEntryLines(final String filePathName)
|
||||||
|
{
|
||||||
|
String[] result;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result = getAclData(filePathName).split("\n");
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
result = new String[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isUsed(final AclEntry.Type type, final String id, final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = isUsed(type, id, filePathName, 0);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isUsed(final AclEntry.Type type, final String id, final String filePathName, final int depth) throws Exception
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if ((type == null) || (id == null) || (id.length() == 0) || (filePathName == null) || (filePathName.length() == 0) || (depth < 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Bad parameter: [" + type + "][" + id + "][" + filePathName + "][" + depth + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
File file = new File(filePathName);
|
||||||
|
if (!file.exists())
|
||||||
|
{
|
||||||
|
throw new Exception("File does not exist [" + filePathName + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Acl acl = getAcl(filePathName);
|
||||||
|
if (acl.contains(type, id))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else if ((file.isDirectory()) && (depth > 0))
|
||||||
|
{
|
||||||
|
result = isUsed(type, id, filePathName, file.list(), depth - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isUsed(final AclEntry.Type type, final String id, final String filePath, final String[] filePathNames, final int depth) throws Exception
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = false;
|
||||||
|
boolean ended = false;
|
||||||
|
int nLine = 0;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (nLine < filePathNames.length)
|
||||||
|
{
|
||||||
|
String filePathName = filePathNames[nLine];
|
||||||
|
if (isUsed(type, id, filePath + "/" + filePathName, depth))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nLine += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isUsed(final String id, final String filePathName) throws Exception
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = isUsed(id, filePathName, 0);
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isUsed(final String id, final String filePathName, final int depth) throws Exception
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if ((id == null) || (id.length() == 0) || (filePathName == null) || (filePathName.length() == 0) || (depth < 0))
|
||||||
|
{
|
||||||
|
throw new Exception("Bad parameter: [" + id + "][" + filePathName + "][" + depth + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
File file = new File(filePathName);
|
||||||
|
if (!file.exists())
|
||||||
|
{
|
||||||
|
throw new Exception("File does not exist [" + filePathName + "].");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Acl acl = getAcl(filePathName);
|
||||||
|
if (acl.containsId(id))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else if ((file.isDirectory()) && (depth > 0))
|
||||||
|
{
|
||||||
|
result = isUsed(id, file.list(), depth - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static boolean isUsed(final String id, final String[] filePathNames, final int depth) throws Exception
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
result = false;
|
||||||
|
boolean ended = false;
|
||||||
|
int nLine = 0;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
if (nLine < filePathNames.length)
|
||||||
|
{
|
||||||
|
String filePathName = filePathNames[nLine];
|
||||||
|
if (isUsed(id, filePathName, depth))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nLine += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void setfacl(final String... args) throws Exception
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CmdExec.run(SUDO, "setfacl", args, 1, 5);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
throw new Exception("Error running setfacl command for " + StringListUtils.toStringWithBrackets(args) + ":" + exception.getMessage() + ".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ////////////////////////////////////////////////////////////////////////
|
160
src/fr/devinsy/util/xml/XMLAttributes.java
Normal file
160
src/fr/devinsy/util/xml/XMLAttributes.java
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.xml;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.xml.stream.events.Attribute;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class XMLAttributes extends HashMap<String, Attribute> implements Iterable<Attribute>
|
||||||
|
{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 8456469741805779474L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public XMLAttributes()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public XMLAttributes(final int capacity)
|
||||||
|
{
|
||||||
|
super(capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public XMLAttributes(final Iterator<Attribute> source)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
if (source != null)
|
||||||
|
{
|
||||||
|
while (source.hasNext())
|
||||||
|
{
|
||||||
|
Attribute attribute = source.next();
|
||||||
|
|
||||||
|
add(attribute);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public XMLAttributes(final XMLAttributes source)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
addAll(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param attribute
|
||||||
|
*/
|
||||||
|
public void add(final Attribute attribute)
|
||||||
|
{
|
||||||
|
if (attribute != null)
|
||||||
|
{
|
||||||
|
put(attribute.getName().getLocalPart(), attribute);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
*/
|
||||||
|
public void addAll(final XMLAttributes source)
|
||||||
|
{
|
||||||
|
for (Attribute attribute : source)
|
||||||
|
{
|
||||||
|
this.add(attribute);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Attribute getByLabel(final String label)
|
||||||
|
{
|
||||||
|
Attribute result;
|
||||||
|
|
||||||
|
result = get(label);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Iterator<Attribute> iterator()
|
||||||
|
{
|
||||||
|
Iterator<Attribute> result;
|
||||||
|
|
||||||
|
result = this.values().iterator();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Set<String> labels()
|
||||||
|
{
|
||||||
|
Set<String> result;
|
||||||
|
|
||||||
|
result = this.keySet();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<Attribute> toList()
|
||||||
|
{
|
||||||
|
List<Attribute> result;
|
||||||
|
|
||||||
|
result = new ArrayList<Attribute>(values());
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
81
src/fr/devinsy/util/xml/XMLBadFormatException.java
Normal file
81
src/fr/devinsy/util/xml/XMLBadFormatException.java
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.xml;
|
||||||
|
|
||||||
|
import org.slf4j.helpers.MessageFormatter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class XMLBadFormatException extends Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 768256303984176512L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param code
|
||||||
|
* @param message
|
||||||
|
*/
|
||||||
|
public XMLBadFormatException(final String message)
|
||||||
|
{
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param code
|
||||||
|
* @param message
|
||||||
|
* @param exception
|
||||||
|
*/
|
||||||
|
public XMLBadFormatException(final String message, final Exception exception)
|
||||||
|
{
|
||||||
|
super(message, exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param format
|
||||||
|
* @param arguments
|
||||||
|
*/
|
||||||
|
public XMLBadFormatException(final String format, final Object... arguments)
|
||||||
|
{
|
||||||
|
this(MessageFormatter.arrayFormat(format, arguments).getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @param cause
|
||||||
|
*/
|
||||||
|
public XMLBadFormatException(final String message, final Throwable cause)
|
||||||
|
{
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param cause
|
||||||
|
*/
|
||||||
|
public XMLBadFormatException(final Throwable cause)
|
||||||
|
{
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
}
|
617
src/fr/devinsy/util/xml/XMLReader.java
Normal file
617
src/fr/devinsy/util/xml/XMLReader.java
Normal file
|
@ -0,0 +1,617 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
* Copyright (C) 2017 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.xml;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.Reader;
|
||||||
|
|
||||||
|
import javax.xml.namespace.QName;
|
||||||
|
import javax.xml.stream.XMLEventReader;
|
||||||
|
import javax.xml.stream.XMLInputFactory;
|
||||||
|
import javax.xml.stream.XMLStreamException;
|
||||||
|
import javax.xml.stream.events.XMLEvent;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.util.strings.StringList;
|
||||||
|
import fr.devinsy.util.xml.XMLTag.TagType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class XMLReader
|
||||||
|
{
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(XMLReader.class);
|
||||||
|
|
||||||
|
protected XMLEventReader in;
|
||||||
|
private XMLEvent nextEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected XMLReader()
|
||||||
|
{
|
||||||
|
this.in = null;
|
||||||
|
this.nextEvent = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws XMLStreamException
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
*/
|
||||||
|
public XMLReader(final File file) throws FileNotFoundException, XMLStreamException
|
||||||
|
{
|
||||||
|
this.nextEvent = null;
|
||||||
|
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||||
|
this.in = factory.createXMLEventReader(new FileInputStream(file), "UTF-8");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param target
|
||||||
|
* @throws XMLStreamException
|
||||||
|
*/
|
||||||
|
public XMLReader(final InputStream source) throws XMLStreamException
|
||||||
|
{
|
||||||
|
this.nextEvent = null;
|
||||||
|
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||||
|
this.in = factory.createXMLEventReader(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param target
|
||||||
|
* @throws XMLStreamException
|
||||||
|
*/
|
||||||
|
public XMLReader(final Reader source) throws XMLStreamException
|
||||||
|
{
|
||||||
|
this.nextEvent = null;
|
||||||
|
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||||
|
this.in = factory.createXMLEventReader(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws XMLStreamException
|
||||||
|
*/
|
||||||
|
public void close() throws XMLStreamException
|
||||||
|
{
|
||||||
|
if (this.in != null)
|
||||||
|
{
|
||||||
|
this.in.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This methods does a premonition act. Useful to detect end of a list.
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @return
|
||||||
|
* @throws XMLStreamException
|
||||||
|
*/
|
||||||
|
public boolean hasNextStartTag(final String label) throws XMLStreamException
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
// Load next event.
|
||||||
|
if (this.nextEvent == null)
|
||||||
|
{
|
||||||
|
if (this.in.hasNext())
|
||||||
|
{
|
||||||
|
this.nextEvent = this.in.nextEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Analyze next event.
|
||||||
|
if (this.nextEvent == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else if ((this.nextEvent.isStartElement()) && (StringUtils.equals(this.nextEvent.asStartElement().getName().getLocalPart(), label)))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @return
|
||||||
|
* @throws XMLBadFormatException
|
||||||
|
* @throws XMLStreamException
|
||||||
|
*/
|
||||||
|
public XMLTag readContentTag(final String label) throws XMLBadFormatException, XMLStreamException
|
||||||
|
{
|
||||||
|
XMLTag result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = readTag();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("XML file ends prematurely, content tag [" + label + "] is expected.");
|
||||||
|
}
|
||||||
|
else if (result.getType() != TagType.CONTENT)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Content tag [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
else if (!StringUtils.equals(label, result.getLabel()))
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @return
|
||||||
|
* @throws XMLStreamException
|
||||||
|
* @throws XMLBadFormatException
|
||||||
|
*/
|
||||||
|
public XMLTag readEndTag(final String label) throws XMLStreamException, XMLBadFormatException
|
||||||
|
{
|
||||||
|
XMLTag result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = readTag();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("XML file ends prematurely, end tag [" + label + "] is expected.");
|
||||||
|
}
|
||||||
|
else if (result.getType() != TagType.END)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("End tag [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
else if (!StringUtils.equals(result.getLabel(), label))
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @return
|
||||||
|
* @throws XMLStreamException
|
||||||
|
* @throws XMLBadFormatException
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public XMLTag readListTag(final String label) throws XMLStreamException, XMLBadFormatException
|
||||||
|
{
|
||||||
|
XMLTag result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = readTag();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("XML file ends prematurely, tag [" + label + "] is expected.");
|
||||||
|
}
|
||||||
|
else if ((result.getType() != TagType.START) && (result.getType() != TagType.EMPTY))
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("List tag [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
else if (!StringUtils.equals(label, result.getLabel()))
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @return
|
||||||
|
* @throws XMLStreamException
|
||||||
|
* @throws XMLBadFormatException
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public XMLTag readNullableContentTag(final String label) throws XMLStreamException, XMLBadFormatException
|
||||||
|
{
|
||||||
|
XMLTag result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = readTag();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("XML file ends prematurely, tag [" + label + "] is expected.");
|
||||||
|
}
|
||||||
|
else if (!StringUtils.equals(label, result.getLabel()))
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Nullable content tag [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
else if ((result.getType() != TagType.EMPTY) && (result.getType() != TagType.CONTENT))
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Nullable content tag [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @return
|
||||||
|
* @throws XMLStreamException
|
||||||
|
* @throws XMLBadFormatException
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public XMLTag readNullableStartTag(final String label) throws XMLStreamException, XMLBadFormatException
|
||||||
|
{
|
||||||
|
XMLTag result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = readTag();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("XML file ends prematurely, start tag [" + label + "] is expected.");
|
||||||
|
}
|
||||||
|
else if ((result.getType() != TagType.START) && (result.getType() != TagType.EMPTY))
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Start tag [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
else if (!StringUtils.equals(result.getLabel(), label))
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @return
|
||||||
|
* @throws XMLStreamException
|
||||||
|
* @throws XMLBadFormatException
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public XMLTag readStartTag(final String label) throws XMLStreamException, XMLBadFormatException
|
||||||
|
{
|
||||||
|
XMLTag result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = readTag();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("XML file ends prematurely, start tag [" + label + "] is expected.");
|
||||||
|
}
|
||||||
|
else if (result.getType() != TagType.START)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Start tag [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
else if (!StringUtils.equals(result.getLabel(), label))
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("Tag with label [" + label + "] is missing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transducer graph :
|
||||||
|
* <ul>
|
||||||
|
* <li>START_DOCUMENT => HEADER TAG
|
||||||
|
* <li>START_ELEMENT(X) + START_ELEMENT(Y) => <X><Y> => START TAG
|
||||||
|
* <li>START_ELEMENT(X) + CHARACTERS(C) + START_ELEMENT(Y) => <X>SPACES<Y>=>
|
||||||
|
* START TAG
|
||||||
|
* <li>START_ELEMENT(X) + CHARACTERS(C) + END_ELEMENT(X) => <X>C</X> =>
|
||||||
|
* CONTENT TAG
|
||||||
|
* <li>START_ELEMENT(X) + END_ELEMENT(X) => <X></X> => <X/> => EMPTY
|
||||||
|
* <li>END_ELEMENT(X) => </X> => END TAG
|
||||||
|
* <li>END_DOCUMENT => FOOTER TAG
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @throws XMLStreamException
|
||||||
|
* @throws XMLBadFormatException
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public XMLTag readTag() throws XMLStreamException, XMLBadFormatException
|
||||||
|
{
|
||||||
|
XMLTag result;
|
||||||
|
|
||||||
|
int level = 1;
|
||||||
|
boolean ended = false;
|
||||||
|
result = null;
|
||||||
|
XMLAttributes attributesBuffer = null;
|
||||||
|
QName nameBuffer = null;
|
||||||
|
StringList contentBuffer = null;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XMLEvent event;
|
||||||
|
if (this.nextEvent != null)
|
||||||
|
{
|
||||||
|
event = this.nextEvent;
|
||||||
|
this.nextEvent = null;
|
||||||
|
}
|
||||||
|
else if (this.in.hasNext())
|
||||||
|
{
|
||||||
|
event = this.in.nextEvent();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event == null)
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.debug("eventType=" + XMLTools.toString(event));
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
switch (event.getEventType())
|
||||||
|
{
|
||||||
|
case XMLEvent.START_DOCUMENT:
|
||||||
|
// START_DOCUMENT => START DOCUMENT TAG
|
||||||
|
ended = true;
|
||||||
|
result = new XMLTag(null, TagType.HEADER, null);
|
||||||
|
break;
|
||||||
|
case XMLEvent.START_ELEMENT:
|
||||||
|
// START_ELEMENT(X) => ...
|
||||||
|
nameBuffer = event.asStartElement().getName();
|
||||||
|
attributesBuffer = new XMLAttributes(event.asStartElement().getAttributes());
|
||||||
|
level += 1;
|
||||||
|
break;
|
||||||
|
case XMLEvent.END_ELEMENT:
|
||||||
|
// END_ELEMENT(X) => </X> => END TAG
|
||||||
|
ended = true;
|
||||||
|
result = new XMLTag(event.asEndElement().getName(), TagType.END, null);
|
||||||
|
break;
|
||||||
|
case XMLEvent.END_DOCUMENT:
|
||||||
|
// END_DOCUMENT => END DOCUMENT TAG
|
||||||
|
ended = true;
|
||||||
|
result = new XMLTag(null, TagType.FOOTER, null);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch (event.getEventType())
|
||||||
|
{
|
||||||
|
case XMLEvent.START_ELEMENT:
|
||||||
|
// START_ELEMENT(X) + START_ELEMENT(Y) => <X><Y>
|
||||||
|
// => START TAG
|
||||||
|
ended = true;
|
||||||
|
result = new XMLTag(nameBuffer, TagType.START, attributesBuffer);
|
||||||
|
this.nextEvent = event;
|
||||||
|
break;
|
||||||
|
case XMLEvent.CHARACTERS:
|
||||||
|
// START_ELEMENT(X) + CHARACTERS(C) => ...
|
||||||
|
contentBuffer = new StringList(50);
|
||||||
|
contentBuffer.append(event.asCharacters().getData());
|
||||||
|
level += 1;
|
||||||
|
break;
|
||||||
|
case XMLEvent.END_ELEMENT:
|
||||||
|
// START_ELEMENT(X) + END_ELEMENT(X) => <X></X>
|
||||||
|
// => <X/> => EMPTY
|
||||||
|
ended = true;
|
||||||
|
result = new XMLTag(nameBuffer, TagType.EMPTY, attributesBuffer);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new XMLBadFormatException("Unexpected XMLEvent [" + event.getEventType() + "].");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
switch (event.getEventType())
|
||||||
|
{
|
||||||
|
case XMLEvent.START_ELEMENT:
|
||||||
|
// START_ELEMENT(X) + CHARACTERS(C) +
|
||||||
|
// START_ELEMENT(Y) =>
|
||||||
|
// <X>SPACES<Y> => START TAG
|
||||||
|
ended = true;
|
||||||
|
result = new XMLTag(nameBuffer, TagType.START, attributesBuffer);
|
||||||
|
this.nextEvent = event;
|
||||||
|
break;
|
||||||
|
case XMLEvent.CHARACTERS:
|
||||||
|
// START_ELEMENT(X) + CHARACTERS(C1) +
|
||||||
|
// CHARACTERS(C2)=> ...
|
||||||
|
contentBuffer.append(event.asCharacters().getData());
|
||||||
|
break;
|
||||||
|
case XMLEvent.END_ELEMENT:
|
||||||
|
// START_ELEMENT(X) + CHARACTERS(C) +
|
||||||
|
// END_ELEMENT(X) => <X>C</X>
|
||||||
|
// => CONTENT TAG
|
||||||
|
ended = true;
|
||||||
|
result = new XMLTag(nameBuffer, TagType.CONTENT, attributesBuffer);
|
||||||
|
result.setContent(contentBuffer.toString());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new XMLBadFormatException("Unexpected XMLEvent [" + event.getEventType() + "].");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new XMLBadFormatException("Unexpected level [" + level + "].");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug("=> " + XMLTools.toString(result));
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @return
|
||||||
|
* @throws XMLStreamException
|
||||||
|
* @throws XMLBadFormatException
|
||||||
|
*/
|
||||||
|
public XMLTag readXMLFooter() throws XMLStreamException, XMLBadFormatException
|
||||||
|
{
|
||||||
|
XMLTag result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = readTag();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("XML file ends prematurely, end document event is expected.");
|
||||||
|
}
|
||||||
|
else if (result.getType() != TagType.FOOTER)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("End document tag is missing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @throws XMLException
|
||||||
|
* @throws XMLStreamException
|
||||||
|
* @throws XMLBadFormatException
|
||||||
|
*/
|
||||||
|
public XMLTag readXMLHeader() throws XMLStreamException, XMLBadFormatException
|
||||||
|
{
|
||||||
|
XMLTag result;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = readTag();
|
||||||
|
|
||||||
|
//
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("XML file ends prematurely, start document event is expected.");
|
||||||
|
}
|
||||||
|
else if (result.getType() != TagType.HEADER)
|
||||||
|
{
|
||||||
|
throw new XMLBadFormatException("XML header is missing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param args
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static void main(final String args[]) throws Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||||
|
XMLEventReader in = factory.createXMLEventReader(new FileReader("/home/cpm/C/Puck/Dev/Puck/test/TT/t3.puc"));
|
||||||
|
|
||||||
|
XMLEvent event;
|
||||||
|
while (in.hasNext())
|
||||||
|
{
|
||||||
|
event = in.nextEvent();
|
||||||
|
|
||||||
|
switch (event.getEventType())
|
||||||
|
{
|
||||||
|
case XMLEvent.ATTRIBUTE:
|
||||||
|
System.out.println("ATTRIBUTE ");
|
||||||
|
break;
|
||||||
|
case XMLEvent.CDATA:
|
||||||
|
System.out.println("CDATA");
|
||||||
|
break;
|
||||||
|
case XMLEvent.CHARACTERS:
|
||||||
|
System.out.println("CHARACTERS [" + event.asCharacters().getData() + "]");
|
||||||
|
break;
|
||||||
|
case XMLEvent.COMMENT:
|
||||||
|
System.out.println("COMMENT");
|
||||||
|
break;
|
||||||
|
case XMLEvent.DTD:
|
||||||
|
System.out.println("DTD");
|
||||||
|
break;
|
||||||
|
case XMLEvent.END_DOCUMENT:
|
||||||
|
System.out.println("END_DOCUMENT");
|
||||||
|
break;
|
||||||
|
case XMLEvent.END_ELEMENT:
|
||||||
|
System.out.println("END_ELEMENT " + event.asEndElement().getName());
|
||||||
|
break;
|
||||||
|
case XMLEvent.ENTITY_DECLARATION:
|
||||||
|
System.out.println("ENTITY_DECLARATION");
|
||||||
|
break;
|
||||||
|
case XMLEvent.ENTITY_REFERENCE:
|
||||||
|
System.out.println("ENTITY_REFERENCE");
|
||||||
|
break;
|
||||||
|
case XMLEvent.NAMESPACE:
|
||||||
|
System.out.println("NAMESPACE");
|
||||||
|
break;
|
||||||
|
case XMLEvent.NOTATION_DECLARATION:
|
||||||
|
System.out.println("NOTATION_DECLARATION");
|
||||||
|
break;
|
||||||
|
case XMLEvent.PROCESSING_INSTRUCTION:
|
||||||
|
System.out.println("PROCESSING_INSTRUCTION");
|
||||||
|
break;
|
||||||
|
case XMLEvent.SPACE:
|
||||||
|
System.out.println("SPACE");
|
||||||
|
break;
|
||||||
|
case XMLEvent.START_DOCUMENT:
|
||||||
|
System.out.println("START_DOCUMENT");
|
||||||
|
break;
|
||||||
|
case XMLEvent.START_ELEMENT:
|
||||||
|
System.out.println("START_ELEMENT [name=" + event.asStartElement().getName() + "][namespaceURI=" + event.asStartElement().getName().getNamespaceURI() + "][prefix="
|
||||||
|
+ event.asStartElement().getName().getPrefix() + "][localPart=" + event.asStartElement().getName().getLocalPart() + "]");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
System.out.println("DEFAULT");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
148
src/fr/devinsy/util/xml/XMLTag.java
Normal file
148
src/fr/devinsy/util/xml/XMLTag.java
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.xml;
|
||||||
|
|
||||||
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class XMLTag
|
||||||
|
{
|
||||||
|
|
||||||
|
public enum TagType
|
||||||
|
{
|
||||||
|
HEADER, START, END, EMPTY, CONTENT, FOOTER
|
||||||
|
}
|
||||||
|
|
||||||
|
private QName name;
|
||||||
|
private TagType type;
|
||||||
|
private XMLAttributes attributes;
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public XMLTag(final QName name, final TagType type, final XMLAttributes attributes)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.type = type;
|
||||||
|
this.attributes = attributes;
|
||||||
|
this.content = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XMLAttributes attributes()
|
||||||
|
{
|
||||||
|
return this.attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContent()
|
||||||
|
{
|
||||||
|
return this.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getLabel()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (this.name == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = this.name.getLocalPart();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public QName getName()
|
||||||
|
{
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getNamespaceURI()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (this.name == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = this.name.getNamespaceURI();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getPrefix()
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (this.name == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = this.name.getPrefix();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TagType getType()
|
||||||
|
{
|
||||||
|
return this.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContent(final String content)
|
||||||
|
{
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(final QName name)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(final TagType type)
|
||||||
|
{
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
}
|
389
src/fr/devinsy/util/xml/XMLTools.java
Normal file
389
src/fr/devinsy/util/xml/XMLTools.java
Normal file
|
@ -0,0 +1,389 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.xml;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
|
import javax.xml.stream.events.XMLEvent;
|
||||||
|
import javax.xml.transform.sax.SAXSource;
|
||||||
|
import javax.xml.transform.stream.StreamSource;
|
||||||
|
import javax.xml.validation.Schema;
|
||||||
|
import javax.xml.validation.SchemaFactory;
|
||||||
|
import javax.xml.validation.Validator;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringEscapeUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class XMLTools
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String escapeXmlBlank(final String source)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(source))
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = StringEscapeUtils.escapeXml(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @throws SAXException
|
||||||
|
* @throws IOException
|
||||||
|
* @throws PuckException
|
||||||
|
*/
|
||||||
|
public static boolean isValid(final File xmlFile, final File xsdFile) throws SAXException, IOException
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
//
|
||||||
|
InputStream xmlSource;
|
||||||
|
if (isZipFile(xmlFile))
|
||||||
|
{
|
||||||
|
ZipInputStream zin = new ZipInputStream(new FileInputStream(xmlFile));
|
||||||
|
zin.getNextEntry();
|
||||||
|
xmlSource = zin;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xmlSource = new FileInputStream(xmlFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = isValid(xmlSource, new FileInputStream(xsdFile));
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @throws SAXException
|
||||||
|
* @throws IOException
|
||||||
|
* @throws PuckException
|
||||||
|
*/
|
||||||
|
public static boolean isValid(final File xmlFile, final InputStream xsdSource) throws SAXException, IOException
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
//
|
||||||
|
InputStream xmlSource;
|
||||||
|
if (isZipFile(xmlFile))
|
||||||
|
{
|
||||||
|
ZipInputStream zin = new ZipInputStream(new FileInputStream(xmlFile));
|
||||||
|
zin.getNextEntry();
|
||||||
|
xmlSource = zin;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xmlSource = new FileInputStream(xmlFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = isValid(xmlSource, xsdSource);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @throws SAXException
|
||||||
|
* @throws IOException
|
||||||
|
* @throws PuckException
|
||||||
|
*/
|
||||||
|
public static boolean isValid(final InputStream xmlSource, final InputStream xsdSource) throws SAXException, IOException
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
if (xmlSource == null)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//
|
||||||
|
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
|
||||||
|
InputSource sourceentree = new InputSource(xsdSource);
|
||||||
|
SAXSource sourceXSD = new SAXSource(sourceentree);
|
||||||
|
Schema schema = factory.newSchema(sourceXSD);
|
||||||
|
Validator validator = schema.newValidator();
|
||||||
|
|
||||||
|
//
|
||||||
|
validator.validate(new StreamSource(xmlSource));
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (final IllegalArgumentException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static boolean isZipFile(final File file) throws IOException
|
||||||
|
{
|
||||||
|
boolean result;
|
||||||
|
|
||||||
|
//
|
||||||
|
byte[] buffer = new byte[4];
|
||||||
|
FileInputStream is = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
is = new FileInputStream(file);
|
||||||
|
is.read(buffer);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (is != null)
|
||||||
|
{
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 50 4B 3 4
|
||||||
|
if ((buffer[0] == 0x50) && (buffer[1] == 0x4B) && (buffer[2] == 0x03) && (buffer[3] == 0x04))
|
||||||
|
{
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String readTag(final BufferedReader in) throws Exception
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
Pattern TAG_PATTERN = Pattern.compile("^<([\\w-_\\.]+)>.*</([\\w-_\\.]+)>$");
|
||||||
|
Pattern SHORT_TAG_PATTERN = Pattern.compile("^<.+/>$");
|
||||||
|
|
||||||
|
result = in.readLine();
|
||||||
|
boolean ended = false;
|
||||||
|
while (!ended)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* DEBUG Matcher tagMatcher2 = TAG_PATTERN.matcher(result); if
|
||||||
|
* (tagMatcher2.find()) { logger.info("group count,0,1,2 = [" +
|
||||||
|
* tagMatcher2.groupCount() + "][" + tagMatcher2.group(0) + "][" +
|
||||||
|
* tagMatcher2.group(1) + "][" + tagMatcher2.group(2) + "]"); }
|
||||||
|
*/
|
||||||
|
|
||||||
|
Matcher tagMatcher = TAG_PATTERN.matcher(result);
|
||||||
|
Matcher shortTagMatcher = SHORT_TAG_PATTERN.matcher(result);
|
||||||
|
|
||||||
|
if ((tagMatcher.find()) && (tagMatcher.groupCount() == 2) && (tagMatcher.group(1).equals(tagMatcher.group(2))))
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
}
|
||||||
|
else if (shortTagMatcher.matches())
|
||||||
|
{
|
||||||
|
ended = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result += in.readLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String toHTLM5(final String source)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(source))
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = source.replace(" ", " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String toString(final XMLEvent source)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
switch (source.getEventType())
|
||||||
|
{
|
||||||
|
case XMLEvent.ATTRIBUTE:
|
||||||
|
result = "ATTRIBUTE ";
|
||||||
|
break;
|
||||||
|
case XMLEvent.CDATA:
|
||||||
|
result = "CDATA";
|
||||||
|
break;
|
||||||
|
case XMLEvent.CHARACTERS:
|
||||||
|
result = "CHARACTERS [" + source.asCharacters().getData() + "]";
|
||||||
|
break;
|
||||||
|
case XMLEvent.COMMENT:
|
||||||
|
result = "COMMENT";
|
||||||
|
break;
|
||||||
|
case XMLEvent.DTD:
|
||||||
|
result = "DTD";
|
||||||
|
break;
|
||||||
|
case XMLEvent.END_DOCUMENT:
|
||||||
|
result = "END_DOCUMENT";
|
||||||
|
break;
|
||||||
|
case XMLEvent.END_ELEMENT:
|
||||||
|
result = "END_ELEMENT " + source.asEndElement().getName();
|
||||||
|
break;
|
||||||
|
case XMLEvent.ENTITY_DECLARATION:
|
||||||
|
result = "ENTITY_DECLARATION";
|
||||||
|
break;
|
||||||
|
case XMLEvent.ENTITY_REFERENCE:
|
||||||
|
result = "ENTITY_REFERENCE";
|
||||||
|
break;
|
||||||
|
case XMLEvent.NAMESPACE:
|
||||||
|
result = "NAMESPACE";
|
||||||
|
break;
|
||||||
|
case XMLEvent.NOTATION_DECLARATION:
|
||||||
|
result = "NOTATION_DECLARATION";
|
||||||
|
break;
|
||||||
|
case XMLEvent.PROCESSING_INSTRUCTION:
|
||||||
|
result = "PROCESSING_INSTRUCTION";
|
||||||
|
break;
|
||||||
|
case XMLEvent.SPACE:
|
||||||
|
result = "SPACE";
|
||||||
|
break;
|
||||||
|
case XMLEvent.START_DOCUMENT:
|
||||||
|
result = "START_DOCUMENT";
|
||||||
|
break;
|
||||||
|
case XMLEvent.START_ELEMENT:
|
||||||
|
result = "START_ELEMENT [name=" + source.asStartElement().getName() + "][namespaceURI=" + source.asStartElement().getName().getNamespaceURI() + "][prefix="
|
||||||
|
+ source.asStartElement().getName().getPrefix() + "][localPart=" + source.asStartElement().getName().getLocalPart() + "]";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param event
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String toString(final XMLTag source)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
result = "null";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = "[label=" + source.getLabel() + "][type=" + source.getType().toString() + "][content=" + source.getContent() + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String unescapeXmlBlank(final String source)
|
||||||
|
{
|
||||||
|
String result;
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(source))
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = StringEscapeUtils.unescapeXml(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
315
src/fr/devinsy/util/xml/XMLWriter.java
Normal file
315
src/fr/devinsy/util/xml/XMLWriter.java
Normal file
|
@ -0,0 +1,315 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.xml;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.io.Writer;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class XMLWriter
|
||||||
|
{
|
||||||
|
|
||||||
|
protected PrintWriter out;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor (useful for extend this class).
|
||||||
|
*/
|
||||||
|
protected XMLWriter()
|
||||||
|
{
|
||||||
|
this.out = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a XML Writer to a file.
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* Where write the XML data.
|
||||||
|
*
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public XMLWriter(final File file) throws UnsupportedEncodingException, FileNotFoundException
|
||||||
|
{
|
||||||
|
this.out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a XML Writer to a <code>OutputStream</code>.
|
||||||
|
*
|
||||||
|
* @param target
|
||||||
|
* Where write the XML data.
|
||||||
|
*
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public XMLWriter(final OutputStream target) throws UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
this.out = new PrintWriter(new OutputStreamWriter(target, "UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a XML Writer to a <code>Writer</code>.
|
||||||
|
*
|
||||||
|
* @param target
|
||||||
|
* Where write the XML data.
|
||||||
|
*
|
||||||
|
* @throws UnsupportedEncodingException
|
||||||
|
*/
|
||||||
|
public XMLWriter(final Writer target) throws UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
this.out = new PrintWriter(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method closes the target stream.
|
||||||
|
*/
|
||||||
|
public void close() throws IOException
|
||||||
|
{
|
||||||
|
if (this.out != null)
|
||||||
|
{
|
||||||
|
this.out.flush();
|
||||||
|
this.out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method flushes the target stream.
|
||||||
|
*/
|
||||||
|
public void flush() throws IOException
|
||||||
|
{
|
||||||
|
if (this.out != null)
|
||||||
|
{
|
||||||
|
this.out.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method writes a XML comment.
|
||||||
|
*
|
||||||
|
* @param comment
|
||||||
|
* The comment to write.
|
||||||
|
*/
|
||||||
|
public void writeComment(final String comment)
|
||||||
|
{
|
||||||
|
this.out.print("<!-- ");
|
||||||
|
if (comment != null)
|
||||||
|
{
|
||||||
|
writeTagContent(comment);
|
||||||
|
}
|
||||||
|
this.out.print(" -->");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method writes a XML tag with no content.
|
||||||
|
*/
|
||||||
|
public void writeEmptyTag(final String label, final String... attributes)
|
||||||
|
{
|
||||||
|
this.out.print("<");
|
||||||
|
this.out.print(label);
|
||||||
|
writeTagAttributes(attributes);
|
||||||
|
this.out.print("/>");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method writes a XML ender tag.
|
||||||
|
*/
|
||||||
|
public void writeEndTag(final String label)
|
||||||
|
{
|
||||||
|
this.out.print("</");
|
||||||
|
this.out.print(label);
|
||||||
|
this.out.print(">");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method writes a XML start tag.
|
||||||
|
*/
|
||||||
|
public void writeStartTag(final String label, final String... attributes)
|
||||||
|
{
|
||||||
|
this.out.print("<");
|
||||||
|
this.out.print(label);
|
||||||
|
writeTagAttributes(attributes);
|
||||||
|
this.out.print(">");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method write a XML tag with attributes and boolean content data.
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @param content
|
||||||
|
* @param attributes
|
||||||
|
*/
|
||||||
|
public void writeTag(final String label, final boolean content, final String... attributes)
|
||||||
|
{
|
||||||
|
writeStartTag(label, attributes);
|
||||||
|
writeTagContent(String.valueOf(content));
|
||||||
|
writeEndTag(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method write a XML tag with attributes and long content data.
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @param content
|
||||||
|
* @param attributes
|
||||||
|
*/
|
||||||
|
public void writeTag(final String label, final long content, final String... attributes)
|
||||||
|
{
|
||||||
|
writeStartTag(label, attributes);
|
||||||
|
writeTagContent(String.valueOf(content));
|
||||||
|
writeEndTag(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method write a XML tag with attributes and content data. Content
|
||||||
|
* data are converted in XML format.
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* @param content
|
||||||
|
* @param attributes
|
||||||
|
*/
|
||||||
|
public void writeTag(final String label, final String content, final String... attributes)
|
||||||
|
{
|
||||||
|
if (content == null)
|
||||||
|
{
|
||||||
|
writeEmptyTag(label, attributes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writeStartTag(label, attributes);
|
||||||
|
writeTagContent(content);
|
||||||
|
writeEndTag(label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method writes attributes of a tag.
|
||||||
|
*
|
||||||
|
* @param attributes
|
||||||
|
*/
|
||||||
|
private void writeTagAttributes(final String... attributes)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if ((attributes != null) && (attributes.length > 0))
|
||||||
|
{
|
||||||
|
for (int count = 0; count < attributes.length; count += 2)
|
||||||
|
{
|
||||||
|
this.out.print(" ");
|
||||||
|
this.out.print(attributes[count]);
|
||||||
|
this.out.print("=\"");
|
||||||
|
this.out.print(attributes[count + 1]);
|
||||||
|
this.out.print("\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method writes content using XML escape.
|
||||||
|
*
|
||||||
|
* @param content
|
||||||
|
* data to write in XML format.
|
||||||
|
*/
|
||||||
|
private void writeTagContent(final String content)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int count = 0; count < content.length(); count++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
char car = content.charAt(count);
|
||||||
|
|
||||||
|
switch (car)
|
||||||
|
{
|
||||||
|
case '<':
|
||||||
|
this.out.print("<");
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
this.out.print(">");
|
||||||
|
break;
|
||||||
|
case '&':
|
||||||
|
this.out.print("&");
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
this.out.print(""");
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
this.out.print("'");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this.out.print(car);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method writes a XML header with attributes.
|
||||||
|
*
|
||||||
|
* @param attributes
|
||||||
|
*/
|
||||||
|
public void writeXMLHeader(final String... attributes)
|
||||||
|
{
|
||||||
|
|
||||||
|
//
|
||||||
|
this.out.print("<?xml");
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!ArrayUtils.contains(attributes, "version"))
|
||||||
|
{
|
||||||
|
this.out.print(" version=\"1.0\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!ArrayUtils.contains(attributes, "encoding"))
|
||||||
|
{
|
||||||
|
this.out.print(" encoding=\"UTF-8\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!ArrayUtils.contains(attributes, "encoding"))
|
||||||
|
{
|
||||||
|
this.out.print(" standalone=\"no\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (attributes != null)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int count = 0; count < attributes.length; count += 2)
|
||||||
|
{
|
||||||
|
this.out.print(" ");
|
||||||
|
this.out.print(attributes[count]);
|
||||||
|
this.out.print("=\"");
|
||||||
|
this.out.print(attributes[count + 1]);
|
||||||
|
this.out.print("\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
this.out.print(" ?>");
|
||||||
|
}
|
||||||
|
}
|
68
src/fr/devinsy/util/xml/XMLZipReader.java
Normal file
68
src/fr/devinsy/util/xml/XMLZipReader.java
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.xml;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
|
import javax.xml.stream.XMLInputFactory;
|
||||||
|
import javax.xml.stream.XMLStreamException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class XMLZipReader extends XMLReader
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
* @throws XMLStreamException
|
||||||
|
*/
|
||||||
|
public XMLZipReader(final File file) throws IOException, XMLStreamException
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||||
|
ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
|
||||||
|
zis.getNextEntry();
|
||||||
|
this.in = factory.createXMLEventReader(zis, "UTF-8");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param target
|
||||||
|
* @throws IOException
|
||||||
|
* @throws XMLStreamException
|
||||||
|
*/
|
||||||
|
public XMLZipReader(final InputStream source) throws IOException, XMLStreamException
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||||
|
ZipInputStream zis = new ZipInputStream(source);
|
||||||
|
zis.getNextEntry();
|
||||||
|
this.in = factory.createXMLEventReader(zis, "UTF-8");
|
||||||
|
}
|
||||||
|
}
|
149
src/fr/devinsy/util/xml/XMLZipWriter.java
Normal file
149
src/fr/devinsy/util/xml/XMLZipWriter.java
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2014 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
package fr.devinsy.util.xml;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.util.zip.Deflater;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
import fr.devinsy.util.FileTools;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
|
||||||
|
*/
|
||||||
|
public class XMLZipWriter extends XMLWriter
|
||||||
|
{
|
||||||
|
private ZipOutputStream zos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public XMLZipWriter(final File file) throws IOException
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.zos = new ZipOutputStream(new FileOutputStream(file));
|
||||||
|
this.zos.setLevel(Deflater.BEST_COMPRESSION);
|
||||||
|
this.zos.setMethod(ZipOutputStream.DEFLATED);
|
||||||
|
this.zos.setComment("Generated by XMLZipWriter");
|
||||||
|
this.zos.putNextEntry(new ZipEntry(FileTools.setExtension(file, ".xml").getName()));
|
||||||
|
this.out = new PrintWriter(new OutputStreamWriter(this.zos, "UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public XMLZipWriter(final File file, final String generator) throws IOException
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.zos = new ZipOutputStream(new FileOutputStream(file));
|
||||||
|
this.zos.setLevel(Deflater.BEST_COMPRESSION);
|
||||||
|
this.zos.setMethod(ZipOutputStream.DEFLATED);
|
||||||
|
this.zos.setComment(generator);
|
||||||
|
this.zos.putNextEntry(new ZipEntry(FileTools.setExtension(file, ".xml").getName()));
|
||||||
|
this.out = new PrintWriter(new OutputStreamWriter(this.zos, "UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param target
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public XMLZipWriter(final OutputStream target, final String generator) throws IOException
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.zos = new ZipOutputStream(target);
|
||||||
|
this.zos.setLevel(Deflater.BEST_COMPRESSION);
|
||||||
|
this.zos.setMethod(ZipOutputStream.DEFLATED);
|
||||||
|
if (generator != null)
|
||||||
|
{
|
||||||
|
this.zos.setComment(generator);
|
||||||
|
}
|
||||||
|
this.out = new PrintWriter(new OutputStreamWriter(this.zos, "UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param target
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public XMLZipWriter(final OutputStream target, final String fileName, final String generator) throws IOException
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.zos = new ZipOutputStream(target);
|
||||||
|
this.zos.setLevel(Deflater.BEST_COMPRESSION);
|
||||||
|
this.zos.setMethod(ZipOutputStream.DEFLATED);
|
||||||
|
if (generator != null)
|
||||||
|
{
|
||||||
|
this.zos.setComment(generator);
|
||||||
|
}
|
||||||
|
openEntry(fileName);
|
||||||
|
this.out = new PrintWriter(new OutputStreamWriter(this.zos, "UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws IOException
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException
|
||||||
|
{
|
||||||
|
closeEntry();
|
||||||
|
super.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws IOException
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void closeEntry() throws IOException
|
||||||
|
{
|
||||||
|
flush();
|
||||||
|
this.zos.closeEntry();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param fileName
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void openEntry(final String fileName) throws IOException
|
||||||
|
{
|
||||||
|
if (fileName == null)
|
||||||
|
{
|
||||||
|
throw new NullPointerException("fileName is null.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.zos.putNextEntry(new ZipEntry(FileTools.setExtension(fileName, ".xml")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
316
src/org/apache/jackrabbit/util/ISO8601.java
Normal file
316
src/org/apache/jackrabbit/util/ISO8601.java
Normal file
|
@ -0,0 +1,316 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.jackrabbit.util;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <code>ISO8601</code> utility class provides helper methods
|
||||||
|
* to deal with date/time formatting using a specific ISO8601-compliant
|
||||||
|
* format (see <a href="http://www.w3.org/TR/NOTE-datetime">ISO 8601</a>).
|
||||||
|
* <p/>
|
||||||
|
* The currently supported format is:
|
||||||
|
* <pre>
|
||||||
|
* ±YYYY-MM-DDThh:mm:ss.SSSTZD
|
||||||
|
* </pre>
|
||||||
|
* where:
|
||||||
|
* <pre>
|
||||||
|
* ±YYYY = four-digit year with optional sign where values <= 0 are
|
||||||
|
* denoting years BCE and values > 0 are denoting years CE,
|
||||||
|
* e.g. -0001 denotes the year 2 BCE, 0000 denotes the year 1 BCE,
|
||||||
|
* 0001 denotes the year 1 CE, and so on...
|
||||||
|
* MM = two-digit month (01=January, etc.)
|
||||||
|
* DD = two-digit day of month (01 through 31)
|
||||||
|
* hh = two digits of hour (00 through 23) (am/pm NOT allowed)
|
||||||
|
* mm = two digits of minute (00 through 59)
|
||||||
|
* ss = two digits of second (00 through 59)
|
||||||
|
* SSS = three digits of milliseconds (000 through 999)
|
||||||
|
* TZD = time zone designator, Z for Zulu (i.e. UTC) or an offset from UTC
|
||||||
|
* in the form of +hh:mm or -hh:mm
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
public final class ISO8601 {
|
||||||
|
/**
|
||||||
|
* Parses an ISO8601-compliant date/time string.
|
||||||
|
*
|
||||||
|
* @param text the date/time string to be parsed
|
||||||
|
* @return a <code>Calendar</code>, or <code>null</code> if the input could
|
||||||
|
* not be parsed
|
||||||
|
* @throws IllegalArgumentException if a <code>null</code> argument is passed
|
||||||
|
*/
|
||||||
|
public static Calendar parse(String text) {
|
||||||
|
if (text == null) {
|
||||||
|
throw new IllegalArgumentException("argument can not be null");
|
||||||
|
}
|
||||||
|
|
||||||
|
// check optional leading sign
|
||||||
|
char sign;
|
||||||
|
int start;
|
||||||
|
if (text.startsWith("-")) {
|
||||||
|
sign = '-';
|
||||||
|
start = 1;
|
||||||
|
} else if (text.startsWith("+")) {
|
||||||
|
sign = '+';
|
||||||
|
start = 1;
|
||||||
|
} else {
|
||||||
|
sign = '+'; // no sign specified, implied '+'
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the expected format of the remainder of the string is:
|
||||||
|
* YYYY-MM-DDThh:mm:ss.SSSTZD
|
||||||
|
*
|
||||||
|
* note that we cannot use java.text.SimpleDateFormat for
|
||||||
|
* parsing because it can't handle years <= 0 and TZD's
|
||||||
|
*/
|
||||||
|
|
||||||
|
int year, month, day, hour, min, sec, ms;
|
||||||
|
String tzID;
|
||||||
|
try {
|
||||||
|
// year (YYYY)
|
||||||
|
year = Integer.parseInt(text.substring(start, start + 4));
|
||||||
|
start += 4;
|
||||||
|
// delimiter '-'
|
||||||
|
if (text.charAt(start) != '-') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
// month (MM)
|
||||||
|
month = Integer.parseInt(text.substring(start, start + 2));
|
||||||
|
start += 2;
|
||||||
|
// delimiter '-'
|
||||||
|
if (text.charAt(start) != '-') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
// day (DD)
|
||||||
|
day = Integer.parseInt(text.substring(start, start + 2));
|
||||||
|
start += 2;
|
||||||
|
// delimiter 'T'
|
||||||
|
if (text.charAt(start) != 'T') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
// hour (hh)
|
||||||
|
hour = Integer.parseInt(text.substring(start, start + 2));
|
||||||
|
start += 2;
|
||||||
|
// delimiter ':'
|
||||||
|
if (text.charAt(start) != ':') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
// minute (mm)
|
||||||
|
min = Integer.parseInt(text.substring(start, start + 2));
|
||||||
|
start += 2;
|
||||||
|
// delimiter ':'
|
||||||
|
if (text.charAt(start) != ':') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
// second (ss)
|
||||||
|
sec = Integer.parseInt(text.substring(start, start + 2));
|
||||||
|
start += 2;
|
||||||
|
// delimiter '.'
|
||||||
|
if (text.charAt(start) != '.') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
// millisecond (SSS)
|
||||||
|
ms = Integer.parseInt(text.substring(start, start + 3));
|
||||||
|
start += 3;
|
||||||
|
// time zone designator (Z or +00:00 or -00:00)
|
||||||
|
if (text.charAt(start) == '+' || text.charAt(start) == '-') {
|
||||||
|
// offset to UTC specified in the format +00:00/-00:00
|
||||||
|
tzID = "GMT" + text.substring(start);
|
||||||
|
} else if (text.substring(start).equals("Z")) {
|
||||||
|
tzID = "GMT";
|
||||||
|
} else {
|
||||||
|
// invalid time zone designator
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} catch (IndexOutOfBoundsException e) {
|
||||||
|
return null;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeZone tz = TimeZone.getTimeZone(tzID);
|
||||||
|
// verify id of returned time zone (getTimeZone defaults to "GMT")
|
||||||
|
if (!tz.getID().equals(tzID)) {
|
||||||
|
// invalid time zone
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize Calendar object
|
||||||
|
Calendar cal = Calendar.getInstance(tz);
|
||||||
|
cal.setLenient(false);
|
||||||
|
// year and era
|
||||||
|
if (sign == '-' || year == 0) {
|
||||||
|
// not CE, need to set era (BCE) and adjust year
|
||||||
|
cal.set(Calendar.YEAR, year + 1);
|
||||||
|
cal.set(Calendar.ERA, GregorianCalendar.BC);
|
||||||
|
} else {
|
||||||
|
cal.set(Calendar.YEAR, year);
|
||||||
|
cal.set(Calendar.ERA, GregorianCalendar.AD);
|
||||||
|
}
|
||||||
|
// month (0-based!)
|
||||||
|
cal.set(Calendar.MONTH, month - 1);
|
||||||
|
// day of month
|
||||||
|
cal.set(Calendar.DAY_OF_MONTH, day);
|
||||||
|
// hour
|
||||||
|
cal.set(Calendar.HOUR_OF_DAY, hour);
|
||||||
|
// minute
|
||||||
|
cal.set(Calendar.MINUTE, min);
|
||||||
|
// second
|
||||||
|
cal.set(Calendar.SECOND, sec);
|
||||||
|
// millisecond
|
||||||
|
cal.set(Calendar.MILLISECOND, ms);
|
||||||
|
|
||||||
|
try {
|
||||||
|
/**
|
||||||
|
* the following call will trigger an IllegalArgumentException
|
||||||
|
* if any of the set values are illegal or out of range
|
||||||
|
*/
|
||||||
|
cal.getTime();
|
||||||
|
/**
|
||||||
|
* in addition check the validity of the year
|
||||||
|
*/
|
||||||
|
getYear(cal);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats a <code>Calendar</code> value into an ISO8601-compliant
|
||||||
|
* date/time string.
|
||||||
|
*
|
||||||
|
* @param cal the time value to be formatted into a date/time string.
|
||||||
|
* @return the formatted date/time string.
|
||||||
|
* @throws IllegalArgumentException if a <code>null</code> argument is passed
|
||||||
|
* or the calendar cannot be represented as defined by ISO 8601 (i.e. year
|
||||||
|
* with more than four digits).
|
||||||
|
*/
|
||||||
|
public static String format(Calendar cal) throws IllegalArgumentException {
|
||||||
|
if (cal == null) {
|
||||||
|
throw new IllegalArgumentException("argument can not be null");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the format of the date/time string is:
|
||||||
|
* YYYY-MM-DDThh:mm:ss.SSSTZD
|
||||||
|
*
|
||||||
|
* note that we cannot use java.text.SimpleDateFormat for
|
||||||
|
* formatting because it can't handle years <= 0 and TZD's
|
||||||
|
*/
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
// year ([-]YYYY)
|
||||||
|
appendZeroPaddedInt(buf, getYear(cal), 4);
|
||||||
|
buf.append('-');
|
||||||
|
// month (MM)
|
||||||
|
appendZeroPaddedInt(buf, cal.get(Calendar.MONTH) + 1, 2);
|
||||||
|
buf.append('-');
|
||||||
|
// day (DD)
|
||||||
|
appendZeroPaddedInt(buf, cal.get(Calendar.DAY_OF_MONTH), 2);
|
||||||
|
buf.append('T');
|
||||||
|
// hour (hh)
|
||||||
|
appendZeroPaddedInt(buf, cal.get(Calendar.HOUR_OF_DAY), 2);
|
||||||
|
buf.append(':');
|
||||||
|
// minute (mm)
|
||||||
|
appendZeroPaddedInt(buf, cal.get(Calendar.MINUTE), 2);
|
||||||
|
buf.append(':');
|
||||||
|
// second (ss)
|
||||||
|
appendZeroPaddedInt(buf, cal.get(Calendar.SECOND), 2);
|
||||||
|
buf.append('.');
|
||||||
|
// millisecond (SSS)
|
||||||
|
appendZeroPaddedInt(buf, cal.get(Calendar.MILLISECOND), 3);
|
||||||
|
// time zone designator (Z or +00:00 or -00:00)
|
||||||
|
TimeZone tz = cal.getTimeZone();
|
||||||
|
// determine offset of timezone from UTC (incl. daylight saving)
|
||||||
|
int offset = tz.getOffset(cal.getTimeInMillis());
|
||||||
|
if (offset != 0) {
|
||||||
|
int hours = Math.abs((offset / (60 * 1000)) / 60);
|
||||||
|
int minutes = Math.abs((offset / (60 * 1000)) % 60);
|
||||||
|
buf.append(offset < 0 ? '-' : '+');
|
||||||
|
appendZeroPaddedInt(buf, hours, 2);
|
||||||
|
buf.append(':');
|
||||||
|
appendZeroPaddedInt(buf, minutes, 2);
|
||||||
|
} else {
|
||||||
|
buf.append('Z');
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the astronomical year of the given calendar.
|
||||||
|
*
|
||||||
|
* @param cal a calendar instance.
|
||||||
|
* @return the astronomical year.
|
||||||
|
* @throws IllegalArgumentException if calendar cannot be represented as
|
||||||
|
* defined by ISO 8601 (i.e. year with more
|
||||||
|
* than four digits).
|
||||||
|
*/
|
||||||
|
public static int getYear(Calendar cal) throws IllegalArgumentException {
|
||||||
|
// determine era and adjust year if necessary
|
||||||
|
int year = cal.get(Calendar.YEAR);
|
||||||
|
if (cal.isSet(Calendar.ERA)
|
||||||
|
&& cal.get(Calendar.ERA) == GregorianCalendar.BC) {
|
||||||
|
/**
|
||||||
|
* calculate year using astronomical system:
|
||||||
|
* year n BCE => astronomical year -n + 1
|
||||||
|
*/
|
||||||
|
year = 0 - year + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (year > 9999 || year < -9999) {
|
||||||
|
throw new IllegalArgumentException("Calendar has more than four " +
|
||||||
|
"year digits, cannot be formatted as ISO8601: " + year);
|
||||||
|
}
|
||||||
|
return year;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends a zero-padded number to the given string buffer.
|
||||||
|
* <p/>
|
||||||
|
* This is an internal helper method which doesn't perform any
|
||||||
|
* validation on the given arguments.
|
||||||
|
*
|
||||||
|
* @param buf String buffer to append to
|
||||||
|
* @param n number to append
|
||||||
|
* @param precision number of digits to append
|
||||||
|
*/
|
||||||
|
private static void appendZeroPaddedInt(StringBuffer buf, int n, int precision) {
|
||||||
|
if (n < 0) {
|
||||||
|
buf.append('-');
|
||||||
|
n = -n;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int exp = precision - 1; exp > 0; exp--) {
|
||||||
|
if (n < Math.pow(10, exp)) {
|
||||||
|
buf.append('0');
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf.append(n);
|
||||||
|
}
|
||||||
|
}
|
1
src/org/apache/jackrabbit/util/note
Normal file
1
src/org/apache/jackrabbit/util/note
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Extract from jackrabbit-2.1.1-src.zip
|
111
test/FileIteratorSandbox.java
Normal file
111
test/FileIteratorSandbox.java
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013 Christian Pierre MOMON
|
||||||
|
*
|
||||||
|
* This file is part of Devinsy-utils.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Devinsy-utils is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Devinsy-utils. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.apache.log4j.ConsoleAppender;
|
||||||
|
import org.apache.log4j.PatternLayout;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import fr.devinsy.util.FileIterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class FileIteratorSandbox
|
||||||
|
{
|
||||||
|
private static final Logger logger;
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
// Initialize logger.
|
||||||
|
org.apache.log4j.BasicConfigurator.configure();
|
||||||
|
org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.DEBUG);
|
||||||
|
|
||||||
|
logger = LoggerFactory.getLogger(FileIteratorSandbox.class);
|
||||||
|
|
||||||
|
//
|
||||||
|
org.apache.log4j.Logger defaultLogger = org.apache.log4j.Logger.getRootLogger();
|
||||||
|
defaultLogger.removeAllAppenders();
|
||||||
|
defaultLogger.addAppender(new ConsoleAppender(new PatternLayout("%d{ISO8601} - dutils [%-5p] %34.34c.%-25M - %m%n")));
|
||||||
|
|
||||||
|
//
|
||||||
|
logger.debug("Log initialized.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void main(final String[] args)
|
||||||
|
{
|
||||||
|
test();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected static void test()
|
||||||
|
{
|
||||||
|
System.out.println("user.dir=" + System.getProperty("user.dir"));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// File f = new File("TestTree/DirectoryOne/titi2");
|
||||||
|
// File f = new File("/home/cpm/.kde//cache-cpmstar");
|
||||||
|
File f = new File("tests/TestTree/xine.jpg");
|
||||||
|
System.out.println("exists=" + f.exists());
|
||||||
|
System.out.println("canonical path = " + f.getCanonicalPath());
|
||||||
|
System.out.println("absolute path = " + f.getAbsolutePath());
|
||||||
|
System.out.println("name = " + f.getName());
|
||||||
|
System.out.println("parent = " + f.getParent());
|
||||||
|
System.out.println("path = " + f.getPath());
|
||||||
|
System.out.println("path = " + f.lastModified());
|
||||||
|
System.out.println("path = " + f.length());
|
||||||
|
System.out.println("path = " + f.isFile());
|
||||||
|
System.out.println("path = " + f.isDirectory());
|
||||||
|
System.out.println("list = " + f.list());
|
||||||
|
|
||||||
|
System.out.println("----");
|
||||||
|
// FileIterator i = new FileIterator(new File("tests/TestTree"));
|
||||||
|
FileIterator i = new FileIterator(new File("tests/TestTree/xine.jpg"), null, true);
|
||||||
|
// FileIterator i = new FileIterator(new
|
||||||
|
// File("/home/cpm/.kde/cache-cpmstar"), ".*cache.*", false);
|
||||||
|
// FileIterator i = new FileIterator(new File("tests/TestTree"),
|
||||||
|
// ".*dsc.*", false);
|
||||||
|
// FileIterator i = new FileIterator(new
|
||||||
|
// File("/home/cpm/Images/Photos/"));
|
||||||
|
// FileIterator i = new FileIterator(new
|
||||||
|
// File("/home/cpm/Images/Photos/"), ".*\\.(JPG|jpg)", false);
|
||||||
|
// FileIterator i = new FileIterator(new
|
||||||
|
// File("/home/cpm/Images/Photos/"), ".*anni_moi.*", false);
|
||||||
|
|
||||||
|
while (i.hasNext())
|
||||||
|
{
|
||||||
|
// System.out.println(i.toString());
|
||||||
|
System.out.println("File=[" + i.next().getPath() + "]");
|
||||||
|
}
|
||||||
|
i.reset();
|
||||||
|
System.out.println("Cardinal=" + i.finalCountdown());
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
System.out.println("ERROR:" + exception.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
19
test/Foot1Test.java
Normal file
19
test/Foot1Test.java
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class Foot1Test
|
||||||
|
{
|
||||||
|
// private Logger logger =
|
||||||
|
// LoggerFactory.getLogger(PdfGenerationAmqpServiceInjectedTest.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void test1a()
|
||||||
|
{
|
||||||
|
// logger.debug("===== test starting...");
|
||||||
|
|
||||||
|
// logger.debug("===== test done.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
1
test/TestTree/.test/arf
Normal file
1
test/TestTree/.test/arf
Normal file
|
@ -0,0 +1 @@
|
||||||
|
test sioux
|
BIN
test/TestTree/20081111-nouvelle_voiture/dsc01469.jpg
Executable file
BIN
test/TestTree/20081111-nouvelle_voiture/dsc01469.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 771 KiB |
BIN
test/TestTree/20081111-nouvelle_voiture/dsc01470.jpg
Executable file
BIN
test/TestTree/20081111-nouvelle_voiture/dsc01470.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 869 KiB |
BIN
test/TestTree/20081111-nouvelle_voiture/dsc01472.jpg
Executable file
BIN
test/TestTree/20081111-nouvelle_voiture/dsc01472.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 853 KiB |
BIN
test/TestTree/20081111-nouvelle_voiture/dsc01474.jpg
Executable file
BIN
test/TestTree/20081111-nouvelle_voiture/dsc01474.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 798 KiB |
1
test/TestTree/DirectoryOne/titi
Normal file
1
test/TestTree/DirectoryOne/titi
Normal file
|
@ -0,0 +1 @@
|
||||||
|
azertyuiop
|
1
test/TestTree/DirectoryOne/toto
Normal file
1
test/TestTree/DirectoryOne/toto
Normal file
|
@ -0,0 +1 @@
|
||||||
|
good weather today
|
1
test/TestTree/DirectoryOne/tu tu
Normal file
1
test/TestTree/DirectoryOne/tu tu
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Ceci est un test.
|
BIN
test/TestTree/P/dsc01469.jpg
Executable file
BIN
test/TestTree/P/dsc01469.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 771 KiB |
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue