/** * * 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.karaf.deployer.features; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import org.apache.karaf.util.DeployerUtils; import org.apache.karaf.util.StreamUtils; import org.osgi.framework.Constants; /** * Transform a feature descriptor into an bundles bundle */ public class FeatureTransformer { public static void transform(URL url, OutputStream os) throws Exception { // Heuristicly retrieve name and version String name = getPath(url); int idx = name.lastIndexOf('/'); if (idx >= 0) { name = name.substring(idx + 1); } String[] str = DeployerUtils.extractNameVersionType(name); // Create manifest Manifest m = new Manifest(); m.getMainAttributes().putValue("Manifest-Version", "2"); m.getMainAttributes().putValue(Constants.BUNDLE_MANIFESTVERSION, "2"); m.getMainAttributes().putValue(Constants.BUNDLE_SYMBOLICNAME, str[0]); m.getMainAttributes().putValue(Constants.BUNDLE_VERSION, str[1]); // Put content JarOutputStream out = new JarOutputStream(os); ZipEntry e = new ZipEntry(JarFile.MANIFEST_NAME); out.putNextEntry(e); m.write(out); out.closeEntry(); e = new ZipEntry("META-INF/"); out.putNextEntry(e); e = new ZipEntry("META-INF/" + FeatureDeploymentListener.FEATURE_PATH + "/"); out.putNextEntry(e); out.closeEntry(); e = new ZipEntry("META-INF/" + FeatureDeploymentListener.FEATURE_PATH + "/" + name); out.putNextEntry(e); try ( InputStream fis = url.openStream() ) { StreamUtils.copy(fis, out); } out.closeEntry(); out.close(); os.close(); } private static String getPath(URL url) { if (url.getProtocol().equals("mvn")) { String[] parts = url.toExternalForm().substring(4).split("/"); String groupId; String artifactId; String version; String type; String qualifier; if (parts.length < 3 || parts.length > 5) { return url.getPath(); } groupId = parts[0]; artifactId = parts[1]; version = parts[2]; type = (parts.length >= 4) ? "." + parts[3] : ".jar"; qualifier = (parts.length >= 5) ? "-" + parts[4] : ""; return groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version + qualifier + type; } return url.getPath(); } }