From 26f09b1ebcafae67855b55ad588d5332a107d202 Mon Sep 17 00:00:00 2001 From: Svjatoslav Agejenko Date: Sun, 7 Apr 2013 15:04:25 +0300 Subject: [PATCH] initial commit --- .classpath | 27 ++ .gitignore | 1 + .project | 23 ++ .settings/org.eclipse.core.resources.prefs | 4 + .settings/org.eclipse.jdt.core.prefs | 5 + .settings/org.eclipse.jdt.ui.prefs | 2 + .settings/org.eclipse.m2e.core.prefs | 5 + COPYING | 341 ++++++++++++++++++ doc/index.html | 44 +++ doc/usage.html | 49 +++ pom.xml | 95 +++++ .../commons/commandline/CLIHelper.java | 99 +++++ .../commandline/parameterparser/Argument.java | 25 ++ .../parameterparser/Parameter.java | 233 ++++++++++++ .../commandline/parameterparser/Parser.java | 93 +++++ .../arguments/ExistingDirectory.java | 31 ++ .../arguments/ExistingFile.java | 31 ++ .../arguments/IntegerArgument.java | 31 ++ .../arguments/NonExistingDirectory.java | 31 ++ .../arguments/NonExistingFile.java | 31 ++ .../arguments/StringArgument.java | 26 ++ .../commons/data/BitInputStream.java | 64 ++++ .../commons/data/BitOutputStream.java | 72 ++++ .../commons/data/EnhancedDataInputStream.java | 47 +++ .../data/EnhancedDataOutputStream.java | 42 +++ .../commons/file/CommonPathResolver.java | 36 ++ .../commons/file/FilePathParser.java | 66 ++++ .../eu/svjatoslav/commons/file/IOHelper.java | 66 ++++ .../commons/gui/dialog/ExceptionDialog.java | 106 ++++++ .../commons/network/UrlParamEncoder.java | 55 +++ .../commons/string/CuttableString.java | 33 ++ .../commons/string/WildCardMatcher.java | 93 +++++ .../parameterparser/ParserTest.java | 65 ++++ .../commons/file/CommonPathResolverTest.java | 26 ++ .../svjatoslav/commons/file/IOHelperTest.java | 37 ++ .../commons/network/UrlParamEncoderTest.java | 27 ++ .../commons/string/CuttableStringTest.java | 21 ++ .../commons/string/WildCardMatcherTest.java | 52 +++ 38 files changed, 2135 insertions(+) create mode 100755 .classpath create mode 100755 .gitignore create mode 100755 .project create mode 100755 .settings/org.eclipse.core.resources.prefs create mode 100755 .settings/org.eclipse.jdt.core.prefs create mode 100755 .settings/org.eclipse.jdt.ui.prefs create mode 100755 .settings/org.eclipse.m2e.core.prefs create mode 100755 COPYING create mode 100755 doc/index.html create mode 100644 doc/usage.html create mode 100755 pom.xml create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/CLIHelper.java create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Argument.java create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parameter.java create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parser.java create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingDirectory.java create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingFile.java create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/IntegerArgument.java create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingDirectory.java create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingFile.java create mode 100755 src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/StringArgument.java create mode 100755 src/main/java/eu/svjatoslav/commons/data/BitInputStream.java create mode 100755 src/main/java/eu/svjatoslav/commons/data/BitOutputStream.java create mode 100644 src/main/java/eu/svjatoslav/commons/data/EnhancedDataInputStream.java create mode 100644 src/main/java/eu/svjatoslav/commons/data/EnhancedDataOutputStream.java create mode 100644 src/main/java/eu/svjatoslav/commons/file/CommonPathResolver.java create mode 100755 src/main/java/eu/svjatoslav/commons/file/FilePathParser.java create mode 100644 src/main/java/eu/svjatoslav/commons/file/IOHelper.java create mode 100755 src/main/java/eu/svjatoslav/commons/gui/dialog/ExceptionDialog.java create mode 100755 src/main/java/eu/svjatoslav/commons/network/UrlParamEncoder.java create mode 100644 src/main/java/eu/svjatoslav/commons/string/CuttableString.java create mode 100755 src/main/java/eu/svjatoslav/commons/string/WildCardMatcher.java create mode 100755 src/test/java/eu/svjatoslav/commons/commandline/parameterparser/ParserTest.java create mode 100644 src/test/java/eu/svjatoslav/commons/file/CommonPathResolverTest.java create mode 100644 src/test/java/eu/svjatoslav/commons/file/IOHelperTest.java create mode 100755 src/test/java/eu/svjatoslav/commons/network/UrlParamEncoderTest.java create mode 100644 src/test/java/eu/svjatoslav/commons/string/CuttableStringTest.java create mode 100755 src/test/java/eu/svjatoslav/commons/string/WildCardMatcherTest.java diff --git a/.classpath b/.classpath new file mode 100755 index 0000000..921c731 --- /dev/null +++ b/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..2f7896d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/.project b/.project new file mode 100755 index 0000000..235c20b --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + svjatoslav_commons + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100755 index 0000000..29fdc79 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -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 index 0000000..60105c1 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -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 index 0000000..fe89f28 --- /dev/null +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -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 index 0000000..a161924 --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -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 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. + + 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.) + +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. + + 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. + + 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 + + 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. + + + Copyright (C) + + 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. + + , 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 index 0000000..2df150c --- /dev/null +++ b/doc/index.html @@ -0,0 +1,44 @@ + + + + +Svjatoslav Commons + + +

Svjatoslav Commons - Java library of commonly used functions

