Author: bodewig Date: Mon Aug 11 13:35:46 2014 New Revision: 1617280 URL: http://svn.apache.org/r1617280 Log: I seem to be re-writing a class like this every time I analyze a 7z archive
Added: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CLI.java (with props) Added: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CLI.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CLI.java?rev=1617280&view=auto ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CLI.java (added) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CLI.java Mon Aug 11 13:35:46 2014 @@ -0,0 +1,147 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.commons.compress.archivers.sevenz; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +public class CLI { + + private static enum Mode { + LIST("Analysing") { + public void takeAction(SevenZFile archive, SevenZArchiveEntry entry) { + System.out.print(entry.getName()); + if (entry.isDirectory()) { + System.out.print(" dir"); + } else { + System.out.print(" " + entry.getCompressedSize() + + "/" + entry.getSize()); + } + if (entry.getHasLastModifiedDate()) { + System.out.print(" " + entry.getLastModifiedDate()); + } else { + System.out.print(" no last modified date"); + } + if (!entry.isDirectory()) { + System.out.println(" " + getContentMethods(entry)); + } else { + System.out.println(""); + } + } + + private String getContentMethods(SevenZArchiveEntry entry) { + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (SevenZMethodConfiguration m : entry.getContentMethods()) { + if (!first) { + sb.append(", "); + } + first = false; + sb.append(m.getMethod()); + if (m.getOptions() != null) { + sb.append("(" + m.getOptions() + ")"); + } + } + return sb.toString(); + } + }, + EXTRACT("Extracting") { + public void takeAction(SevenZFile archive, SevenZArchiveEntry entry) + throws IOException { + File outFile = new File(entry.getName()); + if (entry.isDirectory()) { + System.out.println("creating " + outFile); + outFile.mkdirs(); + return; + } + + System.out.println("extracting to " + outFile); + File parent = outFile.getParentFile(); + if (!parent.exists() && !parent.mkdirs()) { + throw new IOException("Cannot create " + parent); + } + FileOutputStream fos = new FileOutputStream(outFile); + try { + byte[] contents = new byte[(int) entry.getSize()]; + int off = 0; + while (off < contents.length) { + int bytesRead = archive.read(contents, off, + contents.length - off); + System.err.println("read at offset " + off + " returned " + + bytesRead + " bytes."); + if (bytesRead < 1) { + throw new IOException("reached end of entry " + + entry.getName() + + " after " + off + + " bytes, expected " + + contents.length); + } + off += bytesRead; + } + } finally { + fos.close(); + } + } + }; + + private final String message; + private Mode(String message) { + this.message = message; + } + public String getMessage() { + return message; + } + public abstract void takeAction(SevenZFile archive, SevenZArchiveEntry entry) + throws IOException; + } + + public static void main(String[] args) throws Exception { + if (args.length == 0) { + usage(); + return; + } + Mode mode = grabMode(args); + System.out.println(mode.getMessage() + " " + args[0]); + File f = new File(args[0]); + if (!f.isFile()) { + System.err.println(f + " doesn't exist or is a directory"); + } + SevenZFile archive = new SevenZFile(f); + try { + SevenZArchiveEntry ae; + while((ae=archive.getNextEntry()) != null) { + mode.takeAction(archive, ae); + } + } finally { + archive.close(); + } + } + + private static void usage() { + System.out.println("Parameters: archive-name [list|extract]"); + } + + private static Mode grabMode(String[] args) { + if (args.length < 2) { + return Mode.LIST; + } + return Enum.valueOf(Mode.class, args[1].toUpperCase()); + } + +} Propchange: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/CLI.java ------------------------------------------------------------------------------ svn:eol-style = native