2013-08-22 2 views
0

Я пытаюсь установить пакеты OSGi. Я могу сделать это успешно. Прямо сейчас, что я делаю, в нашей компании у нас есть своего рода хранилище, где мы храним все банки OSGi. Поэтому я отправляюсь и загружаю эти баннеры OSGi в какой-то локальный каталог, а затем я пытаюсь установить эти пакеты из локального местоположения, откуда он был загружен из моего хранилища.Установите пакет osgi, используя байтовый массив вместо местоположения файла?

И ниже метод принимает только местоположение файла. Поэтому я предоставляю свой полный путь к файлу на этом пути.

context.installBundle(localFilename)

Есть ли способ, я могу установить его с помощью byte[]. В основном я стараюсь не загружать файл jar из своего хранилища в локальную папку, а затем использовать это локальное местоположение для установки пакетов.

private static void callMethod() throws BundleException { 


    final IStorageServiceClient client = StorageServiceConsumerProvider.getStorageServiceClient(envType); 

    final StorageObjectIdentifier objIdentifierDir = new StorageObjectIdentifier(name, version, null); 

    final List<Map<String, String>> dirs = new ArrayList<Map<String, String>>(); 
    client.listDirectory(objIdentifierDir, dirs); 

    final String filename = name + Constants.DASH + version + Constants.DOTJAR; 
    final String localFilename = basePath + File.separatorChar + filename; 

    // first of all, I am trying to delete the jar file from the local folder, if it is already there 
    new File(localFilename).delete(); 

    final StorageObjectIdentifier objIdentifier = new StorageObjectIdentifier(name, version, filename); 

    // now I get the byte array of the jar file here. 
    final byte[] b = client.retrieveObject(objIdentifier); 

    // now I am writing that jar file to that local folder again using the byte array. 
    final FileOutputStream fos = new FileOutputStream(localFilename); 

    fos.write(b); 
    fos.close(); 

    // now the jar file is there in that location, and now I am using the full path of the jar file to intall it. 
    BundleContext context = framework.getBundleContext(); 
    List<Bundle> installedBundles = new LinkedList<Bundle>(); 

    installedBundles.add(context.installBundle(localFilename)); 

    for (Bundle bundle : installedBundles) { 
     bundle.start(); 
    } 
} 

Есть ли способ, чтобы сделать эту вещь без копирования файла банки с моего места хранения в мою локальную папку, а затем использовать полный путь к моему локальному файлу банки, а затем установить его?

Может ли кто-нибудь помочь мне с этим простым примером на вышеприведенном коде? Спасибо за помощь.

+0

вы пытались с помощью 'BundleContext # installBundle (String, InputStream)', что-то вроде этого: 'context.installBundle (Filename , новый ByteArrayInputStream (b)); ' – Katona

+0

еще нет. Можете ли вы привести мне пример, как это сделать? Спасибо – AKIWEB

+0

Я думаю, вам нужно заменить 'context.installBundle (localFilename)' на 'context.installBundle (имя_файла, новый ByteArrayInputStream (b))', он должен компилироваться, а если и работает, то вы можете избавиться от копирования local folder – Katona

ответ

2

Я не пробовал, но BundleContext#installBundle(String, InputStream) должен быть подходящим для этого. Используя упомянутый метод, код хотел бы это (создание локального файла было удалено):

private static void callMethod() throws BundleException { 

    final IStorageServiceClient client = StorageServiceConsumerProvider.getStorageServiceClient(envType); 

    final StorageObjectIdentifier objIdentifierDir = new StorageObjectIdentifier(name, version, null); 

    final List<Map<String, String>> dirs = new ArrayList<Map<String, String>>(); 
    client.listDirectory(objIdentifierDir, dirs); 

    final String filename = name + Constants.DASH + version + Constants.DOTJAR; 

    final StorageObjectIdentifier objIdentifier = new StorageObjectIdentifier(name, version, filename); 

    // now I get the byte array of the jar file here. 
    final byte[] b = client.retrieveObject(objIdentifier); 

    // now the jar file is there in that location, and now I am using the full path of the jar file to intall it. 
    BundleContext context = framework.getBundleContext(); 
    List<Bundle> installedBundles = new LinkedList<Bundle>(); 

    installedBundles.add(context.installBundle(fileName, new ByteArrayInputStream(b))); 

    for (Bundle bundle : installedBundles) { 
     bundle.start(); 
    } 
} 
Смежные вопросы