package org.apache.maven.plugins.shade.resource;

/*
 * 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 static org.junit.Assert.assertEquals;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;

import org.apache.maven.plugins.shade.relocation.Relocator;
import org.apache.maven.plugins.shade.relocation.SimpleRelocator;
import org.junit.Before;
import org.junit.Test;

public class ManifestResourceTransformerTest
{
    private ManifestResourceTransformer transformer;
    
    @Before
    public void setUp() 
    {
        transformer = new ManifestResourceTransformer();
    }

    @Test
    public void rewriteDefaultAttributes() throws Exception
    {
        final Manifest manifest = new Manifest();
        final Attributes attributes = manifest.getMainAttributes();
        attributes.put(Attributes.Name.MANIFEST_VERSION, "1.0");
        attributes.putValue("Export-Package",
                "javax.decorator;version=\"2.0\";uses:=\"javax.enterprise.inject\"," +
                        "javax.enterprise.context;version=\"2.0\";uses:=\"javax.enterprise.util,javax.inject\"");
        attributes.putValue("Import-Package",
                "javax.el,javax.enterprise.context;version=\"[2.0,3)\"");
        attributes.putValue("Provide-Capability",
                "osgi.contract;osgi.contract=JavaCDI;uses:=\"" +
                        "javax.enterprise.context,javax.enterprise.context.spi,javax.enterprise.context.control," +
                        "javax.enterprise.util,javax.enterprise.inject,javax.enterprise.inject.spi," +
                        "javax.enterprise.inject.spi.configurator,javax.enterprise.inject.literal," +
                        "javax.enterprise.inject.se,javax.enterprise.event,javax.decorator\";" +
                        "version:List<Version>=\"2.0,1.2,1.1,1.0\"");
        attributes.putValue("Require-Capability",
                "osgi.serviceloader;" +
                        "filter:=\"(osgi.serviceloader=javax.enterprise.inject.se.SeContainerInitializer)\";" +
                        "cardinality:=multiple," +
                        "osgi.serviceloader;" +
                        "filter:=\"(osgi.serviceloader=javax.enterprise.inject.spi.CDIProvider)\";" +
                        "cardinality:=multiple,osgi.extender;" +
                        "filter:=\"(osgi.extender=osgi.serviceloader.processor)\"," +
                        "osgi.contract;osgi.contract=JavaEL;filter:=\"(&(osgi.contract=JavaEL)(version=2.2.0))\"," +
                        "osgi.contract;osgi.contract=JavaInterceptor;" +
                        "filter:=\"(&(osgi.contract=JavaInterceptor)(version=1.2.0))\"," +
                        "osgi.contract;osgi.contract=JavaInject;" +
                        "filter:=\"(&(osgi.contract=JavaInject)(version=1.0.0))\"," +
                        "osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.8))\"");
        
        List<Relocator> relocators =
            Collections.<Relocator>singletonList( new SimpleRelocator( "javax", "jakarta",
                                                                       Collections.<String>emptyList(),
                                                                       Collections.<String>emptyList() ) );
        
        final ByteArrayOutputStream out = transform( manifest, relocators );

        try ( final JarInputStream jis = new JarInputStream( new ByteArrayInputStream( out.toByteArray() ) ) )
        {
            final Attributes attrs = jis.getManifest().getMainAttributes();
            assertEquals(
                    "jakarta.decorator;version=\"2.0\";uses:=\"jakarta.enterprise.inject\"," +
                    "jakarta.enterprise.context;version=\"2.0\";uses:=\"jakarta.enterprise.util," +
                    "jakarta.inject\"",
                    attrs.getValue("Export-Package"));
            assertEquals("jakarta.el,jakarta.enterprise.context;version=\"[2.0,3)\"",
                    attrs.getValue("Import-Package"));
            assertEquals(
                    "osgi.contract;osgi.contract=JavaCDI;" +
                            "uses:=\"jakarta.enterprise.context," +
                            "jakarta.enterprise.context.spi,jakarta.enterprise.context.control," +
                            "jakarta.enterprise.util,jakarta.enterprise.inject,jakarta.enterprise.inject.spi," +
                            "jakarta.enterprise.inject.spi.configurator,jakarta.enterprise.inject.literal," +
                            "jakarta.enterprise.inject.se,jakarta.enterprise.event," +
                            "jakarta.decorator\";version:List<Version>=\"2.0,1.2,1.1,1.0\"",
                    attrs.getValue("Provide-Capability"));
            assertEquals(
                    "osgi.serviceloader;" +
                            "filter:=\"(osgi.serviceloader=jakarta.enterprise.inject.se.SeContainerInitializer)\";" +
                            "cardinality:=multiple,osgi.serviceloader;" +
                            "filter:=\"(osgi.serviceloader=jakarta.enterprise.inject.spi.CDIProvider)\";" +
                            "cardinality:=multiple,osgi.extender;" +
                            "filter:=\"(osgi.extender=osgi.serviceloader.processor)\"," +
                            "osgi.contract;osgi.contract=JavaEL;filter:=\"(&(osgi.contract=JavaEL)(version=2.2.0))\"," +
                            "osgi.contract;osgi.contract=JavaInterceptor;" +
                            "filter:=\"(&(osgi.contract=JavaInterceptor)(version=1.2.0))\"," +
                            "osgi.contract;osgi.contract=JavaInject;" +
                            "filter:=\"(&(osgi.contract=JavaInject)(version=1.0.0))\"," +
                            "osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.8))\"",
                    attrs.getValue("Require-Capability"));
        }
    }
    
    @Test
    public void rewriteAdditionalAttributes() throws Exception
    {
        final Manifest manifest = new Manifest();
        final Attributes attributes = manifest.getMainAttributes();
        attributes.put(Attributes.Name.MANIFEST_VERSION, "1.0");
        attributes.putValue("description-custom",
                "This jar uses javax packages");
        
        List<Relocator> relocators =
            Collections.<Relocator>singletonList( new SimpleRelocator( "javax", "jakarta",
                                                                       Collections.<String>emptyList(),
                                                                       Collections.<String>emptyList() ) );
        
        transformer.setAdditionalAttributes( Arrays.asList("description-custom", "attribute-unknown") );
        final ByteArrayOutputStream out = transform( manifest, relocators );

        try ( final JarInputStream jis = new JarInputStream( new ByteArrayInputStream( out.toByteArray() ) ) )
        {
            final Attributes attrs = jis.getManifest().getMainAttributes();
            assertEquals( "This jar uses jakarta packages", attrs.getValue( "description-custom" ) );
        }
    }

    private ByteArrayOutputStream transform( final Manifest manifest, List<Relocator> relocators )
        throws IOException
    {
        final ByteArrayOutputStream mboas = new ByteArrayOutputStream();
        try ( final OutputStream mos = mboas )
        {
            manifest.write( mos );
        }
        transformer.processResource( JarFile.MANIFEST_NAME, new ByteArrayInputStream( mboas.toByteArray() ),
                                     relocators );

        final ByteArrayOutputStream out = new ByteArrayOutputStream();
        try ( final JarOutputStream jarOutputStream = new JarOutputStream( out ) )
        {
            transformer.modifyOutputStream( jarOutputStream );
        }
        return out;
    }
}