pax_global_header00006660000000000000000000000064116600043460014512gustar00rootroot0000000000000052 comment=8e76c21db205667261802df3774da8aa09b38992 munge-maven-plugin-1.0/000077500000000000000000000000001166000434600150655ustar00rootroot00000000000000munge-maven-plugin-1.0/.gitignore000066400000000000000000000000451166000434600170540ustar00rootroot00000000000000target .project .classpath .settings munge-maven-plugin-1.0/LICENSE000066400000000000000000000410121166000434600160700ustar00rootroot00000000000000COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 1. Definitions. 1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications. 1.2. Contributor Version means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. 1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. 1.4. Executable means the Covered Software in any form other than Source Code. 1.5. Initial Developer means the individual or entity that first makes Original Software available under this License. 1.6. Larger Workmeans a work which combines Covered Software or portions thereof with code not governed by the terms of this License. 1.7. License means this document. 1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. Modifications means the Source Code and Executable form of any of the following: A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; B. Any new file that contains any part of the Original Software or previous Modification; or C. Any new file that is contributed or otherwise made available under the terms of this License. 1.10. Original Software means the Source Code and Executable form of computer software code that is originally released under this License. 1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.12. Source Code means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. 1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, You includes any entity which 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. 2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof); (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License; (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. 2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, 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 Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) The licenses granted in Sections 2.2(a) and 2.2(b) areeffective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Availability of Source Code. Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. 3.2. Modifications. The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. 3.3. Required Notices. You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. 3.4. Application of Additional Terms. You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients rights hereunder. 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 the Initial Developer or 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 the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.5. Distribution of Executable Versions. You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipients rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.6. Larger Works. You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. 4. Versions of the License. 4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. 4.2. Effect of New Versions. You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. 4.3. Modified Versions. When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. 5. DISCLAIMER OF WARRANTY. COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 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 THE INITIAL DEVELOPER OR ANY OTHER 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 HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 6. TERMINATION. 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as Participant) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. 7. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY 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 PARTYS 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. U.S. GOVERNMENT END USERS. The Covered Software is a commercial item, as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer software (as that term is defined at 48 C.F.R. 252.227-7014(a)(1)) and commercial computer software documentation as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. 9. MISCELLANEOUS. This License represents the complete agreement concerning 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. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdictions conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. 10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. ---------------------------------------------------------------- NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL): This code is released under the CDDL and shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. ---------------------------------------------------------------- munge-maven-plugin-1.0/README000066400000000000000000000020601166000434600157430ustar00rootroot00000000000000Munge is a purposely-simple Java preprocessor. It only supports conditional inclusion of source based on defined strings of the form "if[tag]", "if_not[tag]", "else[tag], and "end[tag]". Unlike traditional preprocessors, comments, and formatting are all preserved for the included lines. This is on purpose, as the output of Munge will be distributed as human-readable source code. To avoid creating a separate Java dialect, the conditional tags are contained in Java comments. This allows one build to compile the source files without pre-processing, to facilitate faster incremental development. Other builds from the same source have their code contained within that comment. The format of the tags is a little verbose, so that the tags won't accidentally be used by other comment readers such as javadoc. Munge tags must be in C-style comments; C++-style comments may be used to comment code within a comment. Like any preprocessor, developers must be careful not to abuse its capabilities so that their code becomes unreadable. Please use it as little as possible. munge-maven-plugin-1.0/pom.xml000066400000000000000000000054631166000434600164120ustar00rootroot00000000000000 4.0.0 org.sonatype.plugins plugins-parent 6 maven-plugin org.sonatype.plugins munge-maven-plugin 1.0 Munge Maven Plugin scm:git:git@github.com:sonatype/munge-maven-plugin.git scm:git:git@github.com:sonatype/munge-maven-plugin.git git@github.com:sonatype/munge-maven-plugin.git Hudson https://grid.sonatype.org/ci/job/munge-maven-plugin/ Common Development and Distribution License http://www.netbeans.org/cddl.txt repo UTF-8 https://repository.sonatype.org/service/local/staging/deploy/maven2 org.apache.maven maven-plugin-api 2.0 org.apache.maven maven-core 2.0 junit junit 3.8.1 test maven-compiler-plugin 2.3.1 maven-javadoc-plugin 2.7 maven-source-plugin 2.1.2 maven-site-plugin 3.0-beta-2 maven-release-plugin 2.0 org.codehaus.mojo changelog-maven-plugin 2.0-beta-1 munge-maven-plugin-1.0/src/000077500000000000000000000000001166000434600156545ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/000077500000000000000000000000001166000434600166005ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/java/000077500000000000000000000000001166000434600175215ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/java/org/000077500000000000000000000000001166000434600203105ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/java/org/sonatype/000077500000000000000000000000001166000434600221525ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/java/org/sonatype/plugins/000077500000000000000000000000001166000434600236335ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/java/org/sonatype/plugins/munge/000077500000000000000000000000001166000434600247465ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/java/org/sonatype/plugins/munge/Munge.java000066400000000000000000000476421166000434600267010ustar00rootroot00000000000000package org.sonatype.plugins.munge; /* * The contents of this file are subject to the terms of the Common Development * and Distribution License (the License). You may not use this file except in * compliance with the License. * * You can obtain a copy of the License at http://www.netbeans.org/cddl.html * or http://www.netbeans.org/cddl.txt. * * When distributing Covered Code, include this CDDL Header Notice in each file * and include the License file at http://www.netbeans.org/cddl.txt. * If applicable, add the following below the CDDL Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * The Original Software is NetBeans. The Initial Developer of the Original * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun * Microsystems, Inc. All Rights Reserved. */ import java.io.*; import java.util.*; /** * Munge: a purposely-simple Java preprocessor. It only * supports conditional inclusion of source based on defined strings of * the form "if[tag]", * "if_not[tag]", "else[tag], and "end[tag]". Unlike traditional * preprocessors, comments and formatting are all preserved for the * included lines. This is on purpose, as the output of Munge * will be distributed as human-readable source code. *

