| /** |
| * |
| * 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.osgi.framework.Constants; |
| |
| /** |
| * Transform a feature descriptor into an osgi bundle |
| */ |
| public class FeatureTransformer { |
| |
| public static void transform(URL url, OutputStream os) throws Exception { |
| // Heuristicly retrieve name and version |
| String name = url.getPath(); |
| 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); |
| InputStream fis = url.openStream(); |
| try { |
| copyInputStream(fis, out); |
| } finally { |
| fis.close(); |
| } |
| out.closeEntry(); |
| out.close(); |
| os.close(); |
| } |
| |
| private static void copyInputStream(InputStream in, OutputStream out) throws IOException { |
| byte[] buffer = new byte[8192]; |
| int len = in.read(buffer); |
| while (len >= 0) { |
| out.write(buffer, 0, len); |
| len = in.read(buffer); |
| } |
| } |
| |
| } |