Compare commits

..

26 commits
0.3 ... 0.17

Author SHA1 Message Date
13731fdeab Made code review. 2024-08-23 06:48:31 +02:00
4543221aee Improved javadoc. 2024-08-23 06:33:52 +02:00
d1bbae3330 Build 0.17.2 2024-08-23 06:33:15 +02:00
c720cfc63d Moved package form fr.devinsy.util.rss to fr.devinsy.rss. 2024-08-23 06:32:50 +02:00
c15a64eb1d Build 0.17.1 2024-08-23 01:55:11 +02:00
6efdf7d39e Fixed LocalDateTime to ZonedDateTime. 2024-08-23 01:54:27 +02:00
be88c759fa Build 0.17.0 2021-10-14 16:09:34 +02:00
c1e1ab7207 Upgraded to Java 17. 2021-10-14 16:09:17 +02:00
ec64a05d90 Upgraded libraries. 2021-10-14 16:07:58 +02:00
e5457f3964 Upgraded version numbers. 2020-09-13 00:51:04 +02:00
ae47bef967 Migrated to Eclipse 4.16 and Java 11. 2020-08-14 17:12:57 +02:00
39f12e3470 Cleaned not useful MANIFEST file. 2018-06-04 11:23:41 +02:00
c556585d6c Upgraded jars (devinsy-strings, devinsy-xml). 2018-06-04 10:58:48 +02:00
643e6e84de Migrated to Java 8. Upgraded library jar files. 2018-05-31 10:30:49 +02:00
92d5c02692 Init branch 0.8 for Java 8 migration. 2018-05-31 09:26:00 +02:00
9939942694 Improved Eclipse configuration. 2018-05-26 09:49:52 +02:00
acc2653f04 Completed demo. 2017-05-09 10:07:55 +02:00
672380ce2e Updated Devinsy-strings library. 2017-05-09 09:59:08 +02:00
f23c307de8 Normalized class name. 2017-05-09 09:54:00 +02:00
a804415738 Updated XML library. 2017-05-09 09:53:40 +02:00
b710da8b5f Added Demo. 2017-05-06 01:13:04 +02:00
90130e98e6 Performed code review and Javadoc review. 2017-05-04 22:17:50 +02:00
1961b35c9b Fixed project name. 2017-05-02 19:18:38 +02:00
d375812e80 Build 0.4.0 2017-05-02 19:18:06 +02:00
236ebf2ebb Fixed buildpath. 2017-05-02 19:09:35 +02:00
3e4933ec7d Forked from Devinsy-utils to Devinsy-rss. Fixed headers, libraries… 2017-05-02 00:11:02 +02:00
116 changed files with 366 additions and 14778 deletions

View file

@ -2,18 +2,20 @@
<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.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
<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"/> <attribute name="owner.project.facets" value="java"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<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/hamcrest-core-1.3.jar" sourcepath="lib/UnitTesting/hamcrest-core-1.3-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/UnitTesting/junit-4.12.jar" sourcepath="lib/UnitTesting/junit-4.12-sources.jar"/>
<classpathentry kind="lib" path="lib/commons-lang3-3.12.0.jar" sourcepath="lib/commons-lang3-3.12.0-sources.jar"/>
<classpathentry kind="lib" path="lib/devinsy-strings-0.17.0.jar" sourcepath="lib/devinsy-strings-0.17.0-sources.zip"/>
<classpathentry kind="lib" path="lib/devinsy-xml-0.17.0.jar" sourcepath="lib/devinsy-xml-0.17.0-sources.zip"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<projectDescription> <projectDescription>
<name>devinsy-utils</name> <name>devinsy-rss</name>
<comment></comment> <comment></comment>
<projects> <projects>
</projects> </projects>

View file

@ -1,15 +1,29 @@
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.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=1.6 org.eclipse.jdt.core.compiler.compliance=17
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.source=1.6 org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=17
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.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
@ -17,17 +31,20 @@ 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_binary_expression=16 org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=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_conditional_expression=80 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
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_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_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_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_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_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_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@ -111,11 +128,12 @@ 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_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_binary_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_bitwise_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
@ -145,6 +163,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=inser
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_logical_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=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
@ -169,13 +189,17 @@ 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_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_binary_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_bitwise_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
@ -222,6 +246,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do n
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_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
@ -258,9 +284,12 @@ 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
@ -286,6 +315,10 @@ 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.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_binary_operator=true org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_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_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

View file

@ -49,12 +49,16 @@ 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_profile=_Devinsy-utils cleanup_profile=_Devinsy-rss
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-utils formatter_profile=_Devinsy-rss
formatter_settings_version=12 formatter_settings_version=12
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

View file

@ -1,8 +1,7 @@
<?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>

