summaryrefslogblamecommitdiff
path: root/tools/Purger.java
blob: af79d022d9e1c0adf485ba73742625373ae69b85 (plain) (tree)
































































































































































                                                                                                                                                 
/*
 * Purger (c) 2006 Eugenio Favalli
 * License: GPL, v2 or later
 */
 
import java.io.*; 
import java.text.*;
import java.util.*;

 public class Purger {

	public static void main(String[] args) {
		if (args.length != 2) {
			System.out.println(
				"Usage: java Purger <folder> <date>\n" +
				" - folder: is the path to account.txt and athena.txt files.\n" +
				" - date: accounts created before this date will be purged (dd/mm/yy).");
			return;
		}
		
		int accounts = 0;
		int characters = 0;
		int deletedCharacters = 0;
		Vector activeAccounts = new Vector();
		
		File oldAccount = new File(args[0] + "account.txt");
		File oldAthena = new File(args[0] + "athena.txt");
		File newAccount = new File(args[0] + "account.txt.new");
		File newAthena = new File(args[0] + "athena.txt.new");
		
		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
		Date purgeDate;
		try {
			purgeDate = dateFormat.parse(args[1]);
		}
		catch (ParseException e) {
     			System.out.println("ERROR: Wrong date format.");
			return;
		}
		
		String line;
		
		// Remove accounts
		try {
			FileInputStream fin =  new FileInputStream(oldAccount);
			BufferedReader input = new BufferedReader(
					new InputStreamReader(fin));
			FileOutputStream fout = new FileOutputStream(newAccount);
			PrintStream output = new PrintStream(fout);
			
			while ((line = input.readLine()) != null) {
				boolean copy = false;
				String[] fields = line.split("\t");
				// Check if we're reading a comment or the last line
				if (line.substring(0, 2).equals("//") || fields[1].charAt(0) == '%') {
					copy = true;
				}
				else {
					// Server accounts should not be purged
					if (!fields[4].equals("S")) {
						accounts++;
						dateFormat = new SimpleDateFormat("yyyy-MM-dd");						
						try {
							Date date = dateFormat.parse(fields[3]);
							if (date.after(purgeDate)) {
								activeAccounts.add(fields[0]);
								copy = true;
							}
						}
						catch (ParseException e) {
							System.out.println(
								"ERROR: Wrong date format in account.txt. ("
								+ accounts + ": " + line + ")");
							//return;
						}
						catch (Exception e) {
							e.printStackTrace();
							return;
						}
					}
					else {
						copy = true;
					}					
				}
				if (copy) {
					try {
						output.println(line);
					}
					catch (Exception e) {
						System.err.println("ERROR: Unable to write file.");
					}
				}
			}
			input.close();
			output.close();
		}
		catch (FileNotFoundException e ) {
			System.out.println(
				"ERROR: file " + oldAccount.getAbsolutePath() + " not found.");
			return;
		}
		catch (Exception e) {
			System.out.println("ERROR: unable to process account.txt");
			e.printStackTrace();
			return;
		}
		
		System.out.println(
			"Removed " + (accounts - activeAccounts.size()) + "/" +
			accounts + " accounts.");
		
		// Remove characters
		try {
			FileInputStream fin =  new FileInputStream(oldAthena);
			BufferedReader input = new BufferedReader(
					new InputStreamReader(fin));
			FileOutputStream fout = new FileOutputStream(newAthena);
			PrintStream output = new PrintStream(fout);
			
			while ((line = input.readLine()) != null) {
				boolean copy = false;
				String[] fields = line.split("\t");
				// Check if we're reading a comment or the last line
				if (line.substring(0, 2).equals("//")
						|| fields[1].charAt(0) == '%') {
					copy = true;
				}
				else {
					characters++;
					String id = fields[1].substring(0, fields[1].indexOf(','));
					if (activeAccounts.contains(id)) {
						copy = true;
					}
					else {
						deletedCharacters++;
					}
				}
				if (copy) {
					output.println(line);
				}
			}
			input.close();
			output.close();
		}
		catch (FileNotFoundException e ) {
			System.out.println(
				"ERROR: file " + oldAthena.getAbsolutePath() + " not found.");
			return;
		}
		catch (Exception e) {
			System.out.println("ERROR: unable to process athena.txt");
			e.printStackTrace();
			return;
		}
		
		System.out.println(
			"Removed " + deletedCharacters + "/"
			+ characters + " characters.");
	}
	
}