/*
 * 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.felix.framework.cache;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;

public interface Content
{
    /**
     * <p>
     * This method must be called when the content is no longer needed so
     * that any resourses being used (e.g., open files) can be closed. Once
     * this method is called, the content is no longer usable. If the content
     * is already closed, then calls on this method should have no effect.
     * </p>
    **/
    void close();

    /**
     * <p>
     * This method determines if the specified named entry is contained in
     * the associated content. The entry name is a relative path with '/'
     * separators.
     * </p>
     * @param name The name of the entry to find.
     * @return <tt>true</tt> if a corresponding entry was found, <tt>false</tt>
     *         otherwise.
    **/
    boolean hasEntry(String name);

    /**
     * <p>
     * Returns an enumeration of entry names as <tt>String</tt> objects.
     * An entry name is a path constructed with '/' as path element
     * separators and is relative to the root of the content. Entry names
     * for entries that represent directories should end with the '/'
     * character.
     * </p>
     * @returns An enumeration of entry names or <tt>null</tt>.
    **/
    Enumeration<String> getEntries();

    /**
     * <p>
     * This method returns the named entry as an array of bytes.
     * </p>
     * @param name The name of the entry to retrieve as a byte array.
     * @return An array of bytes if the corresponding entry was found, <tt>null</tt>
     *         otherwise.
    **/
    byte[] getEntryAsBytes(String name);

    /**
     * <p>
     * This method returns the named entry as an input stream.
     * </p>
     * @param name The name of the entry to retrieve as an input stream.
     * @return An input stream if the corresponding entry was found, <tt>null</tt>
     *         otherwise.
     * @throws <tt>java.io.IOException</tt> if any error occurs.
    **/
    InputStream getEntryAsStream(String name) throws IOException;

    /**
     * <p>
     * This method returns the named entry as an <tt>IContent</tt> Typically,
     * this method only makes sense for entries that correspond to some form
     * of aggregated resource (e.g., an embedded JAR file or directory), but
     * implementations are free to interpret this however makes sense. This method
     * should return a new <tt>IContent</tt> instance for every invocation and
     * the caller is responsible for opening and closing the returned content
     * object.
     * </p>
     * @param name The name of the entry to retrieve as an <tt>IContent</tt>.
     * @return An <tt>IContent</tt> instance if a corresponding entry was found,
     *         <tt>null</tt> otherwise.
    **/
    Content getEntryAsContent(String name);

    /**
     * <p>
     * This method returns the named entry as a file in the file system for
     * use as a native library. It may not be possible for all content
     * implementations (e.g., memory only) to implement this method, in which
     * case it is acceptable to return <tt>null</tt>. Since native libraries
     * can only be associated with a single class loader, this method should
     * return a unique file per request.
     * </p>
     * @param name The name of the entry to retrieve as a file.
     * @return A string corresponding to the absolute path of the file if a
     *         corresponding entry was found, <tt>null</tt> otherwise.
    **/
    String getEntryAsNativeLibrary(String name);

    /**
     * <p>
     *  This method allows retrieving an entry as a local URL.
     * </p>
     *
     * @param name The name of the entry to retrieve as a URL
     * @return A URL using a local protocol such as file, jar
     *           or null if not possible.
     */
    URL getEntryAsURL(String name);
}