1/*******************************************************************************
2 * Copyright (c) 2000, 2006 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 *     IBM Corporation - initial API and implementation
10 *******************************************************************************/
11
12package org.eclipse.releng.generators;
13
14import java.io.File;
15import java.io.FileNotFoundException;
16import java.io.FileOutputStream;
17import java.io.IOException;
18import java.util.StringTokenizer;
19import org.apache.tools.ant.BuildException;
20import org.apache.tools.ant.Task;
21
22/**
23 * This task will count the number of fils in a given directory
24 * that match a given filter.  The number of fils will be output
25 * to a given output file.  The output file will be overwritten
26 * if it already exists.
27 *
28 * Note: Filter comparison is NOT case sensitive.  Do not use wild cards.
29 * ie .zip counts all files with .zip anywere in the name.
30 */
31public class FileCounter extends Task {
32
33	private String sourceDirectory = "";
34	private String filterString = ".zip";
35	private String outputFile = "";
36
37	public static void main(String args[]) {
38		// For testing only.
39		FileCounter aFileCounter = new FileCounter();
40		aFileCounter.setSourceDirectory("c:\\RelEng\\dean");
41		aFileCounter.setOutputFile("c:\\RelEng\\dean\\files.count");
42		aFileCounter.setFilterString(".zip");
43		aFileCounter.execute();
44	}
45
46	public void execute() throws BuildException {
47		// Do the work.
48
49		int count = 0;
50
51		System.out.println("Source Directory: " + this.getSourceDirectory());
52		System.out.println("Output File: " + this.getOutputFile());
53		System.out.println("Filter String: " + this.getFilterString());
54
55		File aDirectory = new File(this.getSourceDirectory());
56		if (aDirectory == null) {
57			throw new BuildException("Directory " + this.getSourceDirectory() + " not found.");
58		}
59
60		String[] names = aDirectory.list();
61		if (names == null) {
62			throw new BuildException("Directory " + this.getSourceDirectory() + " not found.");
63		}
64
65		System.out.println("List size: " + names.length);
66
67		for (int i = 0; i < names.length; i++) {
68			System.out.println("Name: " + names[i]);
69
70			int index = -1;
71			StringTokenizer types = getFileTypes();
72
73			while (types.hasMoreTokens()){
74				index = names[i].toLowerCase().indexOf(types.nextToken().toLowerCase());
75				if (index != -1) {
76					count++;
77				}
78			}
79
80		}
81
82		try {
83			FileOutputStream anOutputStream = new FileOutputStream(this.getOutputFile());
84			anOutputStream.write(String.valueOf(count).getBytes());
85			anOutputStream.close();
86		} catch (FileNotFoundException e) {
87			throw new BuildException("Can not create file.count file");
88		} catch (IOException e) {
89			throw new BuildException("Can not create file.count file");
90		}
91
92	}
93
94	private StringTokenizer getFileTypes(){
95		return new StringTokenizer(getFilterString(),",");
96	}
97
98	/**
99	 * Gets the sourceDirectory.
100	 * @return Returns a String
101	 */
102	public String getSourceDirectory() {
103		return sourceDirectory;
104	}
105
106	/**
107	 * Sets the sourceDirectory.
108	 * @param sourceDirectory The sourceDirectory to set
109	 */
110	public void setSourceDirectory(String sourceDirectory) {
111		this.sourceDirectory = sourceDirectory;
112	}
113
114	/**
115	 * Gets the filterString.
116	 * @return Returns a String
117	 */
118	public String getFilterString() {
119		return filterString;
120	}
121
122	/**
123	 * Sets the filterString.
124	 * @param filterString The filterString to set
125	 */
126	public void setFilterString(String filterString) {
127		this.filterString = filterString;
128	}
129
130	/**
131	 * Gets the outputFile.
132	 * @return Returns a String
133	 */
134	public String getOutputFile() {
135		return outputFile;
136	}
137
138	/**
139	 * Sets the outputFile.
140	 * @param outputFile The outputFile to set
141	 */
142	public void setOutputFile(String outputFile) {
143		this.outputFile = outputFile;
144	}
145
146}
147