+ Download +    + Online homepage +    + Other applications hosted on svjatoslav.eu +
+Library author:
+    Svjatoslav Agejenko
+    Homepage: http://svjatoslav.eu
+    Email: svjatoslav@svjatoslav.eu
+
+This software is distributed under GNU GENERAL PUBLIC LICENSE Version 2.
+
+
+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.
+
+Instructions to embed svjatoslav-commons in your project as a library.  
+
+
+ + \ No newline at end of file diff --git a/doc/usage.html b/doc/usage.html new file mode 100644 index 0000000..13ce480 --- /dev/null +++ b/doc/usage.html @@ -0,0 +1,49 @@ + + + + +Insert title here + + + + +Maven pom.xml file snippet: + + + +
+
+    <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>
+
+
+ + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100755 index 0000000..75b55b1 --- /dev/null +++ b/pom.xml @@ -0,0 +1,95 @@ + + 4.0.0 + eu.svjatoslav + svjatoslavcommons + 1.0-SNAPSHOT + jar + Svjatoslav commonly used resources library + Svjatoslav commonly used resources library + + + svjatoslav.eu + http://svjatoslav.eu + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + true + UTF-8 + + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9 + + + attach-javadocs + + jar + + + + + + + + + org.apache.maven.wagon + wagon-ssh + 2.2 + + + + + + + junit + junit + 4.8.1 + test + + + + + + svjatoslav.eu + svjatoslav.eu + scp://svjatoslav.eu:7022/var/www/maven + + + svjatoslav.eu + svjatoslav.eu + scp://svjatoslav.eu:7022/var/www/maven + + + + + scm:git:ssh://git@svjatoslav.eu:7022/home/git/repositories/svjatoslav_commons.git + scm:git:ssh://git@svjatoslav.eu:7022/home/git/repositories/svjatoslav_commons.git + + + 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 index 0000000..a232246 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/CLIHelper.java @@ -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 index 0000000..d969f16 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Argument.java @@ -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 true if value is correct, false + * 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 index 0000000..1575fcf --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parameter.java @@ -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 aliases; + + private final String description; + + private final ArrayList arguments = new ArrayList(); + + /** + * If this parameter was present in the commandline, then this boolean will + * be set to true. + */ + 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 aliasesList = new ArrayList(); + 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 true if no errors were found. false + * 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 getArgumentsAsFiles() { + final ArrayList result = new ArrayList(); + + for (final String argument : arguments) { + final File file = new File(argument); + result.add(file); + } + + return result; + } + + public List getArgumentsAsIntegers() { + final ArrayList result = new ArrayList(); + + for (final String argument : arguments) { + result.add(Integer.valueOf(argument)); + } + + return result; + } + + public List getArgumentsAsStrings() { + final ArrayList result = new ArrayList(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 true 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 true if no errors were found. false + * 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 index 0000000..d2f623f --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/Parser.java @@ -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; + +/** + *
+ * Single commandline parameter can have any amount of arguments.
+ * 
+ */ +public class Parser { + + private final ArrayList parameters = new ArrayList(); + + public void addParameter(final Parameter parameter) { + parameters.add(parameter); + } + + /** + * Return parameter by given alias or null 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 true if no errors were found. false + * 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 index 0000000..25c521d --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingDirectory.java @@ -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 index 0000000..d46f05d --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/ExistingFile.java @@ -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 index 0000000..50f1ece --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/IntegerArgument.java @@ -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 index 0000000..3190e9d --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingDirectory.java @@ -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 index 0000000..1f68bf8 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/NonExistingFile.java @@ -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 index 0000000..0da8cb7 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/commandline/parameterparser/arguments/StringArgument.java @@ -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 index 0000000..3ecff98 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/data/BitInputStream.java @@ -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 index 0000000..6348d0a --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/data/BitOutputStream.java @@ -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 index 0000000..4adc080 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/data/EnhancedDataInputStream.java @@ -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 readIntegerList() throws IOException { + final int length = readInt(); + + final List result = new ArrayList(); + + 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 index 0000000..2598215 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/data/EnhancedDataOutputStream.java @@ -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 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 index 0000000..81f9213 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/file/CommonPathResolver.java @@ -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 index 0000000..3fa1894 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/file/FilePathParser.java @@ -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 index 0000000..97d3b44 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/file/IOHelper.java @@ -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 true 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 index 0000000..a80e6e3 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/gui/dialog/ExceptionDialog.java @@ -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 index 0000000..bfa1a19 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/network/UrlParamEncoder.java @@ -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 index 0000000..11de15b --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/string/CuttableString.java @@ -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 index 0000000..0da2309 --- /dev/null +++ b/src/main/java/eu/svjatoslav/commons/string/WildCardMatcher.java @@ -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; + } + + /** + *
+	 * Test input string against wildcard expression.
+	 * * -- corresponds to any amount of characters.
+	 * ? -- corresponds to any single character.
+	 * 
+ */ + + 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 index 0000000..0e654b4 --- /dev/null +++ b/src/test/java/eu/svjatoslav/commons/commandline/parameterparser/ParserTest.java @@ -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 index 0000000..cd0cf3a --- /dev/null +++ b/src/test/java/eu/svjatoslav/commons/file/CommonPathResolverTest.java @@ -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 index 0000000..055379e --- /dev/null +++ b/src/test/java/eu/svjatoslav/commons/file/IOHelperTest.java @@ -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 index 0000000..2ef3def --- /dev/null +++ b/src/test/java/eu/svjatoslav/commons/network/UrlParamEncoderTest.java @@ -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 index 0000000..6f996c3 --- /dev/null +++ b/src/test/java/eu/svjatoslav/commons/string/CuttableStringTest.java @@ -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 index 0000000..04518fa --- /dev/null +++ b/src/test/java/eu/svjatoslav/commons/string/WildCardMatcherTest.java @@ -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."); + } + + } + +} -- 2.20.1