package org.hipi.tools; import org.hipi.imagebundle.HipiImageBundle; import org.hipi.image.HipiImageHeader.HipiImageFormat; import org.apache.commons.cli.BasicParser; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.Parser; import org.apache.commons.cli.ParseException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FSDataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; import java.util.Arrays; import java.util.List; public class HibImport { private static final Options options = new Options(); private static final Parser parser = (Parser)new BasicParser(); static { options.addOption("f", "force", false, "force overwrite if output HIB already exists"); options.addOption("h", "hdfs-input", false, "assume input directory is on HDFS"); } private static void usage() { // usage HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("hibImport.jar [options] <image directory> <output HIB>", options); System.exit(0); } public static void main(String[] args) throws IOException { // Attempt to parse the command line arguments CommandLine line = null; try { line = parser.parse(options, args); } catch( ParseException exp ) { usage(); } if (line == null) { usage(); } String [] leftArgs = line.getArgs(); if (leftArgs.length != 2) { usage(); } String imageDir = leftArgs[0]; String outputHib = leftArgs[1]; boolean overwrite = false; if (line.hasOption("f")) { overwrite = true; } boolean hdfsInput = false; if (line.hasOption("h")) { hdfsInput = true; } System.out.println("Input image directory: " + imageDir); System.out.println("Input FS: " + (hdfsInput ? "HDFS" : "local FS")); System.out.println("Output HIB: " + outputHib); System.out.println("Overwrite HIB if it exists: " + (overwrite ? "true" : "false")); Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); if (hdfsInput) { FileStatus[] files = fs.listStatus(new Path(imageDir)); if (files == null) { System.err.println(String.format("Did not find any files in the HDFS directory [%s]", imageDir)); System.exit(0); } Arrays.sort(files); HipiImageBundle hib = new HipiImageBundle(new Path(outputHib), conf); hib.openForWrite(overwrite); for (FileStatus file : files) { FSDataInputStream fdis = fs.open(file.getPath()); String source = file.getPath().toString(); HashMap<String, String> metaData = new HashMap<String,String>(); metaData.put("source", source); String fileName = file.getPath().getName().toLowerCase(); String suffix = fileName.substring(fileName.lastIndexOf('.')); if (suffix.compareTo(".jpg") == 0 || suffix.compareTo(".jpeg") == 0) { hib.addImage(fdis, HipiImageFormat.JPEG, metaData); System.out.println(" ** added: " + fileName); } else if (suffix.compareTo(".png") == 0) { hib.addImage(fdis, HipiImageFormat.PNG, metaData); System.out.println(" ** added: " + fileName); } } hib.close(); } else { File folder = new File(imageDir); File[] files = folder.listFiles(); Arrays.sort(files); if (files == null) { System.err.println(String.format("Did not find any files in the local FS directory [%s]", imageDir)); System.exit(0); } HipiImageBundle hib = new HipiImageBundle(new Path(outputHib), conf); hib.openForWrite(overwrite); for (File file : files) { FileInputStream fis = new FileInputStream(file); String localPath = file.getPath(); HashMap<String, String> metaData = new HashMap<String,String>(); metaData.put("source", localPath); String fileName = file.getName().toLowerCase(); metaData.put("filename", fileName); String suffix = fileName.substring(fileName.lastIndexOf('.')); if (suffix.compareTo(".jpg") == 0 || suffix.compareTo(".jpeg") == 0) { hib.addImage(fis, HipiImageFormat.JPEG, metaData); System.out.println(" ** added: " + fileName); } else if (suffix.compareTo(".png") == 0) { hib.addImage(fis, HipiImageFormat.PNG, metaData); System.out.println(" ** added: " + fileName); } } hib.close(); } System.out.println("Created: " + outputHib + " and " + outputHib + ".dat"); } }