View file

@ -1,9 +1,7 @@
# DEVINSY Utils # DEVINSY RSS
GeoNames is geographical database under a creative commons attribution license. DEVINSY RSS provides an easy, local and fast Java classes to manage RSS stream.
FlatDB4GeoNames provides an easy, local and fast Java access to GeoNames data.
## Author ## Author
Christian Pierre MOMON &lt;christian.momon@devinsy.fr&gt; Christian Pierre MOMON &lt;christian.momon@devinsy.fr&gt;
@ -13,14 +11,13 @@ This software is released under the GNU LGPL.
## Requirements ## Requirements
FlatDB4Geonames requires: - Java 17
- Java 1.6 - Eclipse > 202306.
- Eclipse Kepler
## Context ## Context
Several useful Java classes. Several useful Java classes.
## Conclusion ## Conclusion
Enjoy and use FlatDB4GeoNames. For questions, improvement, issues: christian.momon@devinsy.fr Enjoy and use DEVINSY RSS. For questions, improvement, issues: christian.momon@devinsy.fr

View file

@ -1,3 +1,3 @@
#Build Number for ANT. Do not edit! #Build Number for ANT. Do not edit!
#Wed Apr 19 22:56:10 CEST 2017 #Fri Aug 23 06:33:15 CEST 2024
build.number=4 build.number=3

View file

@ -1,3 +1,3 @@
product.name=devinsy-utils product.name=devinsy-rss
product.revision.major=0 product.revision.major=0
product.revision.minor=3 product.revision.minor=17

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,9 +1,16 @@
Description of used libraries: Description of used libraries:
- commons-lang: useful tools (StringUtils...)
- hamcrest-core: required by junit
- joda-time: useful DateTime library
- junit: unit tests API
- log4j: log API
- slf4j-api: facade log API
- slf4j-log4j12: adaptation layer between slf4j and log4j
- Logs/
- log4j log API
- slf4j-api facade log API
- slf4j-log4j12 adaptation layer between slf4j and log4j
- UnitTesting/
- hamcrest-core required by junit
- hsqldb SQL Database for unit test.
- junit unit tests API
- other:
- commons-codec digest tools
- commons-lang useful tools (StringUtils...)
- JodaTime useful time library

Binary file not shown.

Binary file not shown.

Binary file not shown.

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/devinsy-xml-0.17.0.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,3 +0,0 @@
Manifest-Version: 1.0
Class-Path:

View file

