diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml new file mode 100644 index 0000000..774f7c5 --- /dev/null +++ b/.github/workflows/test-pr.yml @@ -0,0 +1,35 @@ +name: PR QA + +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + build: + name: Checkout and Build + runs-on: ubuntu-20.04 + + strategy: + matrix: + java-version: [8, 11, 16, 17] + + steps: + - uses: actions/checkout@v2 + - name: JDK setup + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java-version }} + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn --batch-mode --update-snapshots verify + + coverage: + name: Quality Assurance + runs-on: ubuntu-20.04 + needs: [ build ] + + steps: + - uses: actions/checkout@v2 + - name: Codacy analysis reporting + uses: codacy/codacy-analysis-cli-action@master diff --git a/.gitignore b/.gitignore index ce9a994..2a67388 100644 --- a/.gitignore +++ b/.gitignore @@ -11,9 +11,18 @@ *.war *.ear +# Maven targets +**/target + # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +## IntelliJ files *.iml .idea + +## Eclipse artifacts +**/.project +**/.classpath +**/.settings \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..47e189e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +language: java +sudo: required +dist: trusty + +jdk: + - openjdk8 + - openjdk9 + - oraclejdk9 + - oraclejdk11 + +branches: + except: + - /^v|d\d+\.\d+\.\d+$/ + - /^jenkins-veraPDF-plugins-v|d\\d+\\.\\d+\\.\\d+$/ diff --git a/LICENSE.GPL b/LICENSE.GPL new file mode 100644 index 0000000..733c072 --- /dev/null +++ b/LICENSE.GPL @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU 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 Lesser General +Public License instead of this License. But first, please read +. + diff --git a/LICENSE.MPL b/LICENSE.MPL new file mode 100644 index 0000000..be2cc4d --- /dev/null +++ b/LICENSE.MPL @@ -0,0 +1,362 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. diff --git a/embeddedfileSample-plugin/pom.xml b/embeddedfileSample-plugin/pom.xml index ff490d6..d9683d2 100644 --- a/embeddedfileSample-plugin/pom.xml +++ b/embeddedfileSample-plugin/pom.xml @@ -1,15 +1,36 @@ - - - verapdf-library-samples - org.verapdf - 1.0-SNAPSHOT - - 4.0.0 + - embeddedfileSample-plugin + 4.0.0 + + verapdf-plugins + org.verapdf.plugins + 1.24.0 + + embeddedfileSample-plugin - \ No newline at end of file + + + org.verapdf + core + + + + javax.xml.bind + jaxb-api + + + + com.sun.xml.bind + jaxb-impl + + + + com.sun.xml.bind + jaxb-core + + + + diff --git a/embeddedfileSample-plugin/src/main/java/org/verapdf/EmbeddedFileSampleExtractor.java b/embeddedfileSample-plugin/src/main/java/org/verapdf/EmbeddedFileSampleExtractor.java index f4e84b3..2456ff4 100644 --- a/embeddedfileSample-plugin/src/main/java/org/verapdf/EmbeddedFileSampleExtractor.java +++ b/embeddedfileSample-plugin/src/main/java/org/verapdf/EmbeddedFileSampleExtractor.java @@ -1,6 +1,5 @@ package org.verapdf; -import org.apache.log4j.Logger; import org.verapdf.core.FeatureParsingException; import org.verapdf.features.AbstractEmbeddedFileFeaturesExtractor; import org.verapdf.features.EmbeddedFileFeaturesData; @@ -10,68 +9,81 @@ import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @author Maksim Bezrukov */ -public class EmbeddedFileSampleExtractor extends AbstractEmbeddedFileFeaturesExtractor { +public class EmbeddedFileSampleExtractor extends + AbstractEmbeddedFileFeaturesExtractor { - private static final Logger LOGGER = Logger - .getLogger(EmbeddedFileSampleExtractor.class); + private static final Logger LOGGER = Logger.getLogger(EmbeddedFileSampleExtractor.class.getCanonicalName()); - @Override - public List getEmbeddedFileFeatures(EmbeddedFileFeaturesData embeddedFileFeaturesData) { - List res = new ArrayList<>(); - try { - FeatureTreeNode stream = FeatureTreeNode.createRootNode("streamContent"); - stream.setValue(DatatypeConverter.printHexBinary(embeddedFileFeaturesData.getStream())); - res.add(stream); + @Override + public List getEmbeddedFileFeatures( + EmbeddedFileFeaturesData embeddedFileFeaturesData) { + List res = new ArrayList<>(); + try { +// FeatureTreeNode stream = FeatureTreeNode +// .createRootNode("streamContent"); +// stream.setValue(DatatypeConverter +// .printHexBinary(inputStreamToByteArray(embeddedFileFeaturesData.getStream()))); +// res.add(stream); - addObjectNode("checkSum", embeddedFileFeaturesData.getCheckSum(), res); - addObjectNode("creationDate", getXMLFormat(embeddedFileFeaturesData.getCreationDate()), res); - addObjectNode("description", embeddedFileFeaturesData.getDescription(), res); - addObjectNode("modDate", getXMLFormat(embeddedFileFeaturesData.getModDate()), res); - addObjectNode("name", embeddedFileFeaturesData.getName(), res); - addObjectNode("size", embeddedFileFeaturesData.getSize(), res); - addObjectNode("subtype", embeddedFileFeaturesData.getSubtype(), res); + addObjectNode("checkSum", embeddedFileFeaturesData.getCheckSum(), + res); + addObjectNode("creationDate", + formatXMLDate(embeddedFileFeaturesData.getCreationDate()), + res); + addObjectNode("description", + embeddedFileFeaturesData.getDescription(), res); + addObjectNode("modDate", + formatXMLDate(embeddedFileFeaturesData.getModDate()), res); + addObjectNode("name", embeddedFileFeaturesData.getName(), res); + addObjectNode("size", embeddedFileFeaturesData.getSize(), res); + addObjectNode("subtype", embeddedFileFeaturesData.getSubtype(), res); - } catch (FeatureParsingException | DatatypeConfigurationException e) { - LOGGER.error(e); - } - return res; - } + } catch (/*IOException |*/ FeatureParsingException | DatatypeConfigurationException e) { + LOGGER.log(Level.WARNING, "IO/Exception when adding information", e); + } + return res; + } - private static FeatureTreeNode addObjectNode(String nodeName, Object toAdd, List list) throws FeatureParsingException { - FeatureTreeNode node = null; - if (toAdd != null) { - node = FeatureTreeNode.createRootNode(nodeName); - list.add(node); - node.setValue(toAdd.toString()); - } - return node; - } + private static void addObjectNode(String nodeName, Object toAdd, + List list) throws FeatureParsingException { + if (toAdd != null) { + FeatureTreeNode node = FeatureTreeNode.createRootNode(nodeName); + node.setValue(toAdd.toString()); + list.add(node); + } + } - private static String getXMLFormat(Calendar calendar) throws DatatypeConfigurationException { - if (calendar == null) { - return null; - } - GregorianCalendar greg = new GregorianCalendar(Locale.US); - greg.setTime(calendar.getTime()); - greg.setTimeZone(calendar.getTimeZone()); - XMLGregorianCalendar xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(greg); - return xmlCalendar.toXMLFormat(); + private static String formatXMLDate(Calendar calendar) + throws DatatypeConfigurationException { + if (calendar == null) { + return null; + } + GregorianCalendar greg = new GregorianCalendar(Locale.US); + greg.setTime(calendar.getTime()); + greg.setTimeZone(calendar.getTimeZone()); + XMLGregorianCalendar xmlCalendar = DatatypeFactory.newInstance() + .newXMLGregorianCalendar(greg); + return xmlCalendar.toXMLFormat(); - } + } - @Override - public String getID() { - return "b99ad964-5d34-4b17-9bec-b19a174ae772"; - } - - @Override - public String getDescription() { - return "This sample Extractor generates custom features report containing data from incoming " + - "EmbeddedFileFeaturesData object."; - } +// private static byte[] inputStreamToByteArray(InputStream is) throws IOException { +// ByteArrayOutputStream baos = new ByteArrayOutputStream(); +// byte[] bytes = new byte[1024]; +// int length; +// while ((length = is.read(bytes)) != -1) { +// baos.write(bytes, 0, length); +// } +// return baos.toByteArray(); +// } } diff --git a/fontSample-plugin/pom.xml b/fontSample-plugin/pom.xml index 7c152c5..4aded80 100644 --- a/fontSample-plugin/pom.xml +++ b/fontSample-plugin/pom.xml @@ -1,15 +1,36 @@ - - - verapdf-library-samples - org.verapdf - 1.0-SNAPSHOT - - 4.0.0 + - fontSample-plugin + 4.0.0 + + verapdf-plugins + org.verapdf.plugins + 1.24.0 + + fontSample-plugin - \ No newline at end of file + + + org.verapdf + core + + + + javax.xml.bind + jaxb-api + + + + com.sun.xml.bind + jaxb-impl + + + + com.sun.xml.bind + jaxb-core + + + + diff --git a/fontSample-plugin/src/main/java/org/verapdf/FontSampleExtractor.java b/fontSample-plugin/src/main/java/org/verapdf/FontSampleExtractor.java index 7a3b109..cbca77d 100644 --- a/fontSample-plugin/src/main/java/org/verapdf/FontSampleExtractor.java +++ b/fontSample-plugin/src/main/java/org/verapdf/FontSampleExtractor.java @@ -1,35 +1,38 @@ package org.verapdf; -import org.apache.log4j.Logger; import org.verapdf.core.FeatureParsingException; import org.verapdf.features.AbstractFontFeaturesExtractor; import org.verapdf.features.FontFeaturesData; import org.verapdf.features.tools.FeatureTreeNode; import javax.xml.bind.DatatypeConverter; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @author Maksim Bezrukov */ public class FontSampleExtractor extends AbstractFontFeaturesExtractor { - private static final Logger LOGGER = Logger - .getLogger(FontSampleExtractor.class); + private static final Logger LOGGER = Logger.getLogger(FontSampleExtractor.class.getCanonicalName()); @Override public List getFontFeatures(FontFeaturesData fontFeaturesData) { List res = new ArrayList<>(); try { - FeatureTreeNode stream = FeatureTreeNode.createRootNode("streamContent"); - stream.setValue(DatatypeConverter.printHexBinary(fontFeaturesData.getStream())); - res.add(stream); +// FeatureTreeNode stream = FeatureTreeNode.createRootNode("streamContent"); +// stream.setValue(DatatypeConverter.printHexBinary(inputStreamToByteArray(fontFeaturesData.getStream()))); +// res.add(stream); - byte[] meta = fontFeaturesData.getMetadata(); - if (meta != null) { + InputStream metadataStream = fontFeaturesData.getMetadata(); + if (metadataStream != null) { FeatureTreeNode metadata = FeatureTreeNode.createRootNode("metadataStreamContent"); - metadata.setValue(DatatypeConverter.printHexBinary(meta)); + metadata.setValue(DatatypeConverter.printHexBinary(inputStreamToByteArray(metadataStream))); res.add(metadata); } @@ -47,7 +50,7 @@ public List getFontFeatures(FontFeaturesData fontFeaturesData) for (int i = 0; i < bbox.size(); ++i) { Double obj = bbox.get(i); if (obj != null) { - FeatureTreeNode entry = FeatureTreeNode.createChildNode("entry", rangeNode); + FeatureTreeNode entry = rangeNode.addChild("entry"); entry.setValue(obj.toString()); entry.setAttribute("index", String.valueOf(i)); } @@ -67,7 +70,9 @@ public List getFontFeatures(FontFeaturesData fontFeaturesData) addObjectNode("xHeight", fontFeaturesData.getXHeight(), res); } catch (FeatureParsingException e) { - LOGGER.error("Some fail in logic", e); + LOGGER.log(Level.WARNING, "Some fail in logic", e); + } catch (IOException e) { + e.printStackTrace(); } return res; } @@ -82,14 +87,13 @@ private static FeatureTreeNode addObjectNode(String nodeName, Object toAdd, List return node; } - @Override - public String getID() { - return "8b06613d-b5d0-47b5-a7e6-4900cea4823c"; - } - - @Override - public String getDescription() { - return "This sample Extractor generates custom features report containing data from incoming " + - "FontFeaturesData object."; + private static byte[] inputStreamToByteArray(InputStream is) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] bytes = new byte[1024]; + int length; + while ((length = is.read(bytes)) != -1) { + baos.write(bytes, 0, length); + } + return baos.toByteArray(); } } diff --git a/fontType-plugin/pom.xml b/fontType-plugin/pom.xml index dae47a3..162f09d 100644 --- a/fontType-plugin/pom.xml +++ b/fontType-plugin/pom.xml @@ -1,15 +1,20 @@ - - - verapdf-library-samples - org.verapdf - 1.0-SNAPSHOT - - 4.0.0 + + + verapdf-plugins + org.verapdf.plugins + 1.24.0 + + 4.0.0 - fontType-plugin + fontType-plugin + + + org.verapdf + core + + \ No newline at end of file diff --git a/fontType-plugin/src/main/java/org/verapdf/FontTypeExtractor.java b/fontType-plugin/src/main/java/org/verapdf/FontTypeExtractor.java index be524ed..9705bf9 100644 --- a/fontType-plugin/src/main/java/org/verapdf/FontTypeExtractor.java +++ b/fontType-plugin/src/main/java/org/verapdf/FontTypeExtractor.java @@ -1,21 +1,24 @@ package org.verapdf; -import org.apache.log4j.Logger; import org.verapdf.core.FeatureParsingException; import org.verapdf.features.AbstractFontFeaturesExtractor; import org.verapdf.features.FontFeaturesData; import org.verapdf.features.tools.FeatureTreeNode; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @author Maksim Bezrukov */ public class FontTypeExtractor extends AbstractFontFeaturesExtractor { - private static final Logger LOGGER = Logger - .getLogger(FontTypeExtractor.class); + private static final Logger LOGGER = Logger.getLogger(FontTypeExtractor.class.getCanonicalName()); private static final byte[] OPENTYPE_BEGIN = new byte[]{0x4f, 0x54, 0x54, 0x4f}; private static final byte[] PS_TYPE1_BEGIN = new byte[]{0x25, 0x21}; @@ -28,26 +31,28 @@ public class FontTypeExtractor extends AbstractFontFeaturesExtractor { public List getFontFeatures(FontFeaturesData fontFeaturesData) { List res = new ArrayList<>(); - String fontType = getFontType(fontFeaturesData.getStream()); try { + String fontType = getFontType(fontFeaturesData.getStream()); FeatureTreeNode fontTypeFromFile = FeatureTreeNode.createRootNode("fontTypeFromFile"); fontTypeFromFile.setValue(fontType); res.add(fontTypeFromFile); - } catch (FeatureParsingException e) { - LOGGER.error(e); + } catch (FeatureParsingException | IOException e) { + LOGGER.log(Level.WARNING, "Exception extracting font features", e); } return res; } - private static String getFontType(byte[] file) { - if (startsWith(file, PS_TYPE1_BEGIN)) { + private static String getFontType(InputStream file) throws IOException { + byte[] firstFour = getFirstFourBytes(file); + + if (startsWith(firstFour, PS_TYPE1_BEGIN)) { return "PS Type1"; - } else if (startsWith(file, OPENTYPE_BEGIN)) { + } else if (startsWith(firstFour, OPENTYPE_BEGIN)) { return "OpenType"; - } else if (startsWith(file, TRUE_TYPE_BEGIN) || startsWith(file, TRUE_TYPE_TRUE_BEGIN)) { + } else if (startsWith(firstFour, TRUE_TYPE_BEGIN) || startsWith(firstFour, TRUE_TYPE_TRUE_BEGIN)) { return "TrueType"; - } else if (file[0] == 1 && (file[1] >= 0 && file[1] <= 5)) { + } else if (firstFour[0] == 1 && (firstFour[1] >= 0 && firstFour[1] <= 5)) { return "CFF Type1"; } else { return UNDEFINED; @@ -66,12 +71,18 @@ private static boolean startsWith(byte[] orig, byte[] pattern) { return true; } - public String getDescription() { - return "This Extractor generates custom features report containing one entry " + - "that is the font type read from file."; - } - - public String getID() { - return "f1a805ae-62ae-4520-9d3b-489e5ff4af68"; + private static byte[] getFirstFourBytes(InputStream is) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] bytes = new byte[4]; + int obtainedBytes = 0; + int length; + while ((length = is.read(bytes)) != -1) { + baos.write(bytes, 0, length); + obtainedBytes += length; + if (obtainedBytes >= 4) { + break; + } + } + return baos.toByteArray(); } } diff --git a/iccdump-plugin/pom.xml b/iccdump-plugin/pom.xml index d3f3e94..6e08524 100644 --- a/iccdump-plugin/pom.xml +++ b/iccdump-plugin/pom.xml @@ -1,14 +1,20 @@ - + 4.0.0 - verapdf-library-samples - org.verapdf - 1.0-SNAPSHOT + verapdf-plugins + org.verapdf.plugins + 1.24.0 - 4.0.0 iccdump-plugin - \ No newline at end of file + + + org.verapdf + core + + + + diff --git a/iccdump-plugin/src/main/java/org/verapdf/ArgyllICCDumpCLIExtractor.java b/iccdump-plugin/src/main/java/org/verapdf/ArgyllICCDumpCLIExtractor.java index e62865f..cccf736 100644 --- a/iccdump-plugin/src/main/java/org/verapdf/ArgyllICCDumpCLIExtractor.java +++ b/iccdump-plugin/src/main/java/org/verapdf/ArgyllICCDumpCLIExtractor.java @@ -1,6 +1,5 @@ package org.verapdf; -import org.apache.log4j.Logger; import org.verapdf.core.FeatureParsingException; import org.verapdf.features.AbstractICCProfileFeaturesExtractor; import org.verapdf.features.ICCProfileFeaturesData; @@ -10,14 +9,15 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @author Maksim Bezrukov */ public class ArgyllICCDumpCLIExtractor extends AbstractICCProfileFeaturesExtractor { - private static final Logger LOGGER = Logger - .getLogger(ArgyllICCDumpCLIExtractor.class); + private static final Logger LOGGER = Logger.getLogger(ArgyllICCDumpCLIExtractor.class.getCanonicalName()); private File temp; @@ -26,7 +26,7 @@ public List getICCProfileFeatures(ICCProfileFeaturesData iccPro try { temp = File.createTempFile("tempICC", ".icc"); } catch (IOException e) { - LOGGER.error(e); + LOGGER.log(Level.WARNING, "IO Exception when creating temp file", e); return null; } @@ -35,12 +35,12 @@ public List getICCProfileFeatures(ICCProfileFeaturesData iccPro try { res = execCLI(); } catch (InterruptedException | FeatureParsingException e) { - LOGGER.error(e); + LOGGER.log(Level.WARNING, "Problem Executing the Argyll ICC Extractor", e); } try { clean(); } catch (IOException e) { - LOGGER.error(e); + LOGGER.log(Level.WARNING, "IO Exception during cleanup", e); } return res; @@ -50,7 +50,14 @@ private List execCLI() throws InterruptedException, FeaturePars List res = new ArrayList<>(); try { Runtime rt = Runtime.getRuntime(); - String[] str = new String[]{getFolderPath().toString() + "/iccdump", "-v", "1", temp.getAbsolutePath()}; + String cliPath = getAttributes().get("cliPath"); + if (cliPath == null) { + FeatureTreeNode error = FeatureTreeNode.createRootNode("error"); + error.setValue("Can not obtain iccdump path"); + res.add(error); + return res; + } + String[] str = new String[]{cliPath, "-v", "1", temp.getAbsolutePath()}; Process pr = rt.exec(str); BufferedReader reader = new BufferedReader(new InputStreamReader(pr.getInputStream())); @@ -64,7 +71,7 @@ private List execCLI() throws InterruptedException, FeaturePars int eqind = line.indexOf("="); String name = line.substring(0, eqind).trim(); String value = line.substring(eqind + 1).trim(); - FeatureTreeNode entry = FeatureTreeNode.createChildNode("headerEntry", header); + FeatureTreeNode entry = header.addChild("headerEntry"); entry.setAttribute("name", name); entry.setAttribute("value", value); line = reader.readLine(); @@ -79,7 +86,7 @@ private List execCLI() throws InterruptedException, FeaturePars int spind = line.trim().indexOf(" "); String name = line.trim().substring(0, spind); String value = line.trim().substring(spind).trim(); - FeatureTreeNode.createChildNode(name, tag).setValue(value); + tag.addChild(name).setValue(value); line = reader.readLine(); } res.add(tag); @@ -89,7 +96,7 @@ private List execCLI() throws InterruptedException, FeaturePars } pr.waitFor(); } catch (IOException e) { - LOGGER.error(e); + LOGGER.log(Level.WARNING, "IO/Exception when reading object stream", e); } if (res.isEmpty()) { @@ -102,28 +109,19 @@ private List execCLI() throws InterruptedException, FeaturePars return res; } - private void generateICCProfile(byte[] icc) { - try { - FileOutputStream out = new FileOutputStream(this.temp); - out.write(icc); - out.close(); + private void generateICCProfile(InputStream icc) { + try (FileOutputStream out = new FileOutputStream(this.temp)){ + byte[] bytes = new byte[1024]; + int length; + while ((length = icc.read(bytes)) != -1) { + out.write(bytes, 0, length); + } } catch (IOException e) { - LOGGER.error(e); + LOGGER.log(Level.WARNING, "IO/Exception when outputing icc to temp file", e); } } private void clean() throws IOException { Files.deleteIfExists(temp.toPath()); } - - @Override - public String getID() { - return "640a9bd1-219f-42db-8d9d-7bd67de48fce"; - } - - @Override - public String getDescription() { - return "This Extractor generates custom features report containing header and information about tags from " + - "the iccProfile using the Argyll iccdump command line application."; - } } diff --git a/iccprofileSample-plugin/pom.xml b/iccprofileSample-plugin/pom.xml index 858156e..1048e26 100644 --- a/iccprofileSample-plugin/pom.xml +++ b/iccprofileSample-plugin/pom.xml @@ -1,15 +1,35 @@ - - - verapdf-library-samples - org.verapdf - 1.0-SNAPSHOT - - 4.0.0 + + 4.0.0 + + verapdf-plugins + org.verapdf.plugins + 1.24.0 + - iccprofileSample-plugin + iccprofileSample-plugin + + + org.verapdf + core + - \ No newline at end of file + + javax.xml.bind + jaxb-api + + + + com.sun.xml.bind + jaxb-impl + + + + com.sun.xml.bind + jaxb-core + + + + diff --git a/iccprofileSample-plugin/src/main/java/org/verapdf/ICCProfileSampleExtractor.java b/iccprofileSample-plugin/src/main/java/org/verapdf/ICCProfileSampleExtractor.java index 78dda51..9c6dedb 100644 --- a/iccprofileSample-plugin/src/main/java/org/verapdf/ICCProfileSampleExtractor.java +++ b/iccprofileSample-plugin/src/main/java/org/verapdf/ICCProfileSampleExtractor.java @@ -1,35 +1,39 @@ package org.verapdf; -import org.apache.log4j.Logger; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.bind.DatatypeConverter; + import org.verapdf.core.FeatureParsingException; import org.verapdf.features.AbstractICCProfileFeaturesExtractor; import org.verapdf.features.ICCProfileFeaturesData; import org.verapdf.features.tools.FeatureTreeNode; -import javax.xml.bind.DatatypeConverter; -import java.util.ArrayList; -import java.util.List; - /** * @author Maksim Bezrukov */ public class ICCProfileSampleExtractor extends AbstractICCProfileFeaturesExtractor { - private static final Logger LOGGER = Logger - .getLogger(ICCProfileSampleExtractor.class); + private static final Logger LOGGER = Logger.getLogger(ICCProfileSampleExtractor.class.getCanonicalName()); @Override public List getICCProfileFeatures(ICCProfileFeaturesData iccProfileFeaturesData) { List res = new ArrayList<>(); try { - FeatureTreeNode stream = FeatureTreeNode.createRootNode("streamContent"); - stream.setValue(DatatypeConverter.printHexBinary(iccProfileFeaturesData.getStream())); - res.add(stream); +// FeatureTreeNode stream = FeatureTreeNode.createRootNode("streamContent"); +// stream.setValue(DatatypeConverter.printHexBinary(inputStreamToByteArray(iccProfileFeaturesData.getStream()))); +// res.add(stream); - byte[] meta = iccProfileFeaturesData.getMetadata(); + InputStream meta = iccProfileFeaturesData.getMetadata(); if (meta != null) { FeatureTreeNode metadata = FeatureTreeNode.createRootNode("metadataStreamContent"); - metadata.setValue(DatatypeConverter.printHexBinary(meta)); + metadata.setValue(DatatypeConverter.printHexBinary(inputStreamToByteArray(meta))); res.add(metadata); } @@ -42,15 +46,15 @@ public List getICCProfileFeatures(ICCProfileFeaturesData iccPro for (int i = 0; i < range.size(); ++i) { Double obj = range.get(i); if (obj != null) { - FeatureTreeNode entry = FeatureTreeNode.createChildNode("entry", rangeNode); + FeatureTreeNode entry = rangeNode.addChild("entry"); entry.setValue(obj.toString()); entry.setAttribute("index", String.valueOf(i)); } } } - } catch (FeatureParsingException e) { - LOGGER.error("Some fail in logic", e); + } catch (FeatureParsingException | IOException e) { + LOGGER.log(Level.WARNING, "Some failure in ICC scampler", e); } return res; } @@ -65,14 +69,13 @@ private static FeatureTreeNode addObjectNode(String nodeName, Object toAdd, List return node; } - @Override - public String getID() { - return "ad7c3157-5865-4e8a-8f47-57f81580b612"; - } - - @Override - public String getDescription() { - return "This sample Extractor generates custom features report containing data from incoming " + - "ICCProfileFeaturesData object."; + private static byte[] inputStreamToByteArray(InputStream is) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] bytes = new byte[1024]; + int length; + while ((length = is.read(bytes)) != -1) { + baos.write(bytes, 0, length); + } + return baos.toByteArray(); } } diff --git a/imageSample-plugin/pom.xml b/imageSample-plugin/pom.xml index 08aca20..22d7039 100644 --- a/imageSample-plugin/pom.xml +++ b/imageSample-plugin/pom.xml @@ -1,15 +1,36 @@ - + + 4.0.0 - verapdf-library-samples - org.verapdf - 1.0-SNAPSHOT + verapdf-plugins + org.verapdf.plugins + 1.24.0 - 4.0.0 imageSample-plugin + + + org.verapdf + core + + + + javax.xml.bind + jaxb-api + + + + com.sun.xml.bind + jaxb-impl + + + + com.sun.xml.bind + jaxb-core + + - \ No newline at end of file + diff --git a/imageSample-plugin/src/main/java/org/verapdf/ImageSampleExtractor.java b/imageSample-plugin/src/main/java/org/verapdf/ImageSampleExtractor.java index a4b50f1..21eb0a7 100644 --- a/imageSample-plugin/src/main/java/org/verapdf/ImageSampleExtractor.java +++ b/imageSample-plugin/src/main/java/org/verapdf/ImageSampleExtractor.java @@ -1,36 +1,39 @@ package org.verapdf; -import org.apache.log4j.Logger; import org.verapdf.core.FeatureParsingException; import org.verapdf.features.AbstractImageFeaturesExtractor; import org.verapdf.features.ImageFeaturesData; import org.verapdf.features.tools.FeatureTreeNode; import javax.xml.bind.DatatypeConverter; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @author Maksim Bezrukov */ public class ImageSampleExtractor extends AbstractImageFeaturesExtractor { - private static final Logger LOGGER = Logger - .getLogger(ImageSampleExtractor.class); + private static final Logger LOGGER = Logger.getLogger(ImageSampleExtractor.class.getCanonicalName()); @Override public List getImageFeatures(ImageFeaturesData imageFeaturesData) { List res = new ArrayList<>(); try { - FeatureTreeNode stream = FeatureTreeNode.createRootNode("streamContent"); - stream.setValue(DatatypeConverter.printHexBinary(imageFeaturesData.getStream())); - res.add(stream); +// FeatureTreeNode stream = FeatureTreeNode.createRootNode("streamContent"); +// stream.setValue(DatatypeConverter.printHexBinary(inputStreamToByteArray(imageFeaturesData.getStream()))); +// res.add(stream); - byte[] meta = imageFeaturesData.getMetadata(); + InputStream meta = imageFeaturesData.getMetadata(); if (meta != null) { FeatureTreeNode metadata = FeatureTreeNode.createRootNode("metadataStreamContent"); - metadata.setValue(DatatypeConverter.printHexBinary(meta)); + metadata.setValue(DatatypeConverter.printHexBinary(inputStreamToByteArray(meta))); res.add(metadata); } @@ -42,26 +45,26 @@ public List getImageFeatures(ImageFeaturesData imageFeaturesDat FeatureTreeNode filtersNode = FeatureTreeNode.createRootNode("filters"); res.add(filtersNode); for (ImageFeaturesData.Filter filter : filters) { - FeatureTreeNode filterNode = FeatureTreeNode.createChildNode("filter", filtersNode); + FeatureTreeNode filterNode = filtersNode.addChild("filter"); filterNode.setAttribute("name", String.valueOf(filter.getName())); Map properties = filter.getProperties(); if (properties != null) { for (Map.Entry entry : properties.entrySet()) { - FeatureTreeNode.createChildNode(String.valueOf(entry.getKey()), filterNode).setValue(String.valueOf(entry.getValue())); + filterNode.addChild(String.valueOf(entry.getKey())).setValue(String.valueOf(entry.getValue())); } } //Special case for JBIG2Decode filter - byte[] streamF = filter.getStream(); - if (streamF != null) { - String streamContent = DatatypeConverter.printHexBinary(streamF); - FeatureTreeNode.createChildNode("stream", filterNode).setValue(streamContent); - } +// InputStream streamF = filter.getStream(); +// if (streamF != null) { +// String streamContent = DatatypeConverter.printHexBinary(inputStreamToByteArray(streamF)); +// filterNode.addChild("stream").setValue(streamContent); +// } } } - } catch (FeatureParsingException e) { - LOGGER.error("Some fail in logic", e); + } catch (FeatureParsingException | IOException e) { + LOGGER.log(Level.WARNING, "Some fail in logic", e); } return res; } @@ -76,14 +79,13 @@ private static FeatureTreeNode addObjectNode(String nodeName, Object toAdd, List return node; } - @Override - public String getID() { - return "163e5726-3c5a-4701-abdc-428005c8c39d"; - } - - @Override - public String getDescription() { - return "This sample Extractor generates custom features report containing data from incoming " + - "ImageFeaturesData object."; + private static byte[] inputStreamToByteArray(InputStream is) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] bytes = new byte[1024]; + int length; + while ((length = is.read(bytes)) != -1) { + baos.write(bytes, 0, length); + } + return baos.toByteArray(); } } diff --git a/jpylyzer-plugin/.gitignore b/jpylyzer-plugin/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/jpylyzer-plugin/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/jpylyzer-plugin/pom.xml b/jpylyzer-plugin/pom.xml index 42a2e03..e8fb049 100644 --- a/jpylyzer-plugin/pom.xml +++ b/jpylyzer-plugin/pom.xml @@ -2,14 +2,34 @@ + 4.0.0 - verapdf-library-samples - org.verapdf - 1.0-SNAPSHOT + verapdf-plugins + org.verapdf.plugins + 1.24.0 - 4.0.0 jpylyzer-plugin + + + org.verapdf + core + + + + javax.xml.bind + jaxb-api + + + + com.sun.xml.bind + jaxb-impl + - \ No newline at end of file + + com.sun.xml.bind + jaxb-core + + + diff --git a/jpylyzer-plugin/src/main/java/org/verapdf/JpylyzerConfig.java b/jpylyzer-plugin/src/main/java/org/verapdf/JpylyzerConfig.java deleted file mode 100644 index 167b164..0000000 --- a/jpylyzer-plugin/src/main/java/org/verapdf/JpylyzerConfig.java +++ /dev/null @@ -1,134 +0,0 @@ -/** - * - */ -package org.verapdf; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.io.*; - -/** - * @author Maksim Bezrukov - */ -@XmlRootElement(namespace = "http://www.verapdf.org/JpylyzerConfig", name = "jpylyzerConfig") -final class JpylyzerConfig { - - @XmlElement - private final String cliPath; - @XmlElement - private final String outFolder; - @XmlElement - private final boolean isVerbose; - - private JpylyzerConfig() { - this("", "", false); - } - - private JpylyzerConfig(String outFolder, String cliPath, boolean isVerbose) { - this.cliPath = cliPath; - this.outFolder = outFolder; - this.isVerbose = isVerbose; - } - - public String getOutFolder() { - return outFolder; - } - - public boolean isVerbose() { - return isVerbose; - } - - public String getCliPath() { - return cliPath; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - JpylyzerConfig config = (JpylyzerConfig) o; - - if (isVerbose != config.isVerbose) return false; - if (cliPath != null ? !cliPath.equals(config.cliPath) : config.cliPath != null) return false; - return outFolder != null ? outFolder.equals(config.outFolder) : config.outFolder == null; - - } - - @Override - public int hashCode() { - int result = cliPath != null ? cliPath.hashCode() : 0; - result = 31 * result + (outFolder != null ? outFolder.hashCode() : 0); - result = 31 * result + (isVerbose ? 1 : 0); - return result; - } - - static JpylyzerConfig defaultInstance() { - return new JpylyzerConfig(null, null, false); - } - - static JpylyzerConfig fromValues(final String cliPath, final String outFolder, final boolean isVerbose) { - return new JpylyzerConfig(cliPath, outFolder, isVerbose); - } - - static String toXml(final JpylyzerConfig toConvert, Boolean prettyXml) - throws JAXBException, IOException { - String retVal = ""; - try (StringWriter writer = new StringWriter()) { - toXml(toConvert, writer, prettyXml); - retVal = writer.toString(); - return retVal; - } - } - - static JpylyzerConfig fromXml(final String toConvert) - throws JAXBException { - try (StringReader reader = new StringReader(toConvert)) { - return fromXml(reader); - } - } - - static void toXml(final JpylyzerConfig toConvert, - final OutputStream stream, Boolean prettyXml) throws JAXBException { - Marshaller varMarshaller = getMarshaller(prettyXml); - varMarshaller.marshal(toConvert, stream); - } - - static JpylyzerConfig fromXml(final InputStream toConvert) - throws JAXBException { - Unmarshaller stringUnmarshaller = getUnmarshaller(); - return (JpylyzerConfig) stringUnmarshaller.unmarshal(toConvert); - } - - static void toXml(final JpylyzerConfig toConvert, final Writer writer, - Boolean prettyXml) throws JAXBException { - Marshaller varMarshaller = getMarshaller(prettyXml); - varMarshaller.marshal(toConvert, writer); - } - - static JpylyzerConfig fromXml(final Reader toConvert) - throws JAXBException { - Unmarshaller stringUnmarshaller = getUnmarshaller(); - return (JpylyzerConfig) stringUnmarshaller.unmarshal(toConvert); - } - - private static Unmarshaller getUnmarshaller() throws JAXBException { - JAXBContext context = JAXBContext - .newInstance(JpylyzerConfig.class); - Unmarshaller unmarshaller = context.createUnmarshaller(); - return unmarshaller; - } - - private static Marshaller getMarshaller(Boolean setPretty) - throws JAXBException { - JAXBContext context = JAXBContext - .newInstance(JpylyzerConfig.class); - Marshaller marshaller = context.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, setPretty); - return marshaller; - } -} diff --git a/jpylyzer-plugin/src/main/java/org/verapdf/JpylyzerExtractor.java b/jpylyzer-plugin/src/main/java/org/verapdf/JpylyzerExtractor.java index fd2bc5e..321d898 100644 --- a/jpylyzer-plugin/src/main/java/org/verapdf/JpylyzerExtractor.java +++ b/jpylyzer-plugin/src/main/java/org/verapdf/JpylyzerExtractor.java @@ -7,7 +7,6 @@ import org.w3c.dom.Document; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -16,8 +15,6 @@ import javax.xml.xpath.XPathFactory; import java.io.*; import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.*; import java.util.ArrayList; import java.util.List; @@ -41,9 +38,8 @@ public List getImageFeatures(ImageFeaturesData imageFeaturesDat List result = new ArrayList<>(); try { try { - JpylyzerConfig config = getConfig(result); File temp = generateTempFile(imageFeaturesData.getStream(), "jpx"); - exec(result, config, temp); + exec(result, temp); } catch (IOException | InterruptedException | URISyntaxException e) { FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); node.setValue("Error in execution. Error message: " + e.getMessage()); @@ -55,18 +51,22 @@ public List getImageFeatures(ImageFeaturesData imageFeaturesDat return result; } - private File generateTempFile(byte[] stream, String name) throws IOException { + private File generateTempFile(InputStream stream, String name) throws IOException { File fold = getTempFolder(); File temp = File.createTempFile(name == null ? "" : name, "", fold); temp.deleteOnExit(); FileOutputStream out = new FileOutputStream(temp); - out.write(stream); + byte[] bytes = new byte[1024]; + int length; + while ((length = stream.read(bytes)) != -1) { + out.write(bytes, 0, length); + } out.close(); return temp; } - private void exec(List nodes, JpylyzerConfig config, File temp) throws InterruptedException, FeatureParsingException, IOException, URISyntaxException { - String scriptPath = getScriptPath(config); + private void exec(List nodes, File temp) throws InterruptedException, FeatureParsingException, IOException, URISyntaxException { + String scriptPath = getAttributes().get("cliPath"); if (scriptPath == null) { FeatureTreeNode error = FeatureTreeNode.createRootNode("error"); error.setValue("Can not obtain jpylyzer script or binary"); @@ -74,7 +74,8 @@ private void exec(List nodes, JpylyzerConfig config, File temp) return; } String[] args; - if (config.isVerbose()) { + String isVerbose = getAttributes().get("isVerbose"); + if (isVerbose != null && Boolean.valueOf(isVerbose)) { args = new String[3]; args[0] = scriptPath; args[1] = "--verbose"; @@ -86,7 +87,7 @@ private void exec(List nodes, JpylyzerConfig config, File temp) } Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(args); - File out = getOutFile(config, nodes); + File out = getOutFile(getAttributes().get("outFolder"), nodes); FileOutputStream outStream = new FileOutputStream(out); byte[] buffer = new byte[1024]; int bytesRead; @@ -100,7 +101,7 @@ private void exec(List nodes, JpylyzerConfig config, File temp) nodes.add(node); try { - String isValidJP2Value = getXMLNodeValue("//jpylyzer/isValidJP2", out); + String isValidJP2Value = getXMLNodeValue("//jpylyzer/file/isValid", out); FeatureTreeNode validationNode = FeatureTreeNode.createRootNode("isValidJP2"); validationNode.setValue(isValidJP2Value); nodes.add(validationNode); @@ -119,12 +120,12 @@ private static String getXMLNodeValue(String xPath, File xml) throws ParserConfi return xp.evaluate(document); } - private static File getOutFile(JpylyzerConfig config, List nodes) throws FeatureParsingException, IOException { - if (config.getOutFolder() == null) { + private static File getOutFile(String outPath, List nodes) throws FeatureParsingException, IOException { + if (outPath == null) { File tempFolder = getTempFolder(); return getOutFileInFolder(tempFolder); } else { - File outFolder = new File(config.getOutFolder()); + File outFolder = new File(outPath); if (outFolder.isDirectory()) { return getOutFileInFolder(outFolder); } else { @@ -152,48 +153,4 @@ private static File getOutFileInFolder(File folder) throws IOException { out.deleteOnExit(); return out; } - - private JpylyzerConfig getConfig(List nodes) throws FeatureParsingException { - JpylyzerConfig config = JpylyzerConfig.defaultInstance(); - File conf = getConfigFile(); - if (conf.isFile() && conf.canRead()) { - try { - config = JpylyzerConfig.fromXml(new FileInputStream(conf)); - } catch (JAXBException | FileNotFoundException e) { - FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); - node.setValue("Config file contains wrong syntax. Error message: " + e.getMessage()); - nodes.add(node); - } - } - return config; - } - - private File getConfigFile() { - return new File(getFolderPath().toFile(), "config.xml"); - } - - @Override - public String getID() { - return "3ee4e6b3-af6b-4510-8b95-1af29fc81629"; - } - - @Override - public String getDescription() { - return "Extracts features of the Image using Jpylyzer"; - } - - private String getScriptPath(JpylyzerConfig config) { - String cliPath = config.getCliPath(); - if (cliPath == null) { - cliPath = getFolderPath().toString() + "/jpylyzer-master/jpylyzer/jpylyzer.py"; - } - - File cli = new File(cliPath); - if (!(cli.exists() && cli.isFile())) { - return null; - } - return cliPath; - } } - - diff --git a/license/template/license.txt b/license/template/license.txt new file mode 100644 index 0000000..03f6d2b --- /dev/null +++ b/license/template/license.txt @@ -0,0 +1,18 @@ +This file is part of ${project.name}, a module of the veraPDF project. +Copyright (c) ${project.inceptionYear}, ${owner} <${email}> +All rights reserved. + +${project.name} is free software: you can redistribute it and/or modify +it under the terms of either: + +The GNU General public license GPLv3+. +You should have received a copy of the GNU General Public License +along with ${project.name} as the LICENSE.GPL file in the root of the source +tree. If not, see http://www.gnu.org/licenses/ or +https://www.gnu.org/licenses/gpl-3.0.en.html. + +The Mozilla Public License MPLv2+. +You should have received a copy of the Mozilla Public License along with +${project.name} as the LICENSE.MPL file in the root of the source tree. +If a copy of the MPL was not distributed with this file, you can obtain one at +http://mozilla.org/MPL/2.0/. diff --git a/mediaconch/pom.xml b/mediaconch/pom.xml index bd1430a..ccb06c2 100644 --- a/mediaconch/pom.xml +++ b/mediaconch/pom.xml @@ -2,14 +2,35 @@ + 4.0.0 - verapdf-library-samples - org.verapdf - 1.0-SNAPSHOT + verapdf-plugins + org.verapdf.plugins + 1.24.0 - 4.0.0 mediaconch-plugin + + + org.verapdf + core + + + + javax.xml.bind + jaxb-api + + + + com.sun.xml.bind + jaxb-impl + + + + com.sun.xml.bind + jaxb-core + + - \ No newline at end of file + diff --git a/mediaconch/src/main/java/org/verapdf/MediaConchConfig.java b/mediaconch/src/main/java/org/verapdf/MediaConchConfig.java deleted file mode 100644 index 970455c..0000000 --- a/mediaconch/src/main/java/org/verapdf/MediaConchConfig.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * - */ -package org.verapdf; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.io.*; - -/** - * @author Maksim Bezrukov - */ -@XmlRootElement(namespace = "http://www.verapdf.org/MediaConchConfig", name = "mediaconchConfig") -final class MediaConchConfig { - - @XmlElement - private final String cliPath; - @XmlElement - private final String outFolder; - - private MediaConchConfig() { - this("", ""); - } - - private MediaConchConfig(String outFolder, String cliPath) { - this.outFolder = outFolder; - this.cliPath = cliPath; - } - - public String getCliPath() { - return cliPath; - } - - public String getOutFolder() { - return outFolder; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - MediaConchConfig that = (MediaConchConfig) o; - - if (cliPath != null ? !cliPath.equals(that.cliPath) : that.cliPath != null) return false; - return !(outFolder != null ? !outFolder.equals(that.outFolder) : that.outFolder != null); - - } - - @Override - public int hashCode() { - int result = cliPath != null ? cliPath.hashCode() : 0; - result = 31 * result + (outFolder != null ? outFolder.hashCode() : 0); - return result; - } - - static MediaConchConfig defaultInstance() { - return new MediaConchConfig("mediaconch", null); - } - - static MediaConchConfig fromValues(final String cliPath, final String outFolder) { - return new MediaConchConfig(cliPath, outFolder); - } - - static String toXml(final MediaConchConfig toConvert, Boolean prettyXml) - throws JAXBException, IOException { - String retVal = ""; - try (StringWriter writer = new StringWriter()) { - toXml(toConvert, writer, prettyXml); - retVal = writer.toString(); - return retVal; - } - } - - static MediaConchConfig fromXml(final String toConvert) - throws JAXBException { - try (StringReader reader = new StringReader(toConvert)) { - return fromXml(reader); - } - } - - static void toXml(final MediaConchConfig toConvert, - final OutputStream stream, Boolean prettyXml) throws JAXBException { - Marshaller varMarshaller = getMarshaller(prettyXml); - varMarshaller.marshal(toConvert, stream); - } - - static MediaConchConfig fromXml(final InputStream toConvert) - throws JAXBException { - Unmarshaller stringUnmarshaller = getUnmarshaller(); - return (MediaConchConfig) stringUnmarshaller.unmarshal(toConvert); - } - - static void toXml(final MediaConchConfig toConvert, final Writer writer, - Boolean prettyXml) throws JAXBException { - Marshaller varMarshaller = getMarshaller(prettyXml); - varMarshaller.marshal(toConvert, writer); - } - - static MediaConchConfig fromXml(final Reader toConvert) - throws JAXBException { - Unmarshaller stringUnmarshaller = getUnmarshaller(); - return (MediaConchConfig) stringUnmarshaller.unmarshal(toConvert); - } - - private static Unmarshaller getUnmarshaller() throws JAXBException { - JAXBContext context = JAXBContext - .newInstance(MediaConchConfig.class); - Unmarshaller unmarshaller = context.createUnmarshaller(); - return unmarshaller; - } - - private static Marshaller getMarshaller(Boolean setPretty) - throws JAXBException { - JAXBContext context = JAXBContext - .newInstance(MediaConchConfig.class); - Marshaller marshaller = context.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, setPretty); - return marshaller; - } -} diff --git a/mediaconch/src/main/java/org/verapdf/MediaConchExtractor.java b/mediaconch/src/main/java/org/verapdf/MediaConchExtractor.java index 40a54b8..07d9f97 100644 --- a/mediaconch/src/main/java/org/verapdf/MediaConchExtractor.java +++ b/mediaconch/src/main/java/org/verapdf/MediaConchExtractor.java @@ -5,7 +5,6 @@ import org.verapdf.features.EmbeddedFileFeaturesData; import org.verapdf.features.tools.FeatureTreeNode; -import javax.xml.bind.JAXBException; import java.io.*; import java.util.*; @@ -14,131 +13,98 @@ */ public class MediaConchExtractor extends AbstractEmbeddedFileFeaturesExtractor { - @Override - public List getEmbeddedFileFeatures(EmbeddedFileFeaturesData embeddedFileFeaturesData) { - if (!isValidType(embeddedFileFeaturesData.getSubtype())) { - return null; - } - List result = new ArrayList<>(); - try { - try { - MediaConchConfig config = getConfig(result); - File temp = generateTempFile(embeddedFileFeaturesData.getStream(), embeddedFileFeaturesData.getName()); - execCLI(result, config, temp); - } catch (IOException | InterruptedException e) { - FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); - node.setValue("Error in execution. Error message: " + e.getMessage()); - result.add(node); - } - } catch (FeatureParsingException e) { - throw new IllegalStateException(e); - } - return result; - } + @Override + public List getEmbeddedFileFeatures(EmbeddedFileFeaturesData embeddedFileFeaturesData) { + if (!isValidType(embeddedFileFeaturesData.getSubtype())) { + return null; + } + List result = new ArrayList<>(); + try { + try { + File temp = generateTempFile(embeddedFileFeaturesData.getStream(), embeddedFileFeaturesData.getName()); + execCLI(result, temp); + } catch (IOException | InterruptedException e) { + FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); + node.setValue("Error in execution. Error message: " + e.getMessage()); + result.add(node); + } + } catch (FeatureParsingException e) { + throw new IllegalStateException(e); + } + return result; + } - private File generateTempFile(byte[] stream, String name) throws IOException { - File fold = getTempFolder(); - File temp = File.createTempFile(name == null ? "" : name, "", fold); - temp.deleteOnExit(); - FileOutputStream out = new FileOutputStream(temp); - out.write(stream); - out.close(); - return temp; - } + private File generateTempFile(InputStream stream, String name) throws IOException { + File fold = getTempFolder(); + File temp = File.createTempFile(name == null ? "" : name, "", fold); + temp.deleteOnExit(); + FileOutputStream out = new FileOutputStream(temp); + byte[] bytes = new byte[1024]; + int length; + while ((length = stream.read(bytes)) != -1) { + out.write(bytes, 0, length); + } + out.close(); + return temp; + } - private void execCLI(List nodes, MediaConchConfig config, File temp) throws InterruptedException, FeatureParsingException, IOException { - List res = new ArrayList<>(); - Runtime rt = Runtime.getRuntime(); - String cliPath; - String configCliPath = config.getCliPath(); - if (configCliPath == null || configCliPath.isEmpty()) { - cliPath = "mediaconch"; - } else { - cliPath = configCliPath; - } - File out = getOutFile(config, nodes); - String[] str = new String[]{cliPath, "-mc", "-fx", temp.getCanonicalPath()}; - Process pr = rt.exec(str); - FileOutputStream outStream = new FileOutputStream(out); - byte[] buffer = new byte[1024]; - int bytesRead; - while ((bytesRead = pr.getInputStream().read(buffer)) != -1) - { - outStream.write(buffer, 0, bytesRead); - } - pr.waitFor(); - FeatureTreeNode node = FeatureTreeNode.createRootNode("resultPath"); - node.setValue(out.getCanonicalPath()); - nodes.add(node); + private void execCLI(List nodes, File temp) throws InterruptedException, FeatureParsingException, IOException { + Runtime rt = Runtime.getRuntime(); + String cliPath; + String configCliPath = getAttributes().get("cliPath"); + if (configCliPath == null || configCliPath.isEmpty()) { + cliPath = "mediaconch"; + } else { + cliPath = configCliPath; + } + File out = getOutFile(getAttributes().get("outFolder"), nodes); + String[] str = new String[]{cliPath, "-mc", "-fx", temp.getCanonicalPath()}; + Process pr = rt.exec(str); + FileOutputStream outStream = new FileOutputStream(out); + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = pr.getInputStream().read(buffer)) != -1) { + outStream.write(buffer, 0, bytesRead); + } + pr.waitFor(); + FeatureTreeNode node = FeatureTreeNode.createRootNode("resultPath"); + node.setValue(out.getCanonicalPath()); + nodes.add(node); - } + } - private File getOutFile(MediaConchConfig config, List nodes) throws FeatureParsingException, IOException { - if (config.getOutFolder() == null) { - File tempFolder = getTempFolder(); - File res = getOutFileInFolder(tempFolder); - return res; - } else { - File outFolder = new File(config.getOutFolder()); - if (outFolder.isDirectory()) { - File res = getOutFileInFolder(outFolder); - return res; - } else { - FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); - node.setValue("Config file contains out folder path but it doesn't link a directory."); - nodes.add(node); - File tempFolder = getTempFolder(); - File res = getOutFileInFolder(tempFolder); - return res; - } - } - } + private File getOutFile(String outFolderPath, List nodes) throws FeatureParsingException, IOException { + if (outFolderPath == null) { + return getOutFileInFolder(getTempFolder()); + } else { + File outFolder = new File(outFolderPath); + if (outFolder.isDirectory()) { + return getOutFileInFolder(outFolder); + } else { + FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); + node.setValue("Config file contains out folder path but it doesn't link a directory."); + nodes.add(node); + return getOutFileInFolder(getTempFolder()); + } + } + } - private File getTempFolder() { - File tempDir = new File(System.getProperty("java.io.tmpdir")); - File tempFolder = new File(tempDir, "veraPDFMediaConchPluginTemp"); - if (!tempFolder.exists()) { - tempFolder.mkdir(); - } - return tempFolder; - } + private File getTempFolder() { + File tempDir = new File(System.getProperty("java.io.tmpdir")); + File tempFolder = new File(tempDir, "veraPDFMediaConchPluginTemp"); + if (!tempFolder.exists()) { + tempFolder.mkdir(); + } + return tempFolder; + } - private File getOutFileInFolder(File folder) throws IOException { - File out = File.createTempFile("veraPDF_MediaConch_Plugin_out", ".xml", folder); - return out; - } + private File getOutFileInFolder(File folder) throws IOException { + return File.createTempFile("veraPDF_MediaConch_Plugin_out", ".xml", folder); + } - private MediaConchConfig getConfig(List nodes) throws FeatureParsingException { - MediaConchConfig config = MediaConchConfig.defaultInstance(); - File conf = getConfigFile(); - if (conf.isFile() && conf.canRead()) { - try { - config = MediaConchConfig.fromXml(new FileInputStream(conf)); - } catch (JAXBException | FileNotFoundException e) { - FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); - node.setValue("Config file contains wrong syntax. Error message: " + e.getMessage()); - nodes.add(node); - } - } - return config; - } + private boolean isValidType(String type) { + return type.toLowerCase().startsWith("video/"); + } - private File getConfigFile() { - return new File(getFolderPath().toFile(), "config.xml"); - } - - private boolean isValidType(String type) { - return type.toLowerCase().startsWith("video/"); - } - - @Override - public String getID() { - return "8725b233-1597-490e-9b45-b989303d2c5b"; - } - - @Override - public String getDescription() { - //TODO: check this description - return "Generates mediaconch report of the given embedded video file"; - } } + diff --git a/metsMetadata-plugin/pom.xml b/metsMetadata-plugin/pom.xml index b25000d..1287004 100644 --- a/metsMetadata-plugin/pom.xml +++ b/metsMetadata-plugin/pom.xml @@ -2,33 +2,70 @@ + 4.0.0 - verapdf-library-samples - org.verapdf - 1.0-SNAPSHOT + verapdf-plugins + org.verapdf.plugins + 1.24.0 - 4.0.0 metsMetadata-plugin - au.edu.apsr.mtk + org.verapdf mets - 1.0 - system - ${project.basedir}/src/main/resources/mets-api.jar + 1.0.0 + + + + org.verapdf + core + + + + javax.xml.bind + jaxb-api + + + + com.sun.xml.bind + jaxb-impl + + + + com.sun.xml.bind + jaxb-core - - org.verapdf - feature-report - [0.11.0,0.12.0) - - - org.verapdf - verapdf-xmp-core - [0.11.0,0.12.0) - - \ No newline at end of file + + + + org.apache.maven.plugins + maven-assembly-plugin + + + + org.verapdf.gui.PDFValidationApplication + + + + src/assembly/src.xml + + false + + + + make-assembly + package + + single + + + + + + + + diff --git a/metsMetadata-plugin/src/assembly/src.xml b/metsMetadata-plugin/src/assembly/src.xml new file mode 100644 index 0000000..01e6503 --- /dev/null +++ b/metsMetadata-plugin/src/assembly/src.xml @@ -0,0 +1,25 @@ + + + jar-with-dependencies + + jar + + false + + + false + + org.verapdf:core + javax.xml.bind:jaxb-api + com.sun.xml.bind:jaxb-impl + com.sun.xml.bind:jaxb-core + + / + true + true + runtime + + + \ No newline at end of file diff --git a/metsMetadata-plugin/src/main/java/org/verapdf/METSConfig.java b/metsMetadata-plugin/src/main/java/org/verapdf/METSConfig.java deleted file mode 100644 index ae3c374..0000000 --- a/metsMetadata-plugin/src/main/java/org/verapdf/METSConfig.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.verapdf; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.io.*; - -/** - * @author Maksim Bezrukov - */ -@XmlRootElement(namespace = "http://www.verapdf.org/METSConfig", name = "metsConfig") -final class METSConfig { - - @XmlElement - private final String outFolder; - - private METSConfig() { - this(""); - } - - private METSConfig(String outFolder) { - this.outFolder = outFolder; - } - - public String getOutFolder() { - return outFolder; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - METSConfig that = (METSConfig) o; - - return !(outFolder != null ? !outFolder.equals(that.outFolder) : that.outFolder != null); - - } - - @Override - public int hashCode() { - return outFolder != null ? outFolder.hashCode() : 0; - } - - static METSConfig defaultInstance() { - return new METSConfig(null); - } - - static METSConfig fromValues(final String outFolder) { - return new METSConfig(outFolder); - } - - static String toXml(final METSConfig toConvert, Boolean prettyXml) - throws JAXBException, IOException { - String retVal = ""; - try (StringWriter writer = new StringWriter()) { - toXml(toConvert, writer, prettyXml); - retVal = writer.toString(); - return retVal; - } - } - - static METSConfig fromXml(final String toConvert) - throws JAXBException { - try (StringReader reader = new StringReader(toConvert)) { - return fromXml(reader); - } - } - - static void toXml(final METSConfig toConvert, - final OutputStream stream, Boolean prettyXml) throws JAXBException { - Marshaller varMarshaller = getMarshaller(prettyXml); - varMarshaller.marshal(toConvert, stream); - } - - static METSConfig fromXml(final InputStream toConvert) - throws JAXBException { - Unmarshaller stringUnmarshaller = getUnmarshaller(); - return (METSConfig) stringUnmarshaller.unmarshal(toConvert); - } - - static void toXml(final METSConfig toConvert, final Writer writer, - Boolean prettyXml) throws JAXBException { - Marshaller varMarshaller = getMarshaller(prettyXml); - varMarshaller.marshal(toConvert, writer); - } - - static METSConfig fromXml(final Reader toConvert) - throws JAXBException { - Unmarshaller stringUnmarshaller = getUnmarshaller(); - return (METSConfig) stringUnmarshaller.unmarshal(toConvert); - } - - private static Unmarshaller getUnmarshaller() throws JAXBException { - JAXBContext context = JAXBContext - .newInstance(METSConfig.class); - Unmarshaller unmarshaller = context.createUnmarshaller(); - return unmarshaller; - } - - private static Marshaller getMarshaller(Boolean setPretty) - throws JAXBException { - JAXBContext context = JAXBContext - .newInstance(METSConfig.class); - Marshaller marshaller = context.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, setPretty); - return marshaller; - } -} diff --git a/metsMetadata-plugin/src/main/java/org/verapdf/METSMetadataExtractor.java b/metsMetadata-plugin/src/main/java/org/verapdf/METSMetadataExtractor.java index 0d623e6..2adc4f2 100644 --- a/metsMetadata-plugin/src/main/java/org/verapdf/METSMetadataExtractor.java +++ b/metsMetadata-plugin/src/main/java/org/verapdf/METSMetadataExtractor.java @@ -1,12 +1,12 @@ package org.verapdf; import au.edu.apsr.mtk.base.*; -import com.adobe.xmp.XMPException; -import com.adobe.xmp.XMPMeta; -import com.adobe.xmp.XMPMetaFactory; -import com.adobe.xmp.impl.VeraPDFMeta; -import com.adobe.xmp.impl.VeraPDFXMPNode; -import com.adobe.xmp.impl.XMPSchemaRegistryImpl; +import org.verapdf.xmp.XMPException; +import org.verapdf.xmp.XMPMeta; +import org.verapdf.xmp.XMPMetaFactory; +import org.verapdf.xmp.impl.VeraPDFMeta; +import org.verapdf.xmp.impl.VeraPDFXMPNode; +import org.verapdf.xmp.impl.XMPSchemaRegistryImpl; import org.verapdf.core.FeatureParsingException; import org.verapdf.features.AbstractMetadataFeaturesExtractor; import org.verapdf.features.MetadataFeaturesData; @@ -14,7 +14,6 @@ import org.w3c.dom.Document; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -39,8 +38,7 @@ public List getMetadataFeatures(MetadataFeaturesData metadataFe List result = new ArrayList<>(1); try { File outFile = getOutFile(result); - byte[] bytes = metadataFeaturesData.getStream(); - convertXMPToMETS(new ByteArrayInputStream(bytes), new FileOutputStream(outFile)); + convertXMPToMETS(metadataFeaturesData.getStream(), new FileOutputStream(outFile)); FeatureTreeNode node = FeatureTreeNode.createRootNode("resultFile"); node.setValue(outFile.getCanonicalPath()); result.add(node); @@ -219,23 +217,18 @@ private void divideMetas(VeraPDFMeta meta) { } private File getOutFile(List nodes) throws FeatureParsingException, IOException { - METSConfig config = getConfig(nodes); - if (config.getOutFolder() == null) { - File tempFolder = getTempFolder(); - File res = getOutFileInFolder(tempFolder); - return res; + String out = getAttributes().get("outFolder"); + if (out == null) { + return getOutFileInFolder(getTempFolder()); } else { - File outFolder = new File(config.getOutFolder()); + File outFolder = new File(out); if (outFolder.isDirectory()) { - File res = getOutFileInFolder(outFolder); - return res; + return getOutFileInFolder(outFolder); } else { FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); node.setValue("Config file contains out folder path but it doesn't link a directory."); nodes.add(node); - File tempFolder = getTempFolder(); - File res = getOutFileInFolder(tempFolder); - return res; + return getOutFileInFolder(getTempFolder()); } } } @@ -252,33 +245,4 @@ private File getTempFolder() { private File getOutFileInFolder(File folder) throws IOException { return File.createTempFile("veraPDF_METS_Plugin_out", ".xml", folder); } - - private METSConfig getConfig(List nodes) throws FeatureParsingException { - METSConfig config = METSConfig.defaultInstance(); - File conf = getConfigFile(); - if (conf.isFile() && conf.canRead()) { - try { - config = METSConfig.fromXml(new FileInputStream(conf)); - } catch (JAXBException | FileNotFoundException e) { - FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); - node.setValue("Config file contains wrong syntax. Error message: " + e.getMessage()); - nodes.add(node); - } - } - return config; - } - - private File getConfigFile() { - return new File(getFolderPath().toFile(), "config.xml"); - } - - @Override - public String getID() { - return "63f0a295-587b-4e50-909c-4b47e02f64f7"; - } - - @Override - public String getDescription() { - return "This extractor generates METS file based on XMP package."; - } } diff --git a/metsMetadata-plugin/src/main/java/org/verapdf/METSTypeRegistry.java b/metsMetadata-plugin/src/main/java/org/verapdf/METSTypeRegistry.java index cfbe451..8b2771e 100644 --- a/metsMetadata-plugin/src/main/java/org/verapdf/METSTypeRegistry.java +++ b/metsMetadata-plugin/src/main/java/org/verapdf/METSTypeRegistry.java @@ -1,6 +1,6 @@ package org.verapdf; -import com.adobe.xmp.impl.XMPSchemaRegistryImpl; +import org.verapdf.xmp.impl.XMPSchemaRegistryImpl; /** * @author Maksim Bezrukov diff --git a/metsMetadata-plugin/src/main/resources/mets-api.jar b/metsMetadata-plugin/src/main/resources/mets-api.jar deleted file mode 100644 index 3efe6b4..0000000 Binary files a/metsMetadata-plugin/src/main/resources/mets-api.jar and /dev/null differ diff --git a/ots-plugin/pom.xml b/ots-plugin/pom.xml new file mode 100644 index 0000000..b523b5d --- /dev/null +++ b/ots-plugin/pom.xml @@ -0,0 +1,35 @@ + + + + verapdf-plugins + org.verapdf.plugins + 1.24.0 + + 4.0.0 + + ots-plugin + + + + org.verapdf + core + + + + javax.xml.bind + jaxb-api + + + + com.sun.xml.bind + jaxb-impl + + + + com.sun.xml.bind + jaxb-core + + + diff --git a/ots-plugin/src/main/java/org/verapdf/OTSExtractor.java b/ots-plugin/src/main/java/org/verapdf/OTSExtractor.java new file mode 100644 index 0000000..e487c83 --- /dev/null +++ b/ots-plugin/src/main/java/org/verapdf/OTSExtractor.java @@ -0,0 +1,94 @@ +package org.verapdf; + +import org.verapdf.core.FeatureParsingException; +import org.verapdf.features.AbstractFontFeaturesExtractor; +import org.verapdf.features.FontFeaturesData; +import org.verapdf.features.tools.FeatureTreeNode; + +import java.io.*; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Maksim Bezrukov + */ +public class OTSExtractor extends AbstractFontFeaturesExtractor { + + @Override + public List getFontFeatures(FontFeaturesData fontFeaturesData) { + List result = new ArrayList<>(); + try { + try { + File temp = generateTempFile(fontFeaturesData.getStream(), "fnt"); + exec(result, temp); + } catch (IOException | InterruptedException | URISyntaxException e) { + FeatureTreeNode node = FeatureTreeNode.createRootNode("error"); + node.setValue("Error in execution. Error message: " + e.getMessage()); + result.add(node); + } + } catch (FeatureParsingException e) { + throw new IllegalStateException(e); + } + return result; + } + + private File generateTempFile(InputStream stream, String name) throws IOException { + File fold = getTempFolder(); + File temp = File.createTempFile(name == null ? "" : name, "", fold); + temp.deleteOnExit(); + FileOutputStream out = new FileOutputStream(temp); + byte[] bytes = new byte[1024]; + int length; + while ((length = stream.read(bytes)) != -1) { + out.write(bytes, 0, length); + } + out.close(); + return temp; + } + + private void exec(List nodes, File temp) throws InterruptedException, FeatureParsingException, IOException, URISyntaxException { + String exePath = getAttributes().get("cliPath"); + if (exePath == null) { + FeatureTreeNode error = FeatureTreeNode.createRootNode("error"); + error.setValue("Can not obtain ot-sanitise binary"); + nodes.add(error); + return; + } + String[] args = new String[]{exePath, temp.getAbsolutePath()}; + + Runtime rt = Runtime.getRuntime(); + Process pr = rt.exec(args); + BufferedReader reader = new BufferedReader(new InputStreamReader(pr.getErrorStream())); + + StringBuilder builder = new StringBuilder(""); + String line = reader.readLine(); + while (line != null) { + builder.append(line + "\n"); + line = reader.readLine(); + } + pr.waitFor(); + + String output = builder.toString(); + boolean isValid = output.isEmpty(); + FeatureTreeNode valid = FeatureTreeNode.createRootNode("isValid"); + valid.setValue(Boolean.toString(isValid)); + nodes.add(valid); + + if (!isValid) { + FeatureTreeNode res = FeatureTreeNode.createRootNode("otsOutput"); + res.setValue(output.substring(0, output.length() - 1)); + nodes.add(res); + } + } + + private static File getTempFolder() { + File tempDir = new File(System.getProperty("java.io.tmpdir")); + File tempFolder = new File(tempDir, "veraPDFOTSPluginTemp"); + if (!tempFolder.exists()) { + tempFolder.mkdir(); + } + tempFolder.deleteOnExit(); + return tempFolder; + } +} diff --git a/plugins/pom.xml b/plugins/pom.xml new file mode 100644 index 0000000..aaf5c33 --- /dev/null +++ b/plugins/pom.xml @@ -0,0 +1,95 @@ + + + + verapdf-plugins + org.verapdf.plugins + 1.24.0 + + 4.0.0 + + plugins + + + + org.verapdf.plugins + embeddedfileSample-plugin + ${project.version} + + + org.verapdf.plugins + fontSample-plugin + ${project.version} + + + org.verapdf.plugins + fontType-plugin + ${project.version} + + + org.verapdf.plugins + iccdump-plugin + ${project.version} + + + org.verapdf.plugins + iccprofileSample-plugin + ${project.version} + + + org.verapdf.plugins + imageSample-plugin + ${project.version} + + + org.verapdf.plugins + jpylyzer-plugin + ${project.version} + + + org.verapdf.plugins + mediaconch-plugin + ${project.version} + + + org.verapdf.plugins + metsMetadata-plugin + ${project.version} + + + org.verapdf.plugins + ots-plugin + ${project.version} + + + + + + + src/main/resources + true + + + + + maven-assembly-plugin + 2.2.1 + + + src/main/assembly/assembly.xml + + + + + package + + single + + + + + + + + diff --git a/plugins/src/main/assembly/assembly.xml b/plugins/src/main/assembly/assembly.xml new file mode 100644 index 0000000..729e6e8 --- /dev/null +++ b/plugins/src/main/assembly/assembly.xml @@ -0,0 +1,27 @@ + + pack + false + + zip + + + + src/main/resources + + **/plugins.xml + + true + + + + + + plugins/${artifact.artifactId} + false + false + runtime + + + diff --git a/plugins/src/main/resources/config/plugins.xml b/plugins/src/main/resources/config/plugins.xml new file mode 100644 index 0000000..fbbc528 --- /dev/null +++ b/plugins/src/main/resources/config/plugins.xml @@ -0,0 +1,85 @@ + + + + + Font Sample + ${project.version} + Sample, proof of concept, font plugin. Developed by the veraPDF team. + plugins/fontSample-plugin/fontSample-plugin-${project.version}.jar + + + Font Type Sample + ${project.version} + Sample, proof of concept, font type plugin. Developed by the veraPDF team. + plugins/fontType-plugin/fontType-plugin-${project.version}.jar + + + Embedded File Sample + ${project.version} + Sample, proof of concept, embedded file plugin. Developed by the veraPDF team. + plugins/embeddedfileSample-plugin/embeddedfileSample-plugin-${project.version}.jar + + + iccdump-plugin + ${project.version} + iccdump-plugin + plugins/iccdump-plugin/iccdump-plugin-${project.version}.jar + + + ICC Profile Sample + ${project.version} + Sample, proof of concept, ICC Profile plugin. Developed by the veraPDF team. + plugins/iccprofileSample-plugin/iccprofileSample-plugin-${project.version}.jar + + + Image Sample + ${project.version} + Sample, proof of concept, image plugin. Developed by the veraPDF team. + plugins/imageSample-plugin/imageSample-plugin-${project.version}.jar + + + jpylyzer-plugin + ${project.version} + jpylyzer-plugin + plugins/jpylyzer-plugin/jpylyzer-plugin-${project.version}.jar + + + mediaconch-plugin + ${project.version} + mediaconch-plugin + plugins/mediaconch-plugin/mediaconch-plugin-${project.version}.jar + + + METS metadata extraction Sample + ${project.version} + Sample, proof of concept, METS metadata extraction plugin. Developed by the veraPDF team. + plugins/metsMetadata-plugin/metsMetadata-plugin-${project.version}.jar + + + ots-plugin + ${project.version} + ots-plugin + plugins/ots-plugin/ots-plugin-${project.version}.jar + + diff --git a/pom.xml b/pom.xml index 97d90ff..99c53d5 100644 --- a/pom.xml +++ b/pom.xml @@ -1,25 +1,30 @@ - 4.0.0 - org.verapdf - verapdf-library-samples + + org.verapdf + verapdf-parent + 1.24.1 + + + org.verapdf.plugins + verapdf-plugins pom - 1.0-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.7 - 1.7 - - - - + 1.24.0 + + + + + true + + vera-dev + Vera development + https://artifactory.openpreservation.org/artifactory/vera-dev + + + fontType-plugin iccdump-plugin @@ -30,29 +35,36 @@ metsMetadata-plugin mediaconch jpylyzer-plugin + ots-plugin + plugins - - - - true - - vera-dev - Vera development - http://artifactory.openpreservation.org/artifactory/vera-dev - - + + + + org.verapdf + core + [1.24.0,1.25.0) + + + + javax.xml.bind + jaxb-api + 2.3.1 + - - - org.verapdf - core - [0.15.0,0.16.0) - - + + com.sun.xml.bind + jaxb-impl + 2.3.1 + - - 1.7 - + + com.sun.xml.bind + jaxb-core + 2.3.0.1 + + + - \ No newline at end of file +