001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one or more
003 *  contributor license agreements.  See the NOTICE file distributed with
004 *  this work for additional information regarding copyright ownership.
005 *  The ASF licenses this file to You under the Apache License, Version 2.0
006 *  (the "License"); you may not use this file except in compliance with
007 *  the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 *  Unless required by applicable law or agreed to in writing, software
012 *  distributed under the License is distributed on an "AS IS" BASIS,
013 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 *  See the License for the specific language governing permissions and
015 *  limitations under the License.
016 */
017package org.apache.commons.compress.archivers.sevenz;
018
019import java.io.File;
020import java.io.IOException;
021import java.util.Locale;
022
023/**
024 * Usage: archive-name [list]
025 */
026public class CLI {
027
028    private enum Mode {
029        LIST("Analysing") {
030            private String getContentMethods(final SevenZArchiveEntry entry) {
031                final StringBuilder sb = new StringBuilder();
032                boolean first = true;
033                for (final SevenZMethodConfiguration m : entry.getContentMethods()) {
034                    if (!first) {
035                        sb.append(", ");
036                    }
037                    first = false;
038                    sb.append(m.getMethod());
039                    if (m.getOptions() != null) {
040                        sb.append("(").append(m.getOptions()).append(")");
041                    }
042                }
043                return sb.toString();
044            }
045
046            @Override
047            public void takeAction(final SevenZFile archive, final SevenZArchiveEntry entry) {
048                System.out.print(entry.getName());
049                if (entry.isDirectory()) {
050                    System.out.print(" dir");
051                } else {
052                    System.out.print(" " + entry.getCompressedSize() + "/" + entry.getSize());
053                }
054                if (entry.getHasLastModifiedDate()) {
055                    System.out.print(" " + entry.getLastModifiedDate());
056                } else {
057                    System.out.print(" no last modified date");
058                }
059                if (!entry.isDirectory()) {
060                    System.out.println(" " + getContentMethods(entry));
061                } else {
062                    System.out.println();
063                }
064            }
065        };
066
067        private final String message;
068
069        Mode(final String message) {
070            this.message = message;
071        }
072
073        public String getMessage() {
074            return message;
075        }
076
077        public abstract void takeAction(SevenZFile archive, SevenZArchiveEntry entry) throws IOException;
078    }
079
080    private static Mode grabMode(final String[] args) {
081        if (args.length < 2) {
082            return Mode.LIST;
083        }
084        return Enum.valueOf(Mode.class, args[1].toUpperCase(Locale.ROOT));
085    }
086
087    public static void main(final String[] args) throws Exception {
088        if (args.length == 0) {
089            usage();
090            return;
091        }
092        final Mode mode = grabMode(args);
093        System.out.println(mode.getMessage() + " " + args[0]);
094        final File file = new File(args[0]);
095        if (!file.isFile()) {
096            System.err.println(file + " doesn't exist or is a directory");
097        }
098        try (SevenZFile archive = SevenZFile.builder().setFile(file).get()) {
099            SevenZArchiveEntry ae;
100            while ((ae = archive.getNextEntry()) != null) {
101                mode.takeAction(archive, ae);
102            }
103        }
104    }
105
106    private static void usage() {
107        System.out.println("Parameters: archive-name [list]");
108    }
109
110}