initial commit
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 7 Apr 2013 12:04:25 +0000 (15:04 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sun, 7 Apr 2013 12:04:25 +0000 (15:04 +0300)
38 files changed:
.classpath [new file with mode: 0755]
.gitignore [new file with mode: 0755]
.project [new file with mode: 0755]
.settings/org.eclipse.core.resources.prefs [new file with mode: 0755]
.settings/org.eclipse.jdt.core.prefs [new file with mode: 0755]
.settings/org.eclipse.jdt.ui.prefs [new file with mode: 0755]
.settings/org.eclipse.m2e.core.prefs [new file with mode: 0755]
COPYING [new file with mode: 0755]
doc/index.html [new file with mode: 0755]
doc/usage.html [new file with mode: 0644]
pom.xml [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/CLIHelper.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Argument.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parameter.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parser.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingDirectory.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingFile.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/IntegerArgument.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingDirectory.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingFile.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/StringArgument.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/data/BitInputStream.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/data/BitOutputStream.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/data/EnhancedDataInputStream.java [new file with mode: 0644]
src/main/java/eu/svjatoslav/commons/data/EnhancedDataOutputStream.java [new file with mode: 0644]
src/main/java/eu/svjatoslav/commons/file/CommonPathResolver.java [new file with mode: 0644]
src/main/java/eu/svjatoslav/commons/file/FilePathParser.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/file/IOHelper.java [new file with mode: 0644]
src/main/java/eu/svjatoslav/commons/gui/dialog/ExceptionDialog.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/network/UrlParamEncoder.java [new file with mode: 0755]
src/main/java/eu/svjatoslav/commons/string/CuttableString.java [new file with mode: 0644]
src/main/java/eu/svjatoslav/commons/string/WildCardMatcher.java [new file with mode: 0755]
src/test/java/eu/svjatoslav/commons/commandline/parameterparser/ParserTest.java [new file with mode: 0755]
src/test/java/eu/svjatoslav/commons/file/CommonPathResolverTest.java [new file with mode: 0644]
src/test/java/eu/svjatoslav/commons/file/IOHelperTest.java [new file with mode: 0644]
src/test/java/eu/svjatoslav/commons/network/UrlParamEncoderTest.java [new file with mode: 0755]
src/test/java/eu/svjatoslav/commons/string/CuttableStringTest.java [new file with mode: 0644]
src/test/java/eu/svjatoslav/commons/string/WildCardMatcherTest.java [new file with mode: 0755]

diff --git a/.classpath b/.classpath
new file mode 100755 (executable)
index 0000000..921c731
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="src" output="target/classes" path="src/main/java">
+               <attributes>
+                       <attribute name="optional" value="true"/>
+                       <attribute name="maven.pomderived" value="true"/>
+               </attributes>
+       </classpathentry>
+       <classpathentry kind="src" output="target/test-classes" path="src/test/java">
+               <attributes>
+                       <attribute name="optional" value="true"/>
+                       <attribute name="maven.pomderived" value="true"/>
+               </attributes>
+       </classpathentry>
+       <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+               <attributes>
+                       <attribute name="maven.pomderived" value="true"/>
+               </attributes>
+       </classpathentry>
+       <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+               <attributes>
+                       <attribute name="maven.pomderived" value="true"/>
+               </attributes>
+       </classpathentry>
+       <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/.gitignore b/.gitignore
new file mode 100755 (executable)
index 0000000..2f7896d
--- /dev/null
@@ -0,0 +1 @@
+target/
diff --git a/.project b/.project
new file mode 100755 (executable)
index 0000000..235c20b
--- /dev/null
+++ b/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>svjatoslav_commons</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100755 (executable)
index 0000000..29fdc79
--- /dev/null
@@ -0,0 +1,4 @@
+#Fri Feb 10 21:00:42 EET 2012
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/test/java=UTF-8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100755 (executable)
index 0000000..60105c1
--- /dev/null
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
new file mode 100755 (executable)
index 0000000..fe89f28
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+formatter_settings_version=12
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100755 (executable)
index 0000000..a161924
--- /dev/null
@@ -0,0 +1,5 @@
+#Sat Feb 25 12:11:37 EET 2012
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=false
+version=1
diff --git a/COPYING b/COPYING
new file mode 100755 (executable)
index 0000000..10828e0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,341 @@
+
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/doc/index.html b/doc/index.html
new file mode 100755 (executable)
index 0000000..2df150c
--- /dev/null
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta
+    http-equiv="Content-Type"
+    content="text/html; charset=UTF-8">
+<title>Svjatoslav Commons</title>
+</head>
+<body>
+    <h1>Svjatoslav Commons - Java library of commonly used functions</h1>
+    <a href="http://www2.svjatoslav.eu/gitweb/?p=svjatoslav_commons.git;a=snapshot;h=HEAD;sf=tgz">Download</a>
+    &nbsp;&nbsp;
+    <a href="http://www2.svjatoslav.eu/gitbrowse/svjatoslav_commons/doc/index.html">Online homepage</a>
+    &nbsp;&nbsp;
+    <a href="http://svjatoslav.eu/programs.jsp">Other applications hosted on svjatoslav.eu</a>
+    <pre>
+<b>Library author:</b>
+    Svjatoslav Agejenko
+    Homepage: <a href="http://svjatoslav.eu">http://svjatoslav.eu</a>
+    Email: <a href="mailto:svjatoslav@svjatoslav.eu">svjatoslav@svjatoslav.eu</a>
+
+This software is distributed under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU GENERAL PUBLIC LICENSE Version 2</a>.
+
+
+Library contains:
+    * Wildcards matcher.
+        (?, *)
+        
+    * Commandline arguments parsing, validating, help generating library. 
+   
+    * File path parser.
+   
+    * Graphical error dialog.
+    
+        Reusable graphical dialog to capture and show program exceptions
+        and associated program call stack traceback.
+
+    * Primitive URL parameters encoder / decoder.
+
+<a href="usage.html">Instructions to embed svjatoslav-commons in your project as a library.</a>  
+
+</pre>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/usage.html b/doc/usage.html
new file mode 100644 (file)
index 0000000..13ce480
--- /dev/null
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Insert title here</title>
+</head>
+<body>
+
+
+Maven pom.xml file snippet:
+
+<table border="1px">
+<tr><td>
+<pre>
+    &lt;dependencies&gt;
+
+        ...
+        
+        &lt;dependency&gt;
+            &lt;groupId&gt;eu.svjatoslav&lt;/groupId&gt;
+            &lt;artifactId&gt;svjatoslavcommons&lt;/artifactId&gt;
+            &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
+        &lt;/dependency&gt;
+
+        ...
+
+    &lt;/dependencies&gt;
+
+    &lt;repositories&gt;
+    
+        ...
+    
+        &lt;repository&gt;
+            &lt;id&gt;svjatoslav.eu&lt;/id&gt;
+            &lt;name&gt;Svjatoslav repository&lt;/name&gt;
+            &lt;url&gt;http://www2.svjatoslav.eu/maven/&lt;/url&gt;
+        &lt;/repository&gt;
+        
+        ...
+        
+    &lt;/repositories&gt;
+</pre>
+</td></tr>
+</table>
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100755 (executable)
index 0000000..75b55b1
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,95 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <groupId>eu.svjatoslav</groupId>
+       <artifactId>svjatoslavcommons</artifactId>
+       <version>1.0-SNAPSHOT</version>
+       <packaging>jar</packaging>
+       <name>Svjatoslav commonly used resources library</name>
+       <description>Svjatoslav commonly used resources library</description>
+
+       <organization>
+               <name>svjatoslav.eu</name>
+               <url>http://svjatoslav.eu</url>
+       </organization>
+
+
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-compiler-plugin</artifactId>
+                               <version>2.3.2</version>
+                               <configuration>
+                                       <source>1.6</source>
+                                       <target>1.6</target>
+                                       <optimize>true</optimize>
+                                       <encoding>UTF-8</encoding>
+                               </configuration>
+                       </plugin>
+
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-source-plugin</artifactId>
+                               <version>2.2.1</version>
+                               <executions>
+                                       <execution>
+                                               <id>attach-sources</id>
+                                               <goals>
+                                                       <goal>jar</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-javadoc-plugin</artifactId>
+                               <version>2.9</version>
+                               <executions>
+                                       <execution>
+                                               <id>attach-javadocs</id>
+                                               <goals>
+                                                       <goal>jar</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+               </plugins>
+
+               <extensions>
+                       <extension>
+                               <groupId>org.apache.maven.wagon</groupId>
+                               <artifactId>wagon-ssh</artifactId>
+                               <version>2.2</version>
+                       </extension>
+               </extensions>
+       </build>
+
+       <dependencies>
+               <dependency>
+                       <groupId>junit</groupId>
+                       <artifactId>junit</artifactId>
+                       <version>4.8.1</version>
+                       <scope>test</scope>
+               </dependency>
+       </dependencies>
+
+       <distributionManagement>
+               <snapshotRepository>
+                       <id>svjatoslav.eu</id>
+                       <name>svjatoslav.eu</name>
+                       <url>scp://svjatoslav.eu:7022/var/www/maven</url>
+               </snapshotRepository>
+               <repository>
+                       <id>svjatoslav.eu</id>
+                       <name>svjatoslav.eu</name>
+                       <url>scp://svjatoslav.eu:7022/var/www/maven</url>               
+               </repository>
+       </distributionManagement>
+
+       <scm>
+               <connection>scm:git:ssh://git@svjatoslav.eu:7022/home/git/repositories/svjatoslav_commons.git</connection>
+               <developerConnection>scm:git:ssh://git@svjatoslav.eu:7022/home/git/repositories/svjatoslav_commons.git</developerConnection>
+       </scm>
+
+</project>
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/CLIHelper.java b/src/main/java/eu/svjatoslav/commons/commandline/CLIHelper.java
new file mode 100755 (executable)
index 0000000..a232246
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * Command-line interface helper.
+ */
+public class CLIHelper {
+
+       /**
+        * Ask boolean value from user on command-line.
+        */
+       public static boolean askBoolean(final String prompt) {
+
+               final BufferedReader br = new BufferedReader(new InputStreamReader(
+                               System.in));
+
+               while (true)
+                       try {
+                               System.out.print(prompt);
+
+                               final String userInput = br.readLine().toLowerCase();
+
+                               if ("y".equals(userInput) || "yes".equals(userInput)
+                                               || "true".equals(userInput))
+                                       return true;
+
+                               if ("n".equals(userInput) || "no".equals(userInput)
+                                               || "false".equals(userInput))
+                                       return false;
+
+                               System.out
+                                               .println("Invalid input. You shall enter y/yes/true or n/no/false.");
+                       } catch (final IOException ioe) {
+                               ioe.printStackTrace();
+                       }
+       }
+
+       /**
+        * Ask numerical long value from user on command-line.
+        */
+       public static long askLong(final String prompt) {
+
+               final BufferedReader br = new BufferedReader(new InputStreamReader(
+                               System.in));
+
+               while (true) {
+                       System.out.print(prompt);
+
+                       try {
+                               final String userInput = br.readLine();
+
+                               try {
+                                       final long result = Long.parseLong(userInput);
+                                       return result;
+                               } catch (final NumberFormatException e) {
+                                       System.out.println("\nError: You shall enter an integer.");
+                               }
+                       } catch (final IOException ioe) {
+                               ioe.printStackTrace();
+                       }
+
+               }
+       }
+
+       /**
+        * Ask string value from user on command-line.
+        */
+       public static String askString(final String prompt) {
+
+               final BufferedReader br = new BufferedReader(new InputStreamReader(
+                               System.in));
+
+               while (true) {
+                       System.out.print(prompt);
+
+                       try {
+                               final String userInput = br.readLine();
+
+                               return userInput;
+                       } catch (final IOException ioe) {
+                               ioe.printStackTrace();
+                       }
+
+               }
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Argument.java b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Argument.java
new file mode 100755 (executable)
index 0000000..d969f16
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser;
+
+public interface Argument {
+
+       /**
+        * @return Single line argument type description.
+        */
+       public String describeFormat();
+
+       /**
+        * @return <code>true</code> if value is correct, <code>false</code>
+        *         otherwise.
+        */
+       public boolean validate(String value);
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parameter.java b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parameter.java
new file mode 100755 (executable)
index 0000000..1575fcf
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Parameter {
+
+       /**
+        * Indicates that at least one argument is mandatory for this parameter.
+        */
+       private final boolean mandatory;
+
+       private final boolean enableArguments;
+
+       private final boolean enableMultipleArguments;
+
+       private final Argument argumentType;
+
+       private final ArrayList<String> aliases;
+
+       private final String description;
+
+       private final ArrayList<String> arguments = new ArrayList<String>();
+
+       /**
+        * If this parameter was present in the commandline, then this boolean will
+        * be set to <code>true</code>.
+        */
+       private boolean parameterSpecified;
+
+       public Parameter(final boolean mandatory, final boolean enableArguments,
+                       final boolean enableMultipleArguments, final Argument argumentType,
+                       final String description, final String... aliases) {
+
+               this.mandatory = mandatory;
+               this.enableArguments = enableArguments;
+               this.enableMultipleArguments = enableMultipleArguments;
+               this.argumentType = argumentType;
+               this.description = description;
+
+               // save aliases
+               {
+                       final ArrayList<String> aliasesList = new ArrayList<String>();
+                       for (final String alias : aliases) {
+                               aliasesList.add(alias);
+                       }
+                       this.aliases = aliasesList;
+               }
+
+       }
+
+       public Parameter(final String description, final String... aliases) {
+               this(false, false, false, null, description, aliases);
+       }
+
+       /**
+        * @return <code>true</code> if no errors were found. <code>false</code>
+        *         otherwise.
+        */
+       public boolean addArgument(final String argumentString) {
+               // check if arguments are allowed for this parameter
+               if (!enableArguments) {
+                       System.out
+                                       .println("Error! No arguments are allowed for parameters: "
+                                                       + getAliases());
+                       return false;
+               }
+
+               // check if multiple arguments are allowed
+               if ((arguments.size() > 0) && (!enableMultipleArguments)) {
+                       System.out
+                                       .println("Error! Only single argument is allowed for parameters: "
+                                                       + getAliases());
+                       return false;
+               }
+
+               if (!argumentType.validate(argumentString)) {
+
+                       System.out.println("Error! Invalid argument \"" + argumentString
+                                       + "\". It shall be " + argumentType.describeFormat() + ".");
+                       return false;
+
+               }
+
+               arguments.add(argumentString);
+
+               return true;
+       }
+
+       public String getAliases() {
+               final StringBuffer buffer = new StringBuffer();
+
+               for (final String alias : aliases) {
+
+                       if (buffer.length() > 0)
+                               buffer.append(", ");
+
+                       buffer.append(alias);
+               }
+
+               return buffer.toString();
+       }
+
+       public File getArgumentAsFile() {
+               if (arguments.size() != 1) {
+                       throw new RuntimeException("Parameter " + description
+                                       + " shall have exactly 1 argument.");
+               }
+               return new File(arguments.get(0));
+       }
+
+       public int getArgumentAsInteger() {
+               if (arguments.size() != 1) {
+                       throw new RuntimeException("Parameter " + description
+                                       + " shall have exactly 1 argument.");
+               }
+               return Integer.parseInt(arguments.get(0));
+       }
+
+       public String getArgumentAsString() {
+               if (arguments.size() != 1) {
+                       throw new RuntimeException("Parameter " + description
+                                       + " shall have exactly 1 argument.");
+               }
+               return arguments.get(0);
+       }
+
+       public List<File> getArgumentsAsFiles() {
+               final ArrayList<File> result = new ArrayList<File>();
+
+               for (final String argument : arguments) {
+                       final File file = new File(argument);
+                       result.add(file);
+               }
+
+               return result;
+       }
+
+       public List<Integer> getArgumentsAsIntegers() {
+               final ArrayList<Integer> result = new ArrayList<Integer>();
+
+               for (final String argument : arguments) {
+                       result.add(Integer.valueOf(argument));
+               }
+
+               return result;
+       }
+
+       public List<String> getArgumentsAsStrings() {
+               final ArrayList<String> result = new ArrayList<String>(arguments);
+               return result;
+       }
+
+       public String getHelp() {
+               final StringBuffer buffer = new StringBuffer();
+
+               // first line
+               buffer.append(getAliases());
+               if (enableArguments) {
+                       buffer.append(" (" + argumentType.describeFormat() + ")");
+
+                       if (enableMultipleArguments) {
+                               buffer.append("...");
+                       }
+               }
+               buffer.append("\n");
+
+               // second line
+               buffer.append("    " + description + "\n");
+
+               return buffer.toString();
+       }
+
+       public boolean isMandatory() {
+               return mandatory;
+       }
+
+       /**
+        * @return the parameterSpecified
+        */
+       public boolean isParameterSpecified() {
+               return parameterSpecified;
+       }
+
+       /**
+        * @return <code>true</code> if given alias is registered for this
+        *         parameter.
+        */
+       public boolean matchesAlias(final String alias) {
+               if (aliases.contains(alias))
+                       return true;
+
+               return false;
+       }
+
+       /**
+        * Notifies this parameter that no more arguments will follow. This gives
+        * parameter chance to verify if this is ok.
+        * 
+        * @return <code>true</code> if no errors were found. <code>false</code>
+        *         otherwise.
+        */
+       public boolean noMoreArguments() {
+
+               if (enableArguments && (arguments.isEmpty())) {
+
+                       System.out.println("Error! " + getAliases()
+                                       + " require at least one following argument.");
+
+                       return false;
+               }
+               return true;
+       }
+
+       /**
+        * @param parameterSpecified
+        *            the parameterSpecified to set
+        */
+       public void setParameterSpecified(final boolean parameterSpecified) {
+               this.parameterSpecified = parameterSpecified;
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parser.java b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parser.java
new file mode 100755 (executable)
index 0000000..d2f623f
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser;
+
+import java.util.ArrayList;
+
+/**
+ * <pre>
+ * Single commandline parameter can have any amount of arguments.
+ * </pre>
+ */
+public class Parser {
+
+       private final ArrayList<Parameter> parameters = new ArrayList<Parameter>();
+
+       public void addParameter(final Parameter parameter) {
+               parameters.add(parameter);
+       }
+
+       /**
+        * Return parameter by given alias or <code>null</code> if no parameter
+        * exists for given alias.
+        */
+       public Parameter getParameterByAlias(final String alias) {
+
+               for (final Parameter parameter : parameters) {
+                       if (parameter.matchesAlias(alias))
+                               return parameter;
+               }
+
+               return null;
+       }
+
+       /**
+        * @return <code>true</code> if no errors were found. <code>false</code>
+        *         otherwise.
+        */
+       public boolean parse(final String[] args) {
+
+               Parameter currentParameter = null;
+
+               for (final String argument : args) {
+
+                       final Parameter parameterForAlias = getParameterByAlias(argument);
+                       if (parameterForAlias == null) {
+                               if (currentParameter == null) {
+                                       System.out.println("Unknown commandline parameter: "
+                                                       + argument);
+                                       return false;
+                               }
+
+                               if (!currentParameter.addArgument(argument))
+                                       return false;
+
+                       } else {
+                               if (currentParameter != null) {
+                                       if (!currentParameter.noMoreArguments())
+                                               return false;
+                               }
+
+                               parameterForAlias.setParameterSpecified(true);
+                               currentParameter = parameterForAlias;
+                       }
+
+               }
+
+               // check if any mandatory parameters are missing
+
+               for (final Parameter parameter : parameters) {
+                       if (parameter.isMandatory() && (!parameter.isParameterSpecified())) {
+                               System.out.println("Error! Mandatory parameter ("
+                                               + parameter.getAliases() + ") is not specified.");
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
+       public void showHelp() {
+               for (final Parameter parameter : parameters) {
+                       System.out.println(parameter.getHelp());
+               }
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingDirectory.java b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingDirectory.java
new file mode 100755 (executable)
index 0000000..25c521d
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser.arguments;
+
+import java.io.File;
+
+import eu.svjatoslav.commons.commandline.parameterparser.Argument;
+
+public class ExistingDirectory implements Argument {
+
+       @Override
+       public java.lang.String describeFormat() {
+               return "existing directory";
+       }
+
+       @Override
+       public boolean validate(final java.lang.String value) {
+               final File file2 = new File(value);
+               if (file2.exists() && file2.isDirectory())
+                       return true;
+               return false;
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingFile.java b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingFile.java
new file mode 100755 (executable)
index 0000000..d46f05d
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser.arguments;
+
+import java.io.File;
+
+import eu.svjatoslav.commons.commandline.parameterparser.Argument;
+
+public class ExistingFile implements Argument {
+
+       @Override
+       public java.lang.String describeFormat() {
+               return "existing file";
+       }
+
+       @Override
+       public boolean validate(final java.lang.String value) {
+               final File file = new File(value);
+               if (file.exists() && file.isFile())
+                       return true;
+               return false;
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/IntegerArgument.java b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/IntegerArgument.java
new file mode 100755 (executable)
index 0000000..50f1ece
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser.arguments;
+
+import eu.svjatoslav.commons.commandline.parameterparser.Argument;
+
+public class IntegerArgument implements Argument {
+
+       @Override
+       public java.lang.String describeFormat() {
+               return "integer";
+       }
+
+       @Override
+       public boolean validate(final java.lang.String value) {
+               try {
+                       java.lang.Integer.valueOf(value);
+                       return true;
+               } catch (final NumberFormatException e) {
+                       return false;
+               }
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingDirectory.java b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingDirectory.java
new file mode 100755 (executable)
index 0000000..3190e9d
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser.arguments;
+
+import java.io.File;
+
+import eu.svjatoslav.commons.commandline.parameterparser.Argument;
+
+public class NonExistingDirectory implements Argument {
+
+       @Override
+       public java.lang.String describeFormat() {
+               return "non existing directory";
+       }
+
+       @Override
+       public boolean validate(final java.lang.String value) {
+               final File file4 = new File(value);
+               if (!file4.exists())
+                       return true;
+               return false;
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingFile.java b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingFile.java
new file mode 100755 (executable)
index 0000000..1f68bf8
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser.arguments;
+
+import java.io.File;
+
+import eu.svjatoslav.commons.commandline.parameterparser.Argument;
+
+public class NonExistingFile implements Argument {
+
+       @Override
+       public java.lang.String describeFormat() {
+               return "non existing file";
+       }
+
+       @Override
+       public boolean validate(final java.lang.String value) {
+               final File file3 = new File(value);
+               if (!file3.exists())
+                       return true;
+               return false;
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/StringArgument.java b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/StringArgument.java
new file mode 100755 (executable)
index 0000000..0da8cb7
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser.arguments;
+
+import eu.svjatoslav.commons.commandline.parameterparser.Argument;
+
+public class StringArgument implements Argument {
+
+       @Override
+       public java.lang.String describeFormat() {
+               return "string";
+       }
+
+       @Override
+       public boolean validate(final java.lang.String value) {
+               return true;
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/data/BitInputStream.java b/src/main/java/eu/svjatoslav/commons/data/BitInputStream.java
new file mode 100755 (executable)
index 0000000..3ecff98
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.data;
+
+/**
+ * Read individual bits from the input stream.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class BitInputStream {
+
+       int currentByte;
+       int currentBytePointer = -1;
+
+       InputStream inputStream;
+
+       public BitInputStream(final InputStream inputStream) {
+               this.inputStream = inputStream;
+       }
+
+       public int readBits(final int bitCount) throws IOException {
+
+               int readableByte = 0;
+               for (int i = 0; i < bitCount; i++) {
+
+                       readableByte = readableByte << 1;
+
+                       if (currentBytePointer == -1) {
+                               currentBytePointer = 7;
+                               currentByte = inputStream.read();
+                       }
+
+                       int mask = 1;
+                       mask = mask << currentBytePointer;
+
+                       final int currentBit = currentByte & mask;
+
+                       if (currentBit != 0) {
+                               readableByte = readableByte | 1;
+                       }
+
+                       currentBytePointer--;
+               }
+               return readableByte;
+       }
+
+       public int readIntegerCompressed8() throws IOException {
+               if (readBits(1) == 0) {
+                       return readBits(8);
+               } else {
+                       return readBits(32);
+               }
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/data/BitOutputStream.java b/src/main/java/eu/svjatoslav/commons/data/BitOutputStream.java
new file mode 100755 (executable)
index 0000000..6348d0a
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.data;
+
+/**
+ * Write individual bits to the output stream.
+ */
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class BitOutputStream {
+
+       int currentByte;
+       int currentBytePointer;
+
+       OutputStream outputStream;
+
+       public BitOutputStream(final OutputStream outputStream) {
+               currentByte = 0;
+               currentBytePointer = 0;
+               this.outputStream = outputStream;
+       };
+
+       public void finishByte() throws IOException {
+               if (currentBytePointer != 0) {
+                       outputStream.write(currentByte);
+                       currentBytePointer = 0;
+               }
+       }
+
+       public void storeBits(final int data, final int bitCount)
+                       throws IOException {
+               for (int i = bitCount - 1; i >= 0; i--) {
+
+                       int mask = 1;
+                       mask = mask << i;
+
+                       final int currentBit = data & mask;
+                       currentByte = currentByte << 1;
+
+                       if (currentBit != 0) {
+                               currentByte = currentByte | 1;
+                       }
+                       currentBytePointer++;
+
+                       if (currentBytePointer == 8) {
+                               currentBytePointer = 0;
+                               outputStream.write(currentByte);
+                               currentByte = 0;
+                       }
+               }
+       }
+
+       public void storeIntegerCompressed8(final int data) throws IOException {
+               if (data < 256) {
+                       storeBits(0, 1);
+                       storeBits(data, 8);
+               } else {
+                       storeBits(1, 1);
+                       storeBits(data, 32);
+               }
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/data/EnhancedDataInputStream.java b/src/main/java/eu/svjatoslav/commons/data/EnhancedDataInputStream.java
new file mode 100644 (file)
index 0000000..4adc080
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.data;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class EnhancedDataInputStream extends DataInputStream {
+
+       public EnhancedDataInputStream(final InputStream in) {
+               super(in);
+       }
+
+       public List<Integer> readIntegerList() throws IOException {
+               final int length = readInt();
+
+               final List<Integer> result = new ArrayList<Integer>();
+
+               for (int i = 0; i < length; i++)
+                       result.add(readInt());
+
+               return result;
+       }
+
+       public String readString() throws IOException {
+
+               final int length = readInt();
+               if (length == -1)
+                       return null;
+
+               final byte[] bytes = new byte[length];
+               readFully(bytes);
+
+               return new String(bytes);
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/data/EnhancedDataOutputStream.java b/src/main/java/eu/svjatoslav/commons/data/EnhancedDataOutputStream.java
new file mode 100644 (file)
index 0000000..2598215
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.data;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+public class EnhancedDataOutputStream extends DataOutputStream {
+
+       public EnhancedDataOutputStream(final OutputStream out) {
+               super(out);
+       }
+
+       public void writeIntegerList(final List<Integer> list) throws IOException {
+               writeInt(list.size());
+
+               for (final Integer integer : list)
+                       writeInt(integer);
+       }
+
+       public void writeString(final String string) throws IOException {
+               if (string == null) {
+                       writeInt(-1);
+                       return;
+               }
+
+               final byte[] bytes = string.getBytes();
+
+               writeInt(bytes.length);
+               write(bytes);
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/file/CommonPathResolver.java b/src/main/java/eu/svjatoslav/commons/file/CommonPathResolver.java
new file mode 100644 (file)
index 0000000..81f9213
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.file;
+
+import java.io.File;
+
+public class CommonPathResolver {
+
+       public static File getDesktopDirectory() {
+               String desktopPath = System.getProperty("user.home") + "/Desktop";
+
+               File desktopFile = new File(desktopPath);
+               if (desktopFile.exists())
+                       return desktopFile;
+
+               desktopPath = System.getProperty("user.home") + "/Рабочий стол";
+
+               desktopFile = new File(desktopPath);
+               if (desktopFile.exists())
+                       return desktopFile;
+
+               return null;
+       }
+
+       public static File getHomeDirectory() {
+               return new File(System.getProperty("user.home"));
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/file/FilePathParser.java b/src/main/java/eu/svjatoslav/commons/file/FilePathParser.java
new file mode 100755 (executable)
index 0000000..3fa1894
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.file;
+
+import java.io.File;
+
+public class FilePathParser {
+
+       public static String getFileExtension(final File file) {
+               final String fullFileName = file.getName();
+
+               return getFileExtension(fullFileName);
+       }
+
+       public static String getFileExtension(final String fullFileName) {
+               final int dot = fullFileName.lastIndexOf('.');
+               String fileExtension;
+               if (dot == -1)
+                       fileExtension = "";
+               else {
+                       fileExtension = fullFileName.substring(dot + 1);
+                       fileExtension = fileExtension.toLowerCase();
+               }
+
+               return fileExtension;
+       }
+
+       public static String getFileNameWithoutExtension(final File file) {
+               final String fullFileName = file.getName();
+               return getFileNameWithoutExtension(fullFileName);
+       }
+
+       public static String getFileNameWithoutExtension(final String fullFileName) {
+               final int dot = fullFileName.lastIndexOf('.');
+               String fileName;
+               if (dot == -1)
+                       fileName = fullFileName;
+               else
+                       fileName = fullFileName.substring(0, dot);
+
+               return fileName;
+       }
+
+       public static String getFileSizeDescription(long fileSize) {
+               String suffix = "b";
+
+               if (fileSize > (1024 * 1024 * 10)) {
+                       fileSize = fileSize / (1024 * 1024);
+                       suffix = "Mb";
+               } else if (fileSize > (1024 * 10)) {
+                       fileSize = fileSize / 1024;
+                       suffix = "Kb";
+               }
+
+               final String fileSizeString = String.valueOf(fileSize) + " " + suffix;
+
+               return fileSizeString;
+       }
+}
diff --git a/src/main/java/eu/svjatoslav/commons/file/IOHelper.java b/src/main/java/eu/svjatoslav/commons/file/IOHelper.java
new file mode 100644 (file)
index 0000000..97d3b44
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.file;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class IOHelper {
+
+       public static byte[] getFileContents(final File file)
+                       throws FileNotFoundException, IOException {
+
+               final byte[] result = new byte[(int) file.length()];
+               final FileInputStream fileInputStream = new FileInputStream(file);
+               fileInputStream.read(result);
+               fileInputStream.close();
+               return result;
+       }
+
+       /**
+        * Compares new file content with old file content. If content in equal,
+        * then leaves file as-is. If content differs, then overrides file with the
+        * new content.
+        * 
+        * @return <code>true</code> if file was overwritten.
+        */
+       public static boolean overwriteFileIfContentDiffers(final File file,
+                       final byte[] newContent) throws FileNotFoundException, IOException {
+
+               checkForEquality: {
+                       if (file.length() == newContent.length) {
+
+                               final byte[] oldContent = getFileContents(file);
+
+                               for (int i = 0; i < newContent.length; i++)
+                                       if (newContent[i] != oldContent[i])
+                                               break checkForEquality;
+
+                               // new file content in identical to old content
+                               return false;
+                       }
+               }
+
+               // New content differs from existing. Overwrite file.
+               saveToFile(file, newContent);
+               return true;
+       }
+
+       public static void saveToFile(final File file, final byte[] content)
+                       throws IOException {
+               final FileOutputStream fos = new FileOutputStream(file);
+               fos.write(content);
+               fos.close();
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/gui/dialog/ExceptionDialog.java b/src/main/java/eu/svjatoslav/commons/gui/dialog/ExceptionDialog.java
new file mode 100755 (executable)
index 0000000..a80e6e3
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.gui.dialog;
+
+import java.awt.BorderLayout;
+import java.awt.TextArea;
+
+import javax.swing.BoxLayout;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+public class ExceptionDialog {
+
+       public ExceptionDialog(final Exception exception) {
+               showException(exception);
+       }
+
+       /**
+        * @param exception
+        *            exception to show
+        */
+       public void showException(final Exception exception) {
+
+               final JFrame frame = new JFrame("Exception occured!");
+               final JPanel contentPanel = new JPanel(new BorderLayout());
+               final Throwable cause = exception.getCause();
+
+               // build top panel
+               {
+                       final JPanel topPanel = new JPanel();
+                       topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
+
+                       // add exception type
+                       final JLabel exceptionType = new JLabel("Exception type: "
+                                       + exception.getClass().getCanonicalName());
+                       topPanel.add(exceptionType);
+
+                       // add error message
+                       final JLabel message = new JLabel("Error message: "
+                                       + exception.getMessage());
+                       topPanel.add(message);
+
+                       // add cause message
+                       if (cause != null)
+                               if (cause.getMessage() != null) {
+                                       final JLabel message2 = new JLabel("Cause: "
+                                                       + cause.getMessage());
+                                       topPanel.add(message2);
+                               }
+
+                       contentPanel.add(topPanel, BorderLayout.NORTH);
+               }
+
+               // build stack trace view
+               {
+                       final StringBuffer buffer = new StringBuffer();
+
+                       // if cause is available, show original stack trace
+                       if (cause != null) {
+                               buffer.append("Stack trace:\n");
+                               final StackTraceElement[] stackTrace = cause.getStackTrace();
+                               for (final StackTraceElement stackTraceElement : stackTrace)
+                                       buffer.append(stackTraceElement.toString() + "\n");
+                       } else {
+                               // otherwise show at least current stack trace
+                               buffer.append("Stack trace from original cause is not available.\nShowing current stack trace instead:\n");
+
+                               for (final StackTraceElement stackTraceElement : new Exception(
+                                               "Stack trace").getStackTrace())
+                                       buffer.append(stackTraceElement.toString() + "\n");
+                       }
+
+                       final TextArea textArea = new TextArea(buffer.toString());
+                       contentPanel.add(textArea, BorderLayout.CENTER);
+               }
+
+               // finalize frame
+               frame.getContentPane().add(contentPanel);
+               frame.setSize(800, 600);
+               frame.setVisible(true);
+
+               // Thread.dumpStack();
+
+       }
+
+       /**
+        * This method is for testing
+        */
+       public static void main(final String[] args) {
+
+               final Throwable cause = new Throwable("details.....");
+
+               final Exception exception = new Exception("test", cause);
+
+               new ExceptionDialog(exception);
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/network/UrlParamEncoder.java b/src/main/java/eu/svjatoslav/commons/network/UrlParamEncoder.java
new file mode 100755 (executable)
index 0000000..bfa1a19
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.network;
+
+public class UrlParamEncoder {
+
+       public static String decode(final String source) {
+
+               final String result = source.replaceAll("%20", " ");
+
+               return result;
+       }
+
+       public static String encode(final String source) {
+
+               final StringBuffer buffer = new StringBuffer();
+               for (int i = 0; i < source.length(); i++) {
+                       boolean replaced = false;
+                       final char character = source.charAt(i);
+
+                       if (character == ' ') {
+                               buffer.append("%20");
+                               replaced = true;
+                       }
+
+                       if (character == '?') {
+                               buffer.append("%3F");
+                               replaced = true;
+                       }
+
+                       if (character == ',') {
+                               buffer.append("%2C");
+                               replaced = true;
+                       }
+
+                       if (character == ':') {
+                               buffer.append("%3A");
+                               replaced = true;
+                       }
+
+                       if (!replaced)
+                               buffer.append(character);
+               }
+
+               return buffer.toString();
+       }
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/string/CuttableString.java b/src/main/java/eu/svjatoslav/commons/string/CuttableString.java
new file mode 100644 (file)
index 0000000..11de15b
--- /dev/null
@@ -0,0 +1,33 @@
+package eu.svjatoslav.commons.string;
+
+public class CuttableString {
+
+       private String value;
+
+       public CuttableString(final String value) {
+               this.value = value;
+       }
+
+       /**
+        * Cut given amount of characters from the left of the string. Return cutted
+        * part.
+        */
+       public String cutLeft(final int cutAmount) {
+
+               int actualCutAmount = cutAmount;
+
+               if (actualCutAmount > value.length())
+                       actualCutAmount = value.length();
+
+               final String result = value.substring(0, actualCutAmount);
+
+               value = value.substring(actualCutAmount);
+
+               return result;
+       }
+
+       public boolean isEmpty() {
+               return value.length() == 0;
+       };
+
+}
diff --git a/src/main/java/eu/svjatoslav/commons/string/WildCardMatcher.java b/src/main/java/eu/svjatoslav/commons/string/WildCardMatcher.java
new file mode 100755 (executable)
index 0000000..0da2309
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.string;
+
+public class WildCardMatcher {
+
+       /**
+        * Allow only for * in wildcards
+        */
+       private static boolean checkWildCardEnd(final String wildcardExpression,
+                       int wildCardPosition) {
+               for (; wildCardPosition < wildcardExpression.length(); wildCardPosition++) {
+                       final char wildCardChar = wildcardExpression
+                                       .charAt(wildCardPosition);
+                       if (wildCardChar != '*')
+                               return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * <pre>
+        * Test input string against wildcard expression.
+        * * -- corresponds to any amount of characters.
+        * ? -- corresponds to any single character.
+        * </pre>
+        */
+
+       public static boolean match(final String inputString,
+                       final String wildcardExpression) {
+
+               int i;
+
+               for (i = 0; i < inputString.length(); i++) {
+                       if (i >= wildcardExpression.length())
+                               return false;
+                       final char wildCardChar = wildcardExpression.charAt(i);
+                       if (wildCardChar == '*')
+                               return matchPiece(inputString, i, wildcardExpression, i + 1);
+                       if (wildCardChar != '?')
+                               if (inputString.charAt(i) != wildCardChar)
+                                       return false;
+               }
+
+               return checkWildCardEnd(wildcardExpression, i);
+       }
+
+       private static boolean matchPiece(final String inputString,
+                       final int inputStringIndex, final String wildcardExpression,
+                       final int wildCardExpressionIndex) {
+
+               int wildCardPosition = wildCardExpressionIndex;
+
+               for (int i = inputStringIndex; i < inputString.length(); i++) {
+
+                       wildCardPosition = wildCardExpressionIndex;
+
+                       subMatchAttempt: {
+
+                               for (int j = i; j < inputString.length(); j++) {
+                                       if (wildCardPosition >= wildcardExpression.length())
+                                               break subMatchAttempt;
+                                       final char wildCardChar = wildcardExpression
+                                                       .charAt(wildCardPosition);
+
+                                       if (wildCardChar == '*')
+                                               return matchPiece(inputString, j, wildcardExpression,
+                                                               wildCardPosition + 1);
+
+                                       if (wildCardChar != '?')
+                                               if (inputString.charAt(j) != wildCardChar)
+                                                       break subMatchAttempt;
+
+                                       wildCardPosition++;
+                               }
+
+                               return checkWildCardEnd(wildcardExpression, wildCardPosition);
+                       }
+
+               }
+
+               return checkWildCardEnd(wildcardExpression, wildCardPosition);
+       }
+
+}
diff --git a/src/test/java/eu/svjatoslav/commons/commandline/parameterparser/ParserTest.java b/src/test/java/eu/svjatoslav/commons/commandline/parameterparser/ParserTest.java
new file mode 100755 (executable)
index 0000000..0e654b4
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.commandline.parameterparser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import eu.svjatoslav.commons.commandline.parameterparser.arguments.IntegerArgument;
+
+public class ParserTest {
+
+       Parser parser;
+
+       @Before
+       public void setUp() throws Exception {
+               parser = new Parser();
+       }
+
+       @Test
+       public void testParse() {
+
+               // define allowed parameters
+               final Parameter helpParameter = new Parameter("Show help screen", "-h",
+                               "--help");
+               parser.addParameter(helpParameter);
+
+               final Parameter compileParameter = new Parameter("Compile code", "-c",
+                               "--compile");
+               parser.addParameter(compileParameter);
+
+               final Parameter bitrateParameter = new Parameter(false, true, false,
+                               new IntegerArgument(), "Target bitrate", "-b", "--bitrate");
+               parser.addParameter(bitrateParameter);
+
+               // check help generation
+               parser.showHelp();
+
+               // parse arguments
+               parser.parse(new String[] { "--help", "-b", "123" });
+
+               // --help was in the arguments
+               assertTrue(helpParameter.isParameterSpecified());
+
+               // compile was not present
+               assertFalse(compileParameter.isParameterSpecified());
+
+               // bitrate is given as 123
+               assertTrue(bitrateParameter.isParameterSpecified());
+
+               assertEquals(123, (int) bitrateParameter.getArgumentsAsIntegers()
+                               .get(0));
+       }
+
+}
diff --git a/src/test/java/eu/svjatoslav/commons/file/CommonPathResolverTest.java b/src/test/java/eu/svjatoslav/commons/file/CommonPathResolverTest.java
new file mode 100644 (file)
index 0000000..cd0cf3a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.file;
+
+import org.junit.Test;
+
+public class CommonPathResolverTest {
+
+       @Test
+       public final void testGetDesktopDirectory() {
+               System.out.println(CommonPathResolver.getDesktopDirectory());
+       }
+
+       @Test
+       public final void testGetHomeDirectory() {
+               System.out.println(CommonPathResolver.getHomeDirectory());
+       }
+
+}
diff --git a/src/test/java/eu/svjatoslav/commons/file/IOHelperTest.java b/src/test/java/eu/svjatoslav/commons/file/IOHelperTest.java
new file mode 100644 (file)
index 0000000..055379e
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.file;
+
+import java.io.File;
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+
+public class IOHelperTest extends TestCase {
+
+       @Test
+       public void testOverwriteFileIfContentDiffers() throws IOException {
+               final File file = new File("overrideTest.txt");
+
+               assertTrue(IOHelper.overwriteFileIfContentDiffers(file,
+                               "aoa".getBytes()));
+
+               assertFalse(IOHelper.overwriteFileIfContentDiffers(file,
+                               "aoa".getBytes()));
+
+               assertTrue(IOHelper.overwriteFileIfContentDiffers(file,
+                               "1234".getBytes()));
+
+               file.delete();
+       }
+
+}
diff --git a/src/test/java/eu/svjatoslav/commons/network/UrlParamEncoderTest.java b/src/test/java/eu/svjatoslav/commons/network/UrlParamEncoderTest.java
new file mode 100755 (executable)
index 0000000..2ef3def
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.network;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class UrlParamEncoderTest {
+
+       @Before
+       public void setUp() throws Exception {
+       }
+
+       @Test
+       public void test() {
+               final String result = UrlParamEncoder.decode("this%20is%20a%20test.");
+               System.out.println(result);
+       }
+
+}
diff --git a/src/test/java/eu/svjatoslav/commons/string/CuttableStringTest.java b/src/test/java/eu/svjatoslav/commons/string/CuttableStringTest.java
new file mode 100644 (file)
index 0000000..6f996c3
--- /dev/null
@@ -0,0 +1,21 @@
+package eu.svjatoslav.commons.string;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class CuttableStringTest {
+
+       @Test
+       public void testCutLeft() {
+
+               final CuttableString s = new CuttableString("this is a test");
+
+               assertEquals("this ", s.cutLeft(5));
+               assertEquals("is ", s.cutLeft(3));
+               assertEquals("a ", s.cutLeft(2));
+               assertEquals("test", s.cutLeft(25));
+               assertEquals("", s.cutLeft(5));
+
+       }
+}
diff --git a/src/test/java/eu/svjatoslav/commons/string/WildCardMatcherTest.java b/src/test/java/eu/svjatoslav/commons/string/WildCardMatcherTest.java
new file mode 100755 (executable)
index 0000000..04518fa
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ */
+
+package eu.svjatoslav.commons.string;
+
+import static org.junit.Assert.fail;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class WildCardMatcherTest {
+
+       WildCardMatcher matcher;
+
+       @Before
+       public void setUp() throws Exception {
+
+       }
+
+       @Test
+       public void test() {
+
+               testWildcard("IMG_9770.JPG", "*.J*", true);
+               testWildcard("1", "1", true);
+               testWildcard("1", "*", true);
+               testWildcard("f", "1", false);
+               testWildcard("Hello !", "Hell*!***", true);
+               testWildcard("Hello !", "Hell*!", true);
+               testWildcard("Hello !", "Hell*", true);
+               testWildcard("Hello !", "Hell", false);
+               testWildcard("Hello !", "* *", true);
+
+       }
+
+       private static void testWildcard(final String string, final String pattern,
+                       final boolean expectedResult) {
+
+               final boolean result = WildCardMatcher.match(string, pattern);
+
+               if (result != expectedResult) {
+                       fail("Wildcard match failed.");
+               }
+
+       }
+
+}