package org.lab41.sample.etl.data; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Random; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Generate * * @author lab41 * * This class generates sample log data */ public class Generate implements Runnable { private final int lineAverage; private final String outputDir; public Generate(String outputDir, int lineAverage) { this.outputDir = outputDir; this.lineAverage = lineAverage; } private static void printUsage() { System.out .println("Usage: Generate [outputDir] [numFiles] [threadPoolSize] [averageLines]\n " + "\toutputDir: The directory to output the log files\n" + "\tnumFiles: The number of log files to create\n" + "\tthreadPoolSize: The number of concurrent threads to create files\n" + "\taverageLines: The average lines per log file"); } public static void main(String[] args) { int numWorkers = 1; int threadPoolSize = 1; int lineAverage = 1; String outputDir; if (args.length != 4) { printUsage(); System.exit(0); } outputDir = args[0]; File f = new File(outputDir); if (!f.exists()) { String currentDir = new File(".").getAbsolutePath(); System.err.println("Error: Output dir \"" + outputDir + "\" does not exist in " + currentDir); System.exit(1); } numWorkers = Integer.parseInt(args[1]); threadPoolSize = Integer.parseInt(args[2]); lineAverage = Integer.parseInt(args[3]); ExecutorService tpes = Executors.newFixedThreadPool(threadPoolSize); Generate[] workers = new Generate[numWorkers]; for (int i = 0; i < numWorkers; i++) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } workers[i] = new Generate(outputDir, lineAverage); tpes.execute(workers[i]); } tpes.shutdown(); } public void run() { long time = new Date().getTime(); Random random = new Random(time); int lines = random.nextInt(this.lineAverage); System.out.println("Writing file with " + lines + " lines"); String filename = "out-" + time; try { writeFile(outputDir, filename, lines, random); System.out.println("File written: " + filename); } catch (IOException e) { System.err.println("Error file creation"); e.printStackTrace(); } } private void writeFile(String parentDir, String filename, int lines, Random random) throws IOException { BufferedWriter writer = new BufferedWriter(new FileWriter(new File( outputDir + "/" + filename), true)); int writeZero = random.nextInt(10); if (writeZero > 0) { for (int i = 0; i < lines; i++) { writer.write(getRandomLogEntry(random)); writer.newLine(); writer.flush(); } } writer.close(); } String splitToken = ","; private String getRandomLogEntry(Random random) { int randomInt = random.nextInt(); long randomLong = random.nextLong(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date start = getRandomDate(random); Date end = new Date(start.getTime() + random.nextInt(65535)); String startTime = format.format(start); String endTime = format.format(end); String primary = UUID.randomUUID().toString().substring(0, 20); String optional = ""; // sometimes we want the optional name if (random.nextInt() > 4444000) { optional = UUID.randomUUID().toString().substring(0, 20); } return primary + splitToken + optional + splitToken + randomLong + splitToken + randomInt + splitToken + startTime + splitToken + endTime; } private Date getRandomDate(Random random) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 1972 + random.nextInt(38)); calendar.set(Calendar.DAY_OF_MONTH, random.nextInt(31) + 1); calendar.set(Calendar.HOUR_OF_DAY, random.nextInt(24)); calendar.set(Calendar.MINUTE, random.nextInt(60)); calendar.set(Calendar.SECOND, random.nextInt(60)); return calendar.getTime(); } }