001: /*
002: * ====================================================================
003: * JAFFA - Java Application Framework For All
004: *
005: * Copyright (C) 2002 JAFFA Development Group
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: * Redistribution and use of this software and associated documentation ("Software"),
022: * with or without modification, are permitted provided that the following conditions are met:
023: * 1. Redistributions of source code must retain copyright statements and notices.
024: * Redistributions must also contain a copy of this document.
025: * 2. Redistributions in binary form must reproduce the above copyright notice,
026: * this list of conditions and the following disclaimer in the documentation
027: * and/or other materials provided with the distribution.
028: * 3. The name "JAFFA" must not be used to endorse or promote products derived from
029: * this Software without prior written permission. For written permission,
030: * please contact mail to: jaffagroup@yahoo.com.
031: * 4. Products derived from this Software may not be called "JAFFA" nor may "JAFFA"
032: * appear in their names without prior written permission.
033: * 5. Due credit should be given to the JAFFA Project (http://jaffa.sourceforge.net).
034: *
035: * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: */
049:
050: /*
051: * ConfigMerge.java
052: *
053: * Created on October 29, 2001, 3:03 PM
054: */
055:
056: package org.jaffa.tools.build;
057:
058: import java.io.*;
059: import java.util.*;
060: import java.net.*;
061: import java.util.regex.*;
062: import org.jaffa.util.URLHelper;
063:
064: /** This will check the input properties file for duplicate entries
065: */
066: public class ValidatePropertiesFile {
067:
068: /** Check the input properties file for duplicate entries.
069: * This will return a unique Collection of the duplicate entries, if any exist.
070: * @param fileName The properties file, relative to the classpath.
071: * @throws IOException if any IO error occurs.
072: * @throws MalformedURLException if the input fileName is an invalid URL.
073: * @return a Set containing the duplicate entries, if any
074: */
075: public static Set performValidation(String fileName)
076: throws IOException, MalformedURLException {
077: BufferedReader reader = null;
078: try {
079: URL fileUrl = URLHelper.newExtendedURL(fileName);
080: System.out.println("Validating the Properties File : "
081: + fileUrl.toExternalForm());
082:
083: Set entries = new HashSet();
084: Set duplicates = new TreeSet();
085: Pattern commentPattern = Pattern.compile("^[ \t]*#.*",
086: Pattern.CASE_INSENSITIVE);
087:
088: reader = new BufferedReader(new InputStreamReader(fileUrl
089: .openStream()));
090: String str = null;
091: while ((str = reader.readLine()) != null) {
092: // proceed only if the line has more than one character
093: if (str.length() > 1) {
094: // proceed only if the line is not a COMMENT
095: Matcher commentMatcher = commentPattern
096: .matcher(str);
097: if (!commentMatcher.matches()) {
098: // now extract the property name
099: int i = str.indexOf('=');
100: if (i > 0) {
101: String property = str.substring(0, i);
102: if (entries.contains(property))
103: duplicates.add(property);
104: else
105: entries.add(property);
106: }
107: }
108: }
109: }
110: return duplicates;
111: } finally {
112: if (reader != null)
113: reader.close();
114: }
115: }
116:
117: /** This will invoke the performValidation method, passing the input arguments.
118: * @param args the command line arguments. The first argument will be the PropertiesFileName relative to ClassPath.
119: */
120: public static void main(String args[]) {
121: try {
122: if (args.length == 1) {
123: Set duplicates = performValidation(args[0]);
124: if (duplicates != null && duplicates.size() > 0) {
125: for (Iterator i = duplicates.iterator(); i
126: .hasNext();)
127: System.out.println("Found Duplicate Entry: "
128: + i.next());
129: System.exit(1);
130: }
131: } else {
132: usage();
133: }
134: } catch (Exception e) {
135: e.printStackTrace();
136: System.exit(1);
137: }
138: }
139:
140: private static void usage() {
141: System.err
142: .println("Usage: ValidatePropertiesFile <PropertiesFileName relative to ClassPath>");
143: System.exit(1);
144: }
145: }
|