@ -1,39 +1,39 @@
/** /*
* Copyright (C) 2013-2014 Christian Pierre MOMON * Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* *
* This file is part of Devinsy-utils. * This file is part of Devinsy-rss.
* *
* Devinsy-utils is free software: you can redistribute it and/or modify * Devinsy-rss 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-utils is distributed in the hope that it will be useful, * Devinsy-rss 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-utils. If not, see <http://www.gnu.org/licenses/> * along with Devinsy-rss. If not, see <http://www.gnu.org/licenses/>
*/ */
package fr.devinsy.util.rss; package fr.devinsy.rss;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import fr.devinsy.util.strings.StringList; import fr.devinsy.strings.StringList;
/** /**
* * The Class RSSCache.
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/ */
public class RSSCache public class RSSCache
{ {
private static RSSCache instance = new RSSCache(); private static RSSCache instance = new RSSCache();
private HashMap<String, String> cache; private Map<String, String> cache;
/** /**
* * Instantiates a new RSS cache.
*/ */
private RSSCache() private RSSCache()
{ {
@ -41,21 +41,30 @@ public class RSSCache
} }
/** /**
* Gets the.
* *
* @param key * @param name
* @param locale * the name
* @return * @return the string
*/ */
public String get(final String name) public String get(final String name)
{ {
return get(name, Locale.ROOT); String result;
result = get(name, Locale.ROOT);
//
return result;
} }
/** /**
* Gets the.
* *
* @param name * @param name
* the name
* @param locale * @param locale
* @return * the locale
* @return the string
*/ */
public String get(final String name, final Locale locale) public String get(final String name, final Locale locale)
{ {
@ -63,7 +72,7 @@ public class RSSCache
if (name == null) if (name == null)
{ {
throw new NullPointerException("name is null."); throw new IllegalArgumentException("name is null.");
} }
else if (locale == null) else if (locale == null)
{ {
@ -79,14 +88,18 @@ public class RSSCache
} }
} }
//
return result; return result;
} }
/** /**
* Key.
* *
* @param name * @param name
* the name
* @param locale * @param locale
* @return * the locale
* @return the string
*/ */
private String key(final String name, final Locale locale) private String key(final String name, final Locale locale)
{ {
@ -106,16 +119,20 @@ public class RSSCache
} }
/** /**
* Put.
* *
* @param key * @param name
* the name
* @param locale * @param locale
* the locale
* @param rss * @param rss
* the rss
*/ */
public void put(final String name, final Locale locale, final String rss) public void put(final String name, final Locale locale, final String rss)
{ {
if (name == null) if (name == null)
{ {
throw new NullPointerException("name is null."); throw new IllegalArgumentException("Name is null.");
} }
else if (locale == null) else if (locale == null)
{ {
@ -128,10 +145,12 @@ public class RSSCache
} }
/** /**
* Put.
* *
* @param name * @param name
* @param locale * the name
* @param rss * @param rss
* the rss
*/ */
public void put(final String name, final String rss) public void put(final String name, final String rss)
{ {
@ -139,8 +158,10 @@ public class RSSCache
} }
/** /**
* Removes the.
* *
* @param name * @param name
* the name
*/ */
public void remove(final String name) public void remove(final String name)
{ {
@ -148,14 +169,18 @@ public class RSSCache
} }
/** /**
* Removes the.
* *
* @param name * @param name
* the name
* @param locale
* the locale
*/ */
public void remove(final String name, final Locale locale) public void remove(final String name, final Locale locale)
{ {
if (name == null) if (name == null)
{ {
throw new NullPointerException("key is null."); throw new IllegalArgumentException("Name is null.");
} }
else else
{ {
@ -164,8 +189,10 @@ public class RSSCache
} }
/** /**
* Sets the oudated.
* *
* @param key * @param name
* the new oudated
*/ */
public void setOudated(final String name) public void setOudated(final String name)
{ {
@ -179,8 +206,11 @@ public class RSSCache
} }
/** /**
* Subkeys.
* *
* @param key * @param name
* the name
* @return the string list
*/ */
public StringList subkeys(final String name) public StringList subkeys(final String name)
{ {
@ -203,12 +233,12 @@ public class RSSCache
} }
/** /**
* Instance.
* *
* @return * @return the RSS cache
*/ */
public static RSSCache instance() public static RSSCache instance()
{ {
return instance; return instance;
} }
} }

View file

@ -1,59 +1,44 @@
/** /*
* Copyright (C) 2013-2014 Christian Pierre MOMON * Copyright (C) 2013-2024 Christian Pierre MOMON
* *
* This file is part of Devinsy-utils. * This file is part of Devinsy-rss.
* *
* Devinsy-utils is free software: you can redistribute it and/or modify * Devinsy-rss 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-utils is distributed in the hope that it will be useful, * Devinsy-rss 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-utils. If not, see <http://www.gnu.org/licenses/> * along with Devinsy-rss. If not, see <http://www.gnu.org/licenses/>
*/ */
package fr.devinsy.util.rss; package fr.devinsy.rss;
import org.joda.time.DateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
/** /**
* * The Class RSSElement.
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/ */
public class RSSElement public class RSSElement
{ {
public static final String DATE_PATTERN = "dd MMM YYYY hh:mm:ss Z"; public static final String DATE_PATTERN = "dd MMM YYYY hh:mm:ss Z";
private String name; private String name;
private String value; private String value;
private String[] attributes; private String[] attributes;
/** /**
* Instantiates a new RSS element.
* *
* @param name * @param name
* the name
* @param value * @param value
*/ * the 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) public RSSElement(final String name, final long value)
{ {
@ -63,9 +48,14 @@ public class RSSElement
} }
/** /**
* Instantiates a new RSS element.
* *
* @param name * @param name
* the name
* @param value * @param value
* the value
* @param attributes
* the attributes
*/ */
public RSSElement(final String name, final long value, final String... attributes) public RSSElement(final String name, final long value, final String... attributes)
{ {
@ -75,9 +65,12 @@ public class RSSElement
} }
/** /**
* Instantiates a new RSS element.
* *
* @param name * @param name
* the name
* @param value * @param value
* the value
*/ */
public RSSElement(final String name, final String value) public RSSElement(final String name, final String value)
{ {
@ -87,9 +80,14 @@ public class RSSElement
} }
/** /**
* Instantiates a new RSS element.
* *
* @param name * @param name
* the name
* @param value * @param value
* the value
* @param attributes
* the attributes
*/ */
public RSSElement(final String name, final String value, final String... attributes) public RSSElement(final String name, final String value, final String... attributes)
{ {
@ -98,14 +96,42 @@ public class RSSElement
this.attributes = attributes; this.attributes = attributes;
} }
/**
* Instantiates a new RSS element.
*
* @param name
* the name
* @param value
* the value
*/
public RSSElement(final String name, final ZonedDateTime value)
{
setName(name);
if (value == null)
{
this.value = null;
}
else
{
this.value = value.format(DateTimeFormatter.ofPattern(DATE_PATTERN));
}
this.attributes = null;
}
/**
* Gets the attributes.
*
* @return the attributes
*/
public String[] getAttributes() public String[] getAttributes()
{ {
return this.attributes; return this.attributes;
} }
/** /**
* Gets the name.
* *
* @return * @return the name
*/ */
public String getName() public String getName()
{ {
@ -113,28 +139,37 @@ public class RSSElement
} }
/** /**
* Gets the value.
* *
* @return * @return the value
*/ */
public String getValue() public String getValue()
{ {
return this.value; return this.value;
} }
/**
* Sets the attributes.
*
* @param attributes
* the new attributes
*/
public void setAttributes(final String[] attributes) public void setAttributes(final String[] attributes)
{ {
this.attributes = attributes; this.attributes = attributes;
} }
/** /**
* Sets the name.
* *
* @param name * @param name
* the new name
*/ */
public void setName(final String name) public void setName(final String name)
{ {
if (name == null) if (name == null)
{ {
throw new NullPointerException("name is null"); throw new IllegalArgumentException("name is null");
} }
else else
{ {
@ -143,12 +178,13 @@ public class RSSElement
} }
/** /**
* Sets the value.
* *
* @param value * @param value
* the new value
*/ */
public void setValue(final String value) public void setValue(final String value)
{ {
this.value = value; this.value = value;
} }
} }

View file

@ -1,22 +1,22 @@
/** /*
* Copyright (C) 2013-2014 Christian Pierre MOMON * Copyright (C) 2013-2024 Christian Pierre MOMON
* *
* This file is part of Devinsy-utils. * This file is part of Devinsy-rss.
* *
* Devinsy-utils is free software: you can redistribute it and/or modify * Devinsy-rss 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-utils is distributed in the hope that it will be useful, * Devinsy-rss 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-utils. If not, see <http://www.gnu.org/licenses/> * along with Devinsy-rss. If not, see <http://www.gnu.org/licenses/>
*/ */
package fr.devinsy.util.rss; package fr.devinsy.rss;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -25,21 +25,24 @@ import java.io.OutputStream;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.io.Writer; import java.io.Writer;
import fr.devinsy.util.xml.XMLWriter; import fr.devinsy.xml.XMLWriter;
/** /**
* * The Class RSSWriter.
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/ */
public class RSSWriter public class RSSWriter
{ {
private XMLWriter out; private XMLWriter out;
/** /**
* Instantiates a new RSS writer.
* *
* @param file * @param file
* @throws FileNotFoundException * the file
* @throws UnsupportedEncodingException * @throws UnsupportedEncodingException
* the unsupported encoding exception
* @throws FileNotFoundException
* the file not found exception
*/ */
public RSSWriter(final File file) throws UnsupportedEncodingException, FileNotFoundException public RSSWriter(final File file) throws UnsupportedEncodingException, FileNotFoundException
{ {
@ -48,9 +51,12 @@ public class RSSWriter
} }
/** /**
* Instantiates a new RSS writer.
* *
* @param target * @param target
* the target
* @throws UnsupportedEncodingException * @throws UnsupportedEncodingException
* the unsupported encoding exception
*/ */
public RSSWriter(final OutputStream target) throws UnsupportedEncodingException public RSSWriter(final OutputStream target) throws UnsupportedEncodingException
{ {
@ -59,9 +65,12 @@ public class RSSWriter
} }
/** /**
* Instantiates a new RSS writer.
* *
* @param target * @param target
* the target
* @throws UnsupportedEncodingException * @throws UnsupportedEncodingException
* the unsupported encoding exception
*/ */
public RSSWriter(final Writer target) throws UnsupportedEncodingException public RSSWriter(final Writer target) throws UnsupportedEncodingException
{ {
@ -70,7 +79,10 @@ public class RSSWriter
} }
/** /**
* Close.
* *
* @throws IOException
* Signals that an I/O exception has occurred.
*/ */
public void close() throws IOException public void close() throws IOException
{ {
@ -83,7 +95,10 @@ public class RSSWriter
} }
/** /**
* Flush.
* *
* @throws IOException
* Signals that an I/O exception has occurred.
*/ */
public void flush() throws IOException public void flush() throws IOException
{ {
@ -94,7 +109,16 @@ public class RSSWriter
} }
/** /**
* Write channel.
* *
* @param title
* the title
* @param link
* the link
* @param description
* the description
* @param elements
* the elements
*/ */
public void writeChannel(final String title, final String link, final String description, final RSSElement... elements) public void writeChannel(final String title, final String link, final String description, final RSSElement... elements)
{ {
@ -117,8 +141,10 @@ public class RSSWriter
} }
/** /**
* Write comment.
* *
* @param comment * @param comment
* the comment
*/ */
public void writeComment(final String comment) public void writeComment(final String comment)
{ {
@ -126,7 +152,16 @@ public class RSSWriter
} }
/** /**
* Write item.
* *
* @param title
* the title
* @param link
* the link
* @param description
* the description
* @param elements
* the elements
*/ */
public void writeItem(final String title, final String link, final String description, final RSSElement... elements) public void writeItem(final String title, final String link, final String description, final RSSElement... elements)
{ {
@ -162,7 +197,7 @@ public class RSSWriter
} }
/** /**
* * Write RSS header.
*/ */
private void writeRSSHeader() private void writeRSSHeader()
{ {

View file

@ -0,0 +1,96 @@
/*
* Copyright (C) 2017-2024 Christian Pierre MOMON
*
* This file is part of Devinsy-rss.
*
* Devinsy-rss 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-rss 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-rss. If not, see <http://www.gnu.org/licenses/>
*/
package fr.devinsy.rss.demo;
import java.io.IOException;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.xml.stream.XMLStreamException;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import fr.devinsy.rss.RSSElement;
import fr.devinsy.rss.RSSWriter;
import fr.devinsy.strings.StringListWriter;
import fr.devinsy.xml.XMLBadFormatException;
import fr.devinsy.xml.XMLTools;
/**
* The Class RssDemo.
*/
public class RSSDemo
{
/**
* The main method.
*
* @param args
* the arguments
* @throws IOException
* Signals that an I/O exception has occurred.
* @throws XMLStreamException
* the XML stream exception
* @throws XMLBadFormatException
* the XML bad format exception
*/
public static void main(final String[] args) throws IOException, XMLStreamException, XMLBadFormatException
{
//
BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.ERROR);
// #1
{
System.out.println("========== DEMO #1;");
StringListWriter target = new StringListWriter();
RSSWriter out = new RSSWriter(target);
//
List<RSSElement> elements = new ArrayList<RSSElement>();
ZonedDateTime now = ZonedDateTime.now();
elements.add(new RSSElement("pubDate", now));
elements.add(new RSSElement("lastBuildDate", now));
elements.add(new RSSElement("generator", "Generated by Foo"));
//
out.writeChannel("my FEED_TITLE", "https://www.devinsy.fr/rss/news-en.rss", "my FEED_DESCRIPTION", elements.toArray(new RSSElement[0]));
//
elements.clear();
elements.add(new RSSElement("guid", "devinsy-news-000001", "isPermaLink", "false"));
elements.add(new RSSElement("pubDate", now));
elements.add(new RSSElement("author", "Christian P. MOMON <christian.momon@devinsy.fr>"));
elements.add(new RSSElement("category", "Announce"));
//
out.writeItem("First news", null, null, elements.toArray(new RSSElement[0]));
//
out.close();
//
System.out.println(target.toString());
System.out.println(XMLTools.indent(target.toString()));
}
}
}

View file

@ -1,256 +0,0 @@
/**
* 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);
}
}

View file

@ -1,181 +0,0 @@
/**
* 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());
}
}

View file

@ -1,370 +0,0 @@
/**
* 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);
}
}

View file

@ -1,124 +0,0 @@
/**
* 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);
}
}

View file

@ -1,128 +0,0 @@
/**
* 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);
}
}

View file

@ -1,76 +0,0 @@
/**
* 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();
}
}
}
}
}

View file

@ -1,452 +0,0 @@
/**
* 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);
}
}

View file

@ -1,162 +0,0 @@
/**
* 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;
}
}

View file

@ -1,635 +0,0 @@
/**
* 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;
}
}

View file

@ -1,188 +0,0 @@
/**
* 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);
}
}

View file

@ -1,241 +0,0 @@
/**
* 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);
}
}

View file

@ -1,133 +0,0 @@
/**
* 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);
}
}

View file

@ -1,164 +0,0 @@
/**
* 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);
}
}

View file

@ -1,47 +0,0 @@
/**
* 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);
}
}

View file

@ -1,319 +0,0 @@
/**
* 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;
}
}

View file

@ -1,500 +0,0 @@
/**
* 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);
}
}

View file

@ -1,65 +0,0 @@
/**
* 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);
}
}

View file

@ -1,196 +0,0 @@
/**
* 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;
}
}

View file

@ -1,146 +0,0 @@
/**
* Copyright (C) 2013-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.strings;
import java.util.Comparator;
/**
*
*/
public class StringLengthComparator implements Comparator<String>
{
private static StringLengthComparator instance;
/**
*
*/
@Override
public int compare(final String alpha, final String bravo)
{
int result;
//
Integer alphaValue;
if (alpha == null)
{
//
alphaValue = null;
}
else
{
//
alphaValue = alpha.length();
}
//
Integer bravoValue;
if (bravo == null)
{
//
bravoValue = null;
}
else
{
//
bravoValue = bravo.length();
}
//
result = compare(alphaValue, bravoValue);
//
return result;
}
/**
* This method compares two nullable string values.
*
* The comparison manages the local language alphabet order.
*
* <pre>
* compare(null, null) = 0
* compare(null, bravo) < 0
* compare(alpha, null) > 0
* compare(alpha, bravo) = alpha.compareTo(bravo)
* </pre>
*
* @param alpha
* one of the value.
*
* @param bravo
* the other value.
*
* @return zero or a positive value or a negative value.
*
*/
public static int compare(final Integer alpha, final Integer bravo)
{
int result;
//
if ((alpha == null) && (bravo == null))
{
//
result = 0;
}
else if (alpha == null)
{
//
result = -1;
}
else if (bravo == null)
{
//
result = +1;
}
else
{
//
result = alpha.compareTo(bravo);
}
//
return result;
}
/**
*
* @return
*/
public static StringLengthComparator instance()
{
StringLengthComparator result;
if (instance == null)
{
instance = new StringLengthComparator();
}
result = instance;
//
return result;
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,133 +0,0 @@
/**
* Copyright (C) 2014-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.strings;
import java.util.Iterator;
/**
*
*/
public class StringListCharIterator implements Iterator<Character>
{
private StringList source;
private StringListCharPosition currentPosition;
private StringListCharPosition nextPosition;
/**
*
*/
public StringListCharIterator(final StringList source)
{
super();
this.source = source;
this.nextPosition = new StringListCharPosition();
}
/**
*
*/
@Override
public boolean hasNext()
{
boolean result;
if (this.source == null)
{
result = false;
}
else
{
if (this.source.isOutOfBounds(this.nextPosition))
{
result = false;
}
else
{
result = true;
}
}
//
return result;
}
/**
*
*/
@Override
public Character next()
{
Character result;
if (this.source == null)
{
result = null;
}
else
{
if (hasNext())
{
result = this.source.charAt(this.nextPosition);
this.nextPosition.next();
if (this.source.isOutOfLine(this.nextPosition))
{
this.nextPosition.nextEndOfLine();
while ((!this.source.isOutOfList(this.nextPosition)) && (this.source.get(this.nextPosition.getStringIndex()) == null))
{
this.nextPosition.nextEndOfLine();
}
}
}
else
{
result = null;
}
}
//
return result;
}
/**
*
* @return
*/
public StringListCharPosition nextPosition()
{
StringListCharPosition result;
result = new StringListCharPosition(this.nextPosition);
//
return result;
}
/**
* Do nothing.
*/
@Override
public void remove()
{
// TODO or not TODO?
}
}

View file

@ -1,111 +0,0 @@
/**
* Copyright (C) 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.strings;
/**
* This class manages a char position in a StringList object.
*
* @author Christian P. Momon
*/
public class StringListCharPosition
{
private int charIndex;
private int stringIndex;
private int localCharIndex;
/**
*
* @param index
* @param stringIndex
* @param localIndex
*/
public StringListCharPosition()
{
this.charIndex = 0;
this.stringIndex = 0;
this.localCharIndex = 0;
}
/**
*
* @param index
* @param stringIndex
* @param localIndex
*/
public StringListCharPosition(final int index, final int stringIndex, final int localIndex)
{
this.charIndex = index;
this.stringIndex = stringIndex;
this.localCharIndex = localIndex;
}
/**
*
* @param source
*/
public StringListCharPosition(final StringListCharPosition source)
{
this.charIndex = source.getCharIndex();
this.stringIndex = source.getStringIndex();
this.localCharIndex = source.getLocalCharIndex();
}
public int getCharIndex()
{
return this.charIndex;
}
public int getLocalCharIndex()
{
return this.localCharIndex;
}
public int getStringIndex()
{
return this.stringIndex;
}
public void next()
{
this.charIndex += 1;
this.localCharIndex += 1;
}
public void nextEndOfLine()
{
this.localCharIndex = 0;
this.stringIndex += 1;
}
public void setCharIndex(final int charIndex)
{
this.charIndex = charIndex;
}
public void setLocalCharIndex(final int localCharIndex)
{
this.localCharIndex = localCharIndex;
}
public void setStringIndex(final int stringIndex)
{
this.stringIndex = stringIndex;
}
}

View file

@ -1,130 +0,0 @@
/**
* Copyright (C) 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.strings;
import java.io.IOException;
import java.io.InputStream;
/**
* TODO CREATION STEP.
*/
public class StringListInputStream extends InputStream
{
private StringList in;
/**
*
*/
public StringListInputStream()
{
this.in = new StringList();
}
/**
*
*/
public StringListInputStream(final int size)
{
this.in = new StringList(size);
}
/**
*
*/
public StringListInputStream(final StringList source)
{
if (source == null)
{
throw new NullPointerException("source is null.");
}
else
{
this.in = source;
}
}
/**
* {@inheritDoc}
*/
@Override
public int available() throws IOException
{
return 0;
}
/**
* {@inheritDoc}
*/
@Override
public void close() throws IOException
{
}
/**
* {@inheritDoc}
*/
@Override
public synchronized void mark(final int readlimit)
{
// TODO
}
/**
* {@inheritDoc}
*/
@Override
public boolean markSupported()
{
boolean result;
result = true;
return result;
}
/**
* {@inheritDoc}
*/
@Override
public int read() throws IOException
{
// TODO Auto-generated method stub
return 0;
}
/**
* {@inheritDoc}
*/
@Override
public synchronized void reset() throws IOException
{
// TODO
throw new IOException("mark/reset not supported");
}
/**
* {@inheritDoc}
*/
@Override
public long skip(final long n) throws IOException
{
// TODO
return 0;
}
}

View file

@ -1,122 +0,0 @@
/**
* Copyright (C) 2013-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.strings;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class StringListReader extends Reader
{
private StringList in;
private StringListCharIterator iterator;
/**
*
* @param in
*/
public StringListReader(final StringList in)
{
this.in = in;
this.iterator = new StringListCharIterator(in);
}
/**
*
*/
@Override
public void close()
{
}
/**
*
*/
@Override
public synchronized int read(final char[] cbuf, final int off, final int len) throws IOException
{
int result;
BufferedReader a;
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

View file

@ -1,148 +0,0 @@
/**
* Copyright (C) 2013-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.strings;
import java.io.IOException;
import java.io.Writer;
/**
*
*/
public class StringListWriter extends Writer
{
private StringList out;
/**
*
*/
public StringListWriter()
{
this.out = new StringList();
}
/**
*
*/
public StringListWriter(final int initialCapacity)
{
this.out = new StringList(initialCapacity);
}
/**
*
*/
public StringListWriter(final StringList target)
{
if (target == null)
{
throw new NullPointerException("target is null.");
}
else
{
this.out = target;
}
}
/*
*
*/
@Override
public void close() throws IOException
{
}
/*
*
*/
@Override
public void flush() throws IOException
{
}
/*
*
*/
@Override
public String toString()
{
String result;
result = this.out.toString();
//
return result;
}
/**
*
* @return
*/
public StringList toStringList()
{
StringList result;
result = this.out;
//
return result;
}
/*
*
*/
public void write(final char c) throws IOException
{
this.out.append(c);
}
/*
*
*/
@Override
public void write(final char[] cbuf, final int off, final int len) throws IOException
{
char[] target;
if ((off == 0) && (cbuf.length == len))
{
target = cbuf;
}
else
{
target = new char[len];
for (int index = off; index < len; index++)
{
target[index] = cbuf[index];
}
}
//
this.out.append(new String(target));
}
/*
*
*/
@Override
public void write(final String string) throws IOException
{
this.out.append(string);
}
}

View file

@ -1,411 +0,0 @@
/**
* Copyright (C) 2014-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.strings;
import java.util.Collection;
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. The goal is to make easier the
* use of set of strings.
*/
public class StringSet extends HashSet<String>
{
private static final long serialVersionUID = 6674838743930005326L;
/**
*
*/
public StringSet()
{
super();
}
/**
* Constructs a list of string of the specified collection, in the order
* they are returned by the collection's iterator.
*
* @param source
*/
public StringSet(final Collection<String> source)
{
super(source.size());
if (source != null)
{
//
for (String string : source)
{
this.add(string);
}
}
}
/**
*
*/
public StringSet(final int initialCapacity)
{
super(initialCapacity);
}
/**
*
*/
public StringSet(final String[] source)
{
super();
if (source != null)
{
//
for (String string : source)
{
this.add(string);
}
}
}
/**
*
*/
public StringSet(final StringSet source)
{
super();
if (source != null)
{
//
for (String string : source)
{
this.add(string);
}
}
}
/**
* Check null parameter before add.
*/
@Override
public boolean add(final String string)
{
boolean result;
if (string != null)
{
//
result = super.add(string);
}
else
{
//
result = false;
}
//
return result;
}
/**
*
*/
public StringSet add(final StringSet strings)
{
StringSet result;
if (strings != null)
{
for (String string : strings)
{
this.add(string);
}
}
result = this;
//
return result;
}
/**
* Deep copy and shallow copy have no sense about a list of immutable
* objects.
*
* @return
*/
@Override
public StringSet clone()
{
StringSet result;
result = new StringSet(size());
for (String string : this)
{
result.add(string);
}
//
return result;
}
/**
*
*/
public int length()
{
int result = 0;
for (String string : this)
{
result += string.length();
}
//
return result;
}
/**
*
*/
public StringSet merge()
{
StringSet result;
StringBuffer buffer = new StringBuffer(length());
for (String string : this)
{
buffer.append(string);
}
String merge = buffer.toString();
clear();
add(merge);
//
result = this;
return result;
}
/**
*
*/
public StringSet put(final char character)
{
StringSet result;
this.add(String.valueOf(character));
result = this;
//
return result;
}
/**
*
*/
public StringSet put(final double value)
{
StringSet result;
result = this.put(String.valueOf(value));
//
return result;
}
/**
*
*/
public StringSet put(final int value)
{
StringSet result;
result = this.put(String.valueOf(value));
//
return result;
}
/**
*
*/
public StringSet put(final long value)
{
StringSet result;
result = this.put(String.valueOf(value));
//
return result;
}
/**
*
*/
public StringSet put(final Object value)
{
StringSet result;
if (value != null)
{
this.put(value.toString());
}
result = this;
//
return result;
}
/**
* Check null parameter before add.
*/
public StringSet put(final String string)
{
StringSet result;
if (string != null)
{
this.add(string);
}
result = this;
//
return result;
}
/**
*
*/
public StringSet put(final String... strings)
{
StringSet result;
if (strings != null)
{
for (String string : strings)
{
this.put(string);
}
}
result = this;
//
return result;
}
/**
*
*/
public StringSet put(final StringList strings)
{
StringSet result;
if (strings != null)
{
for (String string : strings)
{
this.put(string);
}
}
result = this;
//
return result;
}
/**
*
*/
public StringSet put(final StringSet strings)
{
StringSet result;
if (strings != null)
{
for (String string : strings)
{
this.put(string);
}
}
result = this;
//
return result;
}
/**
*
*/
public StringSet putNullable(final Object value)
{
StringSet result;
if (value == null)
{
super.add((String) null);
}
else
{
this.put(value.toString());
}
result = this;
//
return result;
}
/**
*
*/
@Override
public String toString()
{
String result;
result = toStringList().toStringWithCommas();
//
return result;
}
/**
*
* @return
*/
public StringList toStringList()
{
StringList result;
result = new StringList(this);
//
return result;
}
}

View file

@ -1,134 +0,0 @@
/**
* 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;
}
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,200 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,102 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,186 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,105 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,223 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,233 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,597 +0,0 @@
/**
* 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();
}
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,355 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,179 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,216 +0,0 @@
/**
* 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;
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,216 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,113 +0,0 @@
/**
* 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);
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,424 +0,0 @@
/**
* 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() + ".");
}
}
}
// ////////////////////////////////////////////////////////////////////////

View file

@ -1,160 +0,0 @@
/**
* 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;
}
}

View file

@ -1,81 +0,0 @@
/**
* 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);
}
}

View file

@ -1,617 +0,0 @@
/**
* 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");
}
}
}
}

View file

@ -1,148 +0,0 @@
/**
* 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;
}
}

View file

@ -1,389 +0,0 @@
/**
* 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("&nbsp;", "&#160;");
}
//
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;
}
}

View file

@ -1,315 +0,0 @@
/**
* 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("&lt;");
break;
case '>':
this.out.print("&gt;");
break;
case '&':
this.out.print("&amp;");
break;
case '"':
this.out.print("&quot;");
break;
case '\'':
this.out.print("&apos;");
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(" ?>");
}
}

View file

@ -1,68 +0,0 @@
/**
* 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");
}
}

View file

@ -1,149 +0,0 @@
/**
* 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")));
}
}
}

View file

@ -1,316 +0,0 @@
/*
* 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>
* &plusmn;YYYY-MM-DDThh:mm:ss.SSSTZD
* </pre>
* where:
* <pre>
* &plusmn;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);
}
}

View file

@ -1 +0,0 @@
Extract from jackrabbit-2.1.1-src.zip

View file

@ -1,111 +0,0 @@
/**
* 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());
}
}
}

View file

@ -1,19 +0,0 @@
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.");
}
}

View file

@ -1 +0,0 @@
test sioux

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 869 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 853 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 798 KiB

View file

@ -1 +0,0 @@
azertyuiop

View file

@ -1 +0,0 @@
good weather today

Some files were not shown because too many files have changed in this diff Show more