org.codehaus.mojo.minijar.resource.ComponentsXmlHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.mojo.minijar.resource.ComponentsXmlHandler.java

Source

package org.codehaus.mojo.minijar.resource;

/*
 * Copyright 2005 The Apache Software Foundation.
 * 
 * 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.
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;

import org.apache.commons.io.IOUtils;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
import org.codehaus.plexus.util.xml.Xpp3DomWriter;
import org.vafer.dependency.resources.ResourceHandler;
import org.vafer.dependency.resources.Version;
import org.vafer.dependency.utils.Jar;

public final class ComponentsXmlHandler implements ResourceHandler {
    public static final String COMPONENTS_XML_PATH = "META-INF/plexus/components.xml";

    private Map components;

    public void onStartProcessing(JarOutputStream pOutput) throws IOException {
        components = new LinkedHashMap();
    }

    public void onStartJar(Jar pJar, JarOutputStream pOutput) throws IOException {
    }

    public InputStream onResource(Jar pJar, String oldName, String newName, Version[] versions,
            InputStream inputStream) throws IOException {
        if (COMPONENTS_XML_PATH.equals(oldName)) {
            // needs to be aggregated

            final File file = File.createTempFile("minijar", "tmp");
            file.deleteOnExit();

            final OutputStream os = new FileOutputStream(file);
            IOUtils.copy(inputStream, os);
            os.close();

            final Xpp3Dom dom;

            try {
                dom = Xpp3DomBuilder.build(new FileReader(file));
            } catch (Exception e) {
                throw new IOException("Error parsing components.xml in " + pJar + " at " + oldName);
            }

            final Xpp3Dom[] children = dom.getChild("components").getChildren("component");

            for (int i = 0; i < children.length; i++) {
                final Xpp3Dom component = children[i];

                final String role = component.getChild("role").getValue();

                final Xpp3Dom child = component.getChild("role-hint");

                final String roleHint = child != null ? child.getValue() : "";

                components.put(role + roleHint, component);
            }

            return new FileInputStream(file);
        }

        return inputStream;
    }

    public void onStopJar(Jar pJar, JarOutputStream pOutput) throws IOException {
    }

    public void onStopProcessing(JarOutputStream pOutput) throws IOException {
        if (components.size() == 0) {
            // no components information available
            return;
        }

        final Xpp3Dom dom = new Xpp3Dom("component-set");
        final Xpp3Dom componentDom = new Xpp3Dom("components");

        dom.addChild(componentDom);

        for (Iterator it = components.values().iterator(); it.hasNext();) {
            final Xpp3Dom component = (Xpp3Dom) it.next();
            componentDom.addChild(component);
        }

        // insert aggregated license information into new jar

        pOutput.putNextEntry(new JarEntry(COMPONENTS_XML_PATH));

        Xpp3DomWriter.write(new OutputStreamWriter(pOutput), dom);
    }

}