package org.apache.maven.plugins.assembly.archive;

/*
 * 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.
 */

import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
import org.apache.maven.plugins.assembly.InvalidAssemblerConfigurationException;
import org.apache.maven.plugins.assembly.format.AssemblyFormattingException;
import org.apache.maven.plugins.assembly.model.Assembly;

import java.io.File;

/**
 * Creates an archive
 *
 * @version $Id$
 */
public interface AssemblyArchiver
{
    String ROLE = AssemblyArchiver.class.getName();

    /**
     * Create the assembly archive. Generally:
     * <ol>
     * <li>Setup any directory structures for temporary files</li>
     * <li>Calculate the output directory/file for the assembly</li>
     * <li>Setup any handler components for special descriptor files we may encounter</li>
     * <li>Lookup and configure the {@link org.codehaus.plexus.archiver.Archiver} to be used</li>
     * <li>Determine what, if any, dependency resolution will be required, and resolve any dependency-version conflicts
     * up front to produce a managed-version map for the whole assembly process.</li>
     * <li>Iterate through the available {@link org.apache.maven.plugins.assembly.archive.phase.AssemblyArchiverPhase}
     * instances, executing each to handle a different
     * top-level section of the assembly descriptor, if that section is present.</li>
     * </ol>
     *
     * @param assembly              The {@link Assembly}
     * @param fullName              The full name.
     * @param format                The format.
     * @param configSource          The {@link org.apache.maven.plugins.assembly.AssemblerConfigurationSource}
     * @param recompressZippedFiles recompress zipped files.
     * @param mergeManifestMode     How to handle already existing Manifest files (skip, merge, mergewithoutmain)
     * @return The resulting archive file.
     * @throws ArchiveCreationException                                                 when creation fails
     * @throws org.apache.maven.plugins.assembly.format.AssemblyFormattingException     when formatting fails
     * @throws org.apache.maven.plugins.assembly.InvalidAssemblerConfigurationException when the configurationis bad
     */
    File createArchive( Assembly assembly, String fullName, String format, AssemblerConfigurationSource configSource,
                        boolean recompressZippedFiles, String mergeManifestMode )
        throws ArchiveCreationException, AssemblyFormattingException, InvalidAssemblerConfigurationException;
}
