2  * ============LICENSE_START========================================================================
 
   3  * ONAP : ccsdk feature sdnr wt
 
   4  * =================================================================================================
 
   5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
 
   6  * =================================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 
   8  * in compliance with the License. You may obtain a copy of the License at
 
  10  * http://www.apache.org/licenses/LICENSE-2.0
 
  12  * Unless required by applicable law or agreed to in writing, software distributed under the License
 
  13  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 
  14  * or implied. See the License for the specific language governing permissions and limitations under
 
  16  * ============LICENSE_END==========================================================================
 
  18 package org.onap.ccsdk.features.sdnr.wt.helpserver.data;
 
  21 import java.io.FileOutputStream;
 
  22 import java.io.IOException;
 
  23 import java.io.InputStream;
 
  24 import java.io.OutputStream;
 
  25 import java.util.Enumeration;
 
  26 import org.osgi.framework.Bundle;
 
  29  * Extract subtree with resources from Opendaylight/Karaf/OSGi bundle into Karaf directory<br>
 
  31  * Reference: Eclipsezone @see
 
  32  * <a href="https://www.eclipsezone.com/eclipse/forums/t101557.html">https://www.eclipszone.com</a> <br>
 
  34  * Example for resource and directory path from karaf log. write resource: help/FAQ/0.4.0/README.md Create directories
 
  35  * for: data/cache/com.highstreet.technologies.help/help/FAQ/0.4.0/README.md Open the file:
 
  36  * data/cache/com.highstreet.technologies.help/help/FAQ/0.4.0/README.md Problem: Binary, JPG files => do not use buffer
 
  39  * Hint: Verify with file manager the content of the bundle.jar file to see the location of the resources. There is no
 
  40  * need to mark them via the classpath.
 
  43 public class ExtactBundleResource {
 
  46      * Extract resources from Karaf/OSGi bundle into karaf directory structure.
 
  48      * @param bundle Karaf/OSGi bundle with resources
 
  49      * @param filePrefix prefix in karaf file system for destination e.g. "data/cache/com.highstreet.technologies."
 
  50      * @param ressoureRoot root name of ressources, with leading "/". e.g. "/help"
 
  51      * @throws IOException In case of problems.
 
  53     public static void copyBundleResoucesRecursively(Bundle bundle, String filePrefix, String ressoureRoot)
 
  55         copyResourceTreeRecurse(bundle, filePrefix, bundle.getEntryPaths(ressoureRoot));
 
  59      * Delete a file or a directory and its children.
 
  61      * @param file The directory to delete.
 
  62      * @throws IOException Exception when problem occurs during deleting the directory.
 
  64     public static void deleteRecursively(File file) throws IOException {
 
  66         if (file.isDirectory()) {
 
  67             for (File childFile : file.listFiles()) {
 
  68                 deleteRecursively(childFile);
 
  73                 throw new IOException("No file " + file.getName());
 
  78     // ------------- Private functions
 
  81      * Recurse function to steps through the resource element tree
 
  83      * @param b Bundle index for bundle with resourcs
 
  88     private static void copyResourceTreeRecurse(Bundle b, String filePrefix, Enumeration<String> resource)
 
  90         while (resource.hasMoreElements()) {
 
  91             String name = resource.nextElement();
 
  92             Enumeration<String> list = b.getEntryPaths(name);
 
  94                 copyResourceTreeRecurse(b, filePrefix, list);
 
  97                 File targetFile = new File(filePrefix + name);
 
  98                 targetFile.getParentFile().mkdirs();
 
 100                 try (InputStream in = b.getEntry(name).openStream();
 
 101                         OutputStream outStream = new FileOutputStream(targetFile);) {
 
 104                     while ((theInt = in.read()) >= 0) {
 
 105                         outStream.write(theInt);