All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.joshworks.snappy.loader.archive.Archive Maven / Gradle / Ivy

There is a newer version: 0.2
Show newest version
/*
 * Copyright 2012-2015 the original author or authors.
 *
 * 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 io.joshworks.snappy.loader.archive;

import io.joshworks.snappy.loader.Launcher;
import io.joshworks.snappy.loader.util.AsciiBytes;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collection;
import java.util.List;
import java.util.jar.Manifest;

/**
 * An archive that can be launched by the {@link Launcher}.
 *
 * @author Phillip Webb
 * @see JarFileArchive
 */
public abstract class Archive {

    /**
     * Returns a URL that can be used to load the archive.
     *
     * @return the archive URL
     * @throws MalformedURLException if the URL is malformed
     */
    public abstract URL getUrl() throws MalformedURLException;

    /**
     * Obtain the main class that should be used to launch the application. By default
     * this method uses a {@code Start-Class} manifest entry.
     *
     * @return the main class
     * @throws Exception if the main class cannot be obtained
     */
    public String getMainClass() throws Exception {
        Manifest manifest = getManifest();
        String mainClass = null;
        if (manifest != null) {
            mainClass = manifest.getMainAttributes().getValue("Start-Class");
        }
        if (mainClass == null) {
            throw new IllegalStateException(
                    "No 'Start-Class' manifest entry specified in " + this);
        }
        return mainClass;
    }

    @Override
    public String toString() {
        try {
            return getUrl().toString();
        } catch (Exception ex) {
            return "archive";
        }
    }

    /**
     * Returns the manifest of the archive.
     *
     * @return the manifest
     * @throws IOException if the manifest cannot be read
     */
    public abstract Manifest getManifest() throws IOException;

    /**
     * Returns all entries from the archive.
     *
     * @return the archive entries
     */
    public abstract Collection getEntries();

    /**
     * Returns nested {@link Archive}s for entries that match the specified filter.
     *
     * @param filter the filter used to limit entries
     * @return nested archives
     * @throws IOException if nested archives cannot be read
     */
    public abstract List getNestedArchives(EntryFilter filter)
            throws IOException;

    /**
     * Returns a filtered version of the archive.
     *
     * @param filter the filter to apply
     * @return a filter archive
     * @throws IOException if the archive cannot be read
     */
    public abstract Archive getFilteredArchive(EntryRenameFilter filter)
            throws IOException;

    /**
     * Represents a single entry in the archive.
     */
    public interface Entry {

        /**
         * Returns {@code true} if the entry represents a directory.
         *
         * @return if the entry is a directory
         */
        boolean isDirectory();

        /**
         * Returns the name of the entry.
         *
         * @return the name of the entry
         */
        AsciiBytes getName();

    }

    /**
     * Strategy interface to filter {@link Entry Entries}.
     */
    public interface EntryFilter {

        /**
         * Apply the jar entry filter.
         *
         * @param entry the entry to filter
         * @return {@code true} if the filter matches
         */
        boolean matches(Entry entry);

    }

    /**
     * Strategy interface to filter or rename {@link Entry Entries}.
     */
    public interface EntryRenameFilter {

        /**
         * Apply the jar entry filter.
         *
         * @param entryName the current entry name. This may be different that the
         *                  original entry name if a previous filter has been applied
         * @param entry     the entry to filter
         * @return the new name of the entry or {@code null} if the entry should not be
         * included.
         */
        AsciiBytes apply(AsciiBytes entryName, Entry entry);

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy