View Javadoc

1   package rydeen;
2   
3   import java.io.IOException;
4   import java.util.Iterator;
5   
6   import rydeen.spi.ProcessorService;
7   import rydeen.spi.ProcessorServiceLoader;
8   import rydeen.spi.ProcessorServiceLoaderFactory;
9   
10  /**
11   * Rydeenの実行環境を表すクラスです.
12   * このクラスは基本的にRydeen実行中に1つだけ作成されます.
13   * 主に処理器のロードに用いられます.
14   * 
15   * @author Haruaki Tamada
16   */
17  public class Environment implements Iterable<ProcessorService>{
18      private ProcessorServicePool pool;
19  
20      /**
21       * 指定されたクラスローダから処理器をロードするオブジェクトを構築します.
22       */
23      public Environment(ClassLoader loader){
24          initialize(loader);
25      }
26  
27      /**
28       * デフォルトの場所からロードするクラスローダを使って,
29       * 処理器をロードするオブジェクトを構築します.
30       * @see LocalClassLoaderBuilder
31       */
32      public Environment(){
33          initialize(buildClassLoader());
34      }
35  
36      /**
37       * ロード可能な処理器のサービスプロバイダの列挙を返します.
38       * @see ProcessorService
39       */
40      public Iterator<ProcessorService> iterator(){
41          return pool.iterator();
42      }
43  
44      /**
45       * 指定された名前を持つ処理器のサービスプロバイダを返します.
46       * 指定された名前を持つ処理器が存在しない場合はnullを返します.
47       * 引数にnullが与えられた場合はNullPointerExceptionが投げられます.
48       */
49      public ProcessorService getService(String name){
50          if(name == null){
51              throw new NullPointerException();
52          }
53          return pool.getService(name);
54      }
55  
56      /**
57       * クラスローダを更新し,指定されたクラスローダから処理器のサービスプロバイダを取得します.
58       * 指定されたクラスローダがnullの場合はNullPointerExceptionが投げられます.
59       */
60      public void updateClassLoader(ClassLoader loader){
61          ProcessorServiceLoader serviceLoader = ProcessorServiceLoaderFactory.getInstance().getLoader();
62          serviceLoader.loadServices(pool, loader);
63      }
64  
65      /**
66       * 現在この環境オブジェクトが保持する処理器のサービスプロバイダの数を返します.
67       * 返り値は必ず0以上になります.
68       */
69      public int getServiceCount(){
70          return pool.getServiceCount();
71      }
72  
73      private ClassLoader buildClassLoader(){
74          ClassLoaderBuilder builder = new LocalClassLoaderBuilder();
75          ClassLoader loader = null;
76          try{
77              loader = builder.createLoader();
78          } catch(IOException e){
79              e.printStackTrace();
80          }
81          return loader;
82      }
83  
84      private void initialize(ClassLoader loader){
85          pool = new ProcessorServicePool();
86  
87          updateClassLoader(loader);
88      }
89  }