* To avoid creating a separate Java dialect, the conditional tags are * contained in Java comments. This allows one build to compile the * source files without pre-processing, to facilitate faster incremental * development. Other builds from the same source have their code contained * within that comment. The format of the tags is a little verbose, so * that the tags won't accidentally be used by other comment readers * such as javadoc. Munge tags must be in C-style comments; * C++-style comments may be used to comment code within a comment. * *

* To demonstrate this, our sample source has 1.1 and 1.2-specific code, * with 1.1 as the default build: *


 *     public void setSystemProperty(String key, String value) {
 *         /*if[JDK1.1]*/
 *         Properties props = System.getProperties();
 *         props.setProperty(key, value);
 *         System.setProperties(props);
 *         /*end[JDK1.1]*/
 * 

* /*if[JDK1.2] * // Use the new System method. * System.setProperty(key, value); * end[JDK1.2]*/ * } *

*

* When the above code is directly compiled, the code bracketed by * the JDK1.1 tags will be used. If the file is run through * Munge with the JDK1.2 tag defined, the second code block * will used instead. This code can also be written as: *


 *     public void setSystemProperty(String key, String value) {
 *         /*if[JDK1.2]
 *         // Use the new System method.
 *         System.setProperty(key, value);
 *           else[JDK1.2]*/
 * 

* Properties props = System.getProperties(); * props.setProperty(key, value); * System.setProperties(props); * /*end[JDK1.2]*/ * } *

* * Munge also performs text substitution; the Swing build uses this to * convert its package references from javax.swing * to java.awt.swing, for example. This substitution is * has no knowledge of Java syntax, so only use it to convert strings * which are unambiguous. Substitutions are made in the same order as * the arguments are specified, so the first substitution is made over * the whole file before the second one, and so on. *

* Munge's command line takes one of the following forms: *


 *    java Munge [-D<symbol> ...] [-s <old>=<new> ...] [<in file>] [<out file>]
 *    java Munge [-D<symbol> ...] [-s <old>=<new> ...] <file> ... <directory>
 * 
*

* In the first form, if no output file is given, System.out is used. If * neither input nor output file are given, System.in and System.out are used. * Munge can also take an @<cmdfile> argument. If one is * specified then the given file is read for additional command line arguments. *

