Whiteship's Note


BundleManager 0.1 번들 소스 코드

Spring DM/exercise : 2008.07.03 14:36


BundleManager가 할 일
- 특정 폴더에 jar 파일을 집어 넣으면 그 녀석을 설치해야 한다.
- 이미 해당 jar 파일이 설치되어 있다면 설치하지 않는다.

BundleDirectoryManager.java
package whiteship;

import java.io.File;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;

public class BundleDirectoryManager implements BundleActivator {

    private static final long INTERBAL = 1000;
    private static String BUNDLE_DIRECTORY = "E:\\bundles";
    private volatile BundleContext context;

    private final Thread thread = new BundleManager(BUNDLE_DIRECTORY);

    public void start(BundleContext context) throws Exception {
        this.context = context;
        thread.start();
    }

    public void stop(BundleContext context) throws Exception {
        thread.interrupt();
    }

    protected Bundle findBundleByLocation(String location) {
        Bundle[] bundles = context.getBundles();
        for (int i = 0; i < bundles.length; i++) {
            if (bundles[i].getLocation().equals(location)) {
                return bundles[i];
            }
        }
        return null;
    }

    private class BundleManager extends Thread {

        private File bundleLocation;

        public BundleManager() {
            //TODO I need CoC
        }

        public BundleManager(String location) {
            bundleLocation = new File(location);
        }

        public void run() {
            if (!bundleLocation.isDirectory())
                throw new RuntimeException(bundleLocation.getPath()
                        + " is not directory.");

            try {
                while (!Thread.currentThread().isInterrupted()) {
                    Thread.sleep(INTERBAL);

                    for (File file : bundleLocation.listFiles(new JarFileFilter())) {
                        String bundleLocation = "file:" + file.getAbsolutePath();
                        if(findBundleByLocation(bundleLocation) == null)
                            context.installBundle(bundleLocation);
                    }
                }
            } catch (InterruptedException e) {
                System.out.println("I'm going out");
            } catch (BundleException e) {
                System.out.println("Error installing bundle");
                throw new RuntimeException(e);
            }
        }

    }
}

번들을 시작시키면 위의 클래스에 있는 start()가 실행되고, 주기적으로(현재 1초) 특정 폴더(현재 E:\bundles)를 확인해서 그 안에 들어있는 JAR 파일들을 찾아서 설치한다. 이 때 만약 이미 OSGi 플랫폼에 설치되어 있는 번들은 설치하지 않는다.

JarFileFilter.java
package whiteship;

import java.io.File;
import java.io.FileFilter;

public class JarFileFilter implements FileFilter {

    public boolean accept(File f) {
        if(f.isDirectory())
            return false;
       
        String extenstion = getExtension(f);
        if(extenstion != null && extenstion.equals("jar"))
            return true;
       
        return false;
    }

     public String getExtension(File f) {
            String ext = null;
            String s = f.getName();
            int i = s.lastIndexOf('.');

            if (i > 0 &&  i < s.length() - 1) {
                ext = s.substring(i+1).toLowerCase();
            }
            return ext;
        }

}

파일 필터로. 특정 폴더 안에 들어있는 파일들 중에 확장자가 jar 인 파일들만 가져오기 위해서 만들었음.

bnd파일
# bundleManager.bnd
Private-Package: whiteship
Bundle-Activator: whiteship.BundleDirectoryManager




개선하거나 생각해볼 것
- 스프링 DM 번들로 변경하자.
- 시간이랑 폴더는 DI가 가능하도록 변경하자.(기본 값 유지)
- jar 뿐만 아니라 war로 설치를 시도하게 하자. 스프링 DM 웹 번들일 수도 있으니까.
- getExtension() 메소드는 별도의 Util 클래스로 빼내기.
- 예외처리 RuntimeException으로 처리하기.

0.2
- 해당 폴더에서 jar 파일이 삭제되면, 해당 번들을 uninstall 시킨다.

0.3
- 만약 해당 폴더에 있는 jar 파일이 변경되면, 해당 번들을 update 시킨다.

참조: http://neilbartlett.name/blog/osgibook/
top


BundleContext로 할 수 있는 일

Spring DM/OSGi : 2008.06.25 23:12


BundleActivator 다음으로 가장 중요한 OSGi API를 꼽으라면, BundleContext일 겁니다. 어쩌면 BundleActivator보다 중요할지도 모르죠. OSGi 플랫폼에 설치한 번들과 관련된 문맥 정보를 담고 있는 객체니까요. 어떤 용도로 쓸 수 있는지 알아두면 좋겠죠?

시스템 전역에서 사용할 설정 프로퍼티즈 룩업

ID로 설치된 다른 번들 찾기

설치된 모든 번들 목록 가져오기

번들을 프로그래밍을 통해서 라이프사이클 다루기

새로운 번들을 프로그래밍을 통해서 설치하기

프레임워크가 관리하는 영속 저장소에서 파일 가져오거나 저장하기

프레임워크 내부에 있는 어떤 번들의 상태 변화를 알려주기 위한 번들 리스너 등록 또는 해지하기

프레임워크 내부에 있는 어떤 서비스의 상태 변화를 알려주기 위한 서비스 리스너 등록 또는 해지하기

일반적인 프레임워크 이벤트를 알려주기 위한 프레임워크 리스너 등록 또는 해지하기

참조 : http://neilbartlett.name/blog/osgibook/

'Spring DM > OSGi' 카테고리의 다른 글

OSGi 툴 세트 Pax  (0) 2008.10.21
Shared Mutable State  (2) 2008.09.25
The Price of Freedom  (0) 2008.09.25
Concurrency and OSGi  (0) 2008.09.25
BundleContext로 할 수 있는 일  (0) 2008.06.25
2 Security Layer  (0) 2008.02.18
1. Introduction  (0) 2008.02.17
top