--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+#Fri Feb 10 21:00:42 EET 2012
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/test/java=UTF-8
--- /dev/null
+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
--- /dev/null
+eclipse.preferences.version=1
+formatter_settings_version=12
--- /dev/null
+#Sat Feb 25 12:11:37 EET 2012
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=false
+version=1
--- /dev/null
+
+ 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.
--- /dev/null
+<!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>
+
+ <a href="http://www2.svjatoslav.eu/gitbrowse/svjatoslav_commons/doc/index.html">Online homepage</a>
+
+ <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
--- /dev/null
+<!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>
+ <dependencies>
+
+ ...
+
+ <dependency>
+ <groupId>eu.svjatoslav</groupId>
+ <artifactId>svjatoslavcommons</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+
+ ...
+
+ </dependencies>
+
+ <repositories>
+
+ ...
+
+ <repository>
+ <id>svjatoslav.eu</id>
+ <name>Svjatoslav repository</name>
+ <url>http://www2.svjatoslav.eu/maven/</url>
+ </repository>
+
+ ...
+
+ </repositories>
+</pre>
+</td></tr>
+</table>
+
+
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null
+<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>
--- /dev/null
+/*
+ * 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();
+ }
+
+ }
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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());
+ }
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+ }
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+ }
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+ }
+
+}
--- /dev/null
+/*
+ * 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"));
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+}
--- /dev/null
+/*
+ * 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();
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+ }
+
+}
--- /dev/null
+/*
+ * 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();
+ }
+
+}
--- /dev/null
+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;
+ };
+
+}
--- /dev/null
+/*
+ * 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);
+ }
+
+}
--- /dev/null
+/*
+ * 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));
+ }
+
+}
--- /dev/null
+/*
+ * 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());
+ }
+
+}
--- /dev/null
+/*
+ * 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();
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+ }
+
+}
--- /dev/null
+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));
+
+ }
+}
--- /dev/null
+/*
+ * 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.");
+ }
+
+ }
+
+}