Java tutorial
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); } }