* Like any preprocessor, developers must be careful not to abuse its * capabilities so that their code becomes unreadable. Please use it * as little as possible. * * @author: Thomas Ball * @author jessewilson@google.com (Jesse Wilson) */ public class Munge { static Hashtable symbols = new Hashtable(2); static Vector oldTextStrings = new Vector(); static Vector newTextStrings = new Vector(); int errors = 0; int line = 1; String inName; BufferedReader in; PrintWriter out; Stack stack = new Stack(); boolean printing = true; String source = null; String block = null; final String[] commands = { "if", "if_not", "else", "end" }; final int IF = 0; final int IF_NOT = 1; final int ELSE = 2; final int END = 3; final int numCommands = 4; final int EOF = 0; final int COMMENT = 1; // text surrounded by /* */ delimiters final int CODE = 2; // can just be whitespace int getCommand(String s) { for (int i = 0; i < numCommands; i++) { if (s.equals(commands[i])) { return i; } } return -1; } public void error(String text) { System.err.println("File " + inName + " line " + line + ": " + text); errors++; } public void printErrorCount() { if (errors > 0) { System.err.println(Integer.toString(errors) + (errors > 1 ? " errors" : " error")); } } public boolean hasErrors() { return (errors > 0); } public Munge(String inName, String outName) { this.inName = inName; if( inName == null ) { in = new BufferedReader( new InputStreamReader(System.in) ); } else { try { in = new BufferedReader( new FileReader(inName) ); } catch (FileNotFoundException fnf) { System.err.println("Cannot find input file " + inName); errors++; return; } } if( outName == null ) { out = new PrintWriter(System.out); } else { try { out = new PrintWriter( new FileWriter(outName) ); } catch (IOException ioe) { System.err.println("Cannot write to file " + outName); errors++; } } } public void close() throws IOException { in.close(); out.flush(); out.close(); } void cmd_if(String version) { Boolean b = new Boolean(printing); stack.push(b); printing = (symbols.get(version) != null); } void cmd_if_not(String version) { Boolean b = new Boolean(printing); stack.push(b); printing = (symbols.get(version) == null); } void cmd_else() { printing = !printing; } void cmd_end() throws EmptyStackException { Boolean b = (Boolean)stack.pop(); printing = b.booleanValue(); } void print(String s) throws IOException { if (printing) { out.write(s); } else { // Output empty lines to preserve line numbering. int n = countLines(s); for (int i = 0; i < n; i++) { out.write('\n'); } } } // Return the number of line endings in a string. int countLines(String s) { int i = 0; int n = 0; while ((i = block.indexOf('\n', i) + 1) > 0) { n++; } return n; } /* * If there's a preprocessor tag in this comment, act on it and return * any text within it. If not, just return the whole comment unchanged. */ void processComment(String comment) throws IOException { String commentText = comment.substring(2, comment.length() - 2); StringTokenizer st = new StringTokenizer( commentText, "[] \t\r\n", true); boolean foundTag = false; StringBuffer buffer = new StringBuffer(); try { while (st.hasMoreTokens()) { String token = st.nextToken(); int cmd = getCommand(token); if (cmd == -1) { buffer.append(token); if (token.equals("\n")) { line++; } } else { token = st.nextToken(); if (!token.equals("[")) { // Not a real tag: save it and continue... buffer.append(commands[cmd]); buffer.append(token); } else { String symbol = st.nextToken(); if (!st.nextToken().equals("]")) { error("invalid preprocessor statement"); } foundTag = true; // flush text, as command may change printing state print(buffer.toString()); buffer.setLength(0); // reset buffer switch (cmd) { case IF: cmd_if(symbol); break; case IF_NOT: cmd_if_not(symbol); break; case ELSE: cmd_else(); break; case END: cmd_end(); break; default: throw new InternalError("bad command"); } } } } } catch (NoSuchElementException nse) { error("invalid preprocessor statement"); } catch (EmptyStackException ese) { error("unmatched end or else statement"); } if (foundTag) { print(buffer.toString()); } else { print(comment); } } // Munge views a Java source file as consisting of // blocks, alternating between comments and the text between them. int nextBlock() throws IOException { if (source == null || source.length() == 0) { block = null; return EOF; } if (source.startsWith("/*")) { // Return comment as next block. int i = source.indexOf("*/"); if (i == -1) { // malformed comment, skip block = source; return CODE; } i += 2; // include comment close block = source.substring(0, i); source = source.substring(i); return COMMENT; } // Return text up to next comment, or rest of file if no more comments. int i = findCommentStart(source, 0); if (i != -1) { block = source.substring(0, i); source = source.substring(i); } else { block = source; source = null; } // Update line count -- this isn't done for comments because // line counting has to be done during parsing. line += countLines(block); return CODE; } /* * Naively try to find the start of the next comment in a block of source * code. This method handles end-of-line comments and Strings, but nothing * more complicated (like strings containing end-of-line comments). */ static int findCommentStart(String source, int fromIndex) { if (fromIndex >= source.length()) { return -1; } int commentStart = source.indexOf("/*", fromIndex); if (commentStart == -1) { return -1; } int commentLineStart = source.lastIndexOf("\n", commentStart); if (commentLineStart == -1) { commentLineStart = 0; } String line = source.substring(commentLineStart, commentStart + 2); if (line.contains("//")) { return findCommentStart(source, commentStart + 1); } else if (countQuotes(line) % 2 == 1) { return findCommentStart(source, commentStart + 1); } else { return commentStart; } } static int countQuotes(String input) { int result = 0; for (int i = 0; i < input.length(); i++) { if (input.charAt(i) == '\"') { result++; } } return result; } void substitute() { for (int i = 0; i < oldTextStrings.size(); i++) { String oldText = (String)oldTextStrings.elementAt(i); String newText = (String)newTextStrings.elementAt(i); int n; while ((n = source.indexOf(oldText)) >= 0) { source = source.substring(0, n) + newText + source.substring(n + oldText.length()); } } } public void process() throws IOException { // Read all of file into a single stream for easier scanning. StringWriter sw = new StringWriter(); char[] buffer = new char[8192]; int n; while ((n = in.read(buffer, 0, 8192)) > 0) { sw.write(buffer, 0, n); } source = sw.toString(); // Perform any text substitutions. substitute(); // Do preprocessing. int blockType; do { blockType = nextBlock(); if (blockType == COMMENT) { processComment(block); } else if (blockType == CODE) { print(block); } } while (blockType != EOF); // Make sure any conditional statements were closed. if (!stack.empty()) { error("missing end statement(s)"); } } /** * Report how this utility is used and exit. */ public static void usage() { System.err.println("usage:" + "\n java Munge [-D ...] " + "[-s = ...] " + "[] []" + "\n java Munge [-D ...] " + "[-s = ...] " + " ... " ); System.exit(1); } public static void usage(String msg) { System.err.println(msg); usage(); } /** * Munge's main entry point. */ public static void main(String[] args) { // Use a dummy object as the hash entry value. Object obj = new Object(); // Replace and @file arguments with the contents of the specified file. try { args = CommandLine.parse( args ); } catch( IOException e ) { usage("Unable to read @file argument."); } // Load symbol definitions int iArg = 0; while (iArg < args.length && args[iArg].startsWith("-")) { if (args[iArg].startsWith("-D")) { String symbol = args[iArg].substring(2); symbols.put(symbol, obj); } else if (args[iArg].equals("-s")) { if (iArg == args.length) { usage("no substitution string specified for -s parameter"); } // Parse and store = parameter. String subst = args[++iArg]; int equals = subst.indexOf('='); if (equals < 1 || equals >= subst.length()) { usage("invalid substitution string \"" + subst + "\""); } String oldText = subst.substring(0, equals); oldTextStrings.addElement(oldText); String newText = subst.substring(equals + 1); newTextStrings.addElement(newText); } else { usage("invalid flag \"" + args[iArg] + "\""); } ++iArg; } // Parse file name arguments into an array of input file names and // output file names. String[] inFiles = new String[Math.max(args.length-iArg-1, 1)]; String[] outFiles = new String[inFiles.length]; if( iArg < args.length ) { File targetDir = new File( args[args.length-1] ); if( targetDir.isDirectory() ) { int i = 0; for( ; iArg 1 && arg.charAt(0) == '@') { arg = arg.substring(1); if (arg.charAt(0) == '@') { newArgs.addElement(arg); } else { loadCmdFile(arg, newArgs); } } else { newArgs.addElement(arg); } } String[] newArgsArray = new String[newArgs.size()]; newArgs.copyInto(newArgsArray); return newArgsArray; } private static void loadCmdFile(String name, Vector args) throws IOException { Reader r = new BufferedReader(new FileReader(name)); StreamTokenizer st = new StreamTokenizer(r); st.resetSyntax(); st.wordChars(' ', 255); st.whitespaceChars(0, ' '); st.commentChar('#'); st.quoteChar('"'); st.quoteChar('\''); while (st.nextToken() != st.TT_EOF) { args.addElement(st.sval); } r.close(); } } } munge-maven-plugin-1.0/src/main/java/org/sonatype/plugins/munge/MungeForkMojo.java000077500000000000000000000010001166000434600303250ustar00rootroot00000000000000package org.sonatype.plugins.munge; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; /** * Forks a new build that compiles and runs tests using the munged source in place of the original. * * @goal munge-fork * @execute lifecycle=munge phase=prepare-package */ public class MungeForkMojo extends AbstractMojo { public void execute() throws MojoExecutionException { // this mojo only exists to launch the forked build } } munge-maven-plugin-1.0/src/main/java/org/sonatype/plugins/munge/MungeMojo.java000066400000000000000000000102131166000434600275060ustar00rootroot00000000000000package org.sonatype.plugins.munge; import java.io.File; import java.io.IOException; import java.util.List; import org.apache.maven.model.Build; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.FileUtils; /** * Munges source files by keeping or removing sections of code according to what symbols are enabled. * * @see http://blog.publicobject.com/2009/02/preprocessing-java-with-munge.html * @see http://weblogs.java.net/blog/2006/09/05/munge-swings-secret-preprocessor * @goal munge * @phase generate-sources */ public class MungeMojo extends AbstractMojo { /** * Where to put the munged source files. * * @parameter default-value="${project.build.directory}/munged" */ private String mungedDirectory; /** * List of symbols (separated by commas) identifying which sections of munged code to keep. * * @parameter default-value="${symbols}" * @required */ private String symbols; /** * List of patterns (separated by commas) specifying files that should be munged; by default munge everything. * * @parameter default-value="${includes}" */ private String includes; /** * List of patterns (separated by commas) specifying files that should not be copied; by default exclude nothing. * * @parameter default-value="${excludes}" */ private String excludes; /** * @parameter expression="${project.build}" * @readonly */ private Build build; /** * @parameter expression="${executedProject}" * @readonly */ private MavenProject executedProject; @SuppressWarnings( "unchecked" ) public void execute() throws MojoExecutionException { Munge.symbols.clear(); for ( final String s : symbols.split( "," ) ) { Munge.symbols.put( s, Boolean.TRUE ); } final String mungedMainDirectory = mungedDirectory + File.separator + "main"; final String mungedTestDirectory = mungedDirectory + File.separator + "test"; munge( build.getSourceDirectory(), mungedMainDirectory, includes, excludes ); munge( build.getTestSourceDirectory(), mungedTestDirectory, includes, excludes ); if ( null != executedProject ) { executedProject.getCompileSourceRoots().clear(); executedProject.addCompileSourceRoot( mungedMainDirectory ); executedProject.getTestCompileSourceRoots().clear(); executedProject.addTestCompileSourceRoot( mungedTestDirectory ); final Build executedBuild = executedProject.getBuild(); executedBuild.setDirectory( mungedDirectory ); executedBuild.setOutputDirectory( mungedDirectory + File.separator + "classes" ); executedBuild.setTestOutputDirectory( mungedDirectory + File.separator + "test-classes" ); } } /** * Munges source files found in {@code from} and places them in {@code to}, honoring any includes or excludes. * * @param from The original source directory * @param to The munged source directory * @param includes Comma-separated list of files to include * @param excludes Comma-separated list of files to exclude * @throws MojoExecutionException */ @SuppressWarnings( "unchecked" ) public static void munge( final String from, final String to, final String includes, final String excludes ) throws MojoExecutionException { try { for ( final File f : (List) FileUtils.getFiles( new File( from ), includes, excludes ) ) { final String inPath = f.getPath(); final String outPath = inPath.replace( from, to ); new File( outPath ).getParentFile().mkdirs(); final Munge munge = new Munge( inPath, outPath ); munge.process(); munge.close(); } } catch ( final IOException e ) { throw new MojoExecutionException( e.toString() ); } } } munge-maven-plugin-1.0/src/main/resources/000077500000000000000000000000001166000434600206125ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/resources/META-INF/000077500000000000000000000000001166000434600217525ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/resources/META-INF/maven/000077500000000000000000000000001166000434600230605ustar00rootroot00000000000000munge-maven-plugin-1.0/src/main/resources/META-INF/maven/lifecycle.xml000066400000000000000000000005071166000434600255430ustar00rootroot00000000000000 munge generate-sources munge munge-maven-plugin-1.0/src/site/000077500000000000000000000000001166000434600166205ustar00rootroot00000000000000munge-maven-plugin-1.0/src/site/apt/000077500000000000000000000000001166000434600174045ustar00rootroot00000000000000munge-maven-plugin-1.0/src/site/apt/index.apt000066400000000000000000000075761166000434600212400ustar00rootroot00000000000000 --- Munge Plugin for Maven --- Stuart McCulloch --- October 1, 2010 --- Introduction The Munge Plugin for Maven provides mojos to (pre-process) Java code. It uses the Munge class originally open-sourced on Tom Ball's {{{http://weblogs.java.net/blog/tball/archive/2006/09/munge_swings_se.html}blog}} and subsequently updated by {{{http://blog.publicobject.com/2009/02/preprocessing-java-with-munge.html}Jesse Wilson}}. Description Munge is a purposely-simple Java preprocessor. It only supports conditional inclusion of source based on defined strings of the form "if[tag]", "if_not[tag]", "else[tag], and "end[tag]". Unlike traditional preprocessors, comments, and formatting are all preserved for the included lines. This is on purpose, as the output of Munge will be distributed as human-readable source code. To avoid creating a separate Java dialect, the conditional tags are contained in Java comments. This allows one build to compile the source files without pre-processing, to facilitate faster incremental development. Other builds from the same source have their code contained within that comment. The format of the tags is a little verbose, so that the tags won't accidentally be used by other comment readers such as javadoc. Munge tags <> be in C-style comments; C++-style comments may be used to comment code within a comment. Like any preprocessor, developers must be careful not to abuse its capabilities so that their code becomes unreadable. Please use it as little as possible. Usage * tags Here are some example munge tags: +---+ /*if[DEBUG] ... // extra debugging code ... end[DEBUG]*/ /*if[WINDOWS] ... // windows optimized code ... else[WINDOWS]*/ ... // non-optimized general code ... /*end[WINDOWS]*/ /*if_not[PRODUCTION] ... // non-production code ... end[PRODUCTION]*/ +---+ * munge Munge source and put it in the default munged directory <<<${project.build.directory}/munged>>>. Note: this does not attach the source, but you could use the <<>> to do this. +---+ ... org.sonatype.plugins munge-maven-plugin munge generate-source munge DEBUG ... +---+ * munge-fork Fork builds to compile and test Windows and Linux flavors of the project. Note: builds are run up to the <<>> phase of the lifecycle. +---+ ... org.sonatype.plugins munge-maven-plugin windows prepare-package munge-fork ${project.build.directory}/windows WINDOWS **/Linux*.java linux prepare-package munge-fork ${project.build.directory}/linux LINUX **/Windows*.java ... +---+ munge-maven-plugin-1.0/src/site/site.xml000066400000000000000000000006001166000434600203020ustar00rootroot00000000000000