v7db.files.CatCommand.java Source code

Java tutorial

Introduction

Here is the source code for v7db.files.CatCommand.java

Source

/**
 * Copyright (c) 2011-2012, Thilo Planz. All rights reserved.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package v7db.files;

import java.io.IOException;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import v7db.files.mongodb.MongoContentStorage;
import v7db.files.mongodb.V7File;
import v7db.files.mongodb.V7GridFS;
import v7db.files.spi.Content;

import com.mongodb.MongoException;

class CatCommand {

    static byte[] decodeSHAPrefix(String shaPrefix) throws DecoderException, IOException {
        byte[] id;
        if (shaPrefix.startsWith("BinData(")) {
            id = Base64.decodeBase64(StringUtils.substringBetween(shaPrefix, ",", ")"));
        } else {
            id = Hex.decodeHex(shaPrefix.toCharArray());
        }
        if (id.length > 20)
            throw new DecoderException("too long");
        return id;
    }

    private static Content findContentByPrefix(MongoContentStorage storage, String shaPrefix)
            throws DecoderException, IOException {
        return storage.findContentByPrefix(decodeSHAPrefix(shaPrefix));
    }

    public static void main(String[] args) throws MongoException, IOException {

        if (args.length != 3) {
            System.err.println("Output the contents of a file:");
            System.err.println("  by name:   cat <root> <path>");
            System.err.println("  by hash:   cat -sha <shaHex>");
            System.exit(1);
        }

        if ("-sha".equals(args[1])) {
            MongoContentStorage storage = new MongoContentStorage(
                    Configuration.getMongo().getDB(Configuration.getProperty("mongo.db")));
            String sha = args[2];
            try {
                Content file = findContentByPrefix(storage, sha);
                if (file == null) {
                    System.err.println("file not found");
                    System.exit(1);
                }
                IOUtils.copy(file.getInputStream(), System.out);
            } catch (DecoderException e) {
                System.err.println("invalid parameter :" + sha + " is not a hex-encoded SHA-1 prefix");
                System.exit(1);
            }
        } else {

            V7GridFS fs = new V7GridFS(Configuration.getMongo().getDB(Configuration.getProperty("mongo.db")));

            String root = args[1];
            String path = args[2];
            String[] fullPath = ArrayUtils.add(StringUtils.split(path, '/'), 0, root);
            V7File file = fs.getFile(fullPath);
            if (file == null) {
                System.err.println("file not found");
                System.exit(1);
            }
            IOUtils.copy(file.getInputStream(), System.out);
        }

    }
}