org.b1.pack.standard.writer.CompressedFormatDetector.java Source code

Java tutorial

Introduction

Here is the source code for org.b1.pack.standard.writer.CompressedFormatDetector.java

Source

/*
 * Copyright 2012 b1.org
 *
 * Licensed 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.b1.pack.standard.writer;

import com.google.common.base.Charsets;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.common.io.CharStreams;
import com.google.common.io.InputSupplier;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.util.Enumeration;
import java.util.StringTokenizer;

class CompressedFormatDetector {

    private static CompressedFormatDetector instance;

    private final ImmutableSet<String> nameExtensions;

    private CompressedFormatDetector(ImmutableSet<String> nameExtensions) {
        this.nameExtensions = nameExtensions;
    }

    public static CompressedFormatDetector getInstance() {
        if (instance == null) {
            // ok to create several instances in rare cases
            instance = new CompressedFormatDetector(loadExtensions());
        }
        return instance;
    }

    public boolean isNameExtensionOfCompressedFile(String extension) {
        return nameExtensions.contains(extension.toLowerCase());
    }

    private static ImmutableSet<String> loadExtensions() {
        try {
            ImmutableSet.Builder<String> builder = ImmutableSet.builder();
            Enumeration<URL> resources = getResources("org/b1/pack/standard/writer/compressedFormats.txt");
            while (resources.hasMoreElements()) {
                readResource(resources.nextElement(), builder);
            }
            return builder.build();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static Enumeration<URL> getResources(String name) throws IOException {
        ClassLoader classLoader = LzmaMethod.class.getClassLoader();
        Enumeration<URL> resources = classLoader != null ? classLoader.getResources(name)
                : ClassLoader.getSystemResources(name);
        Preconditions.checkState(resources.hasMoreElements(), "Cannot find %s", name);
        return resources;
    }

    private static void readResource(final URL url, ImmutableSet.Builder<String> builder) throws IOException {
        StringTokenizer tokenizer = new StringTokenizer(CharStreams.toString(new InputSupplier<Reader>() {
            @Override
            public Reader getInput() throws IOException {
                return new InputStreamReader(url.openStream(), Charsets.UTF_8);
            }
        }));
        while (tokenizer.hasMoreTokens()) {
            builder.add(tokenizer.nextToken().toLowerCase());
        }
    }
}