1 package jp.ac.aiit.xdf.application;
4 import java.io.FileInputStream;
5 import java.io.FileNotFoundException;
6 import java.io.InputStream;
7 import java.net.URISyntaxException;
9 import java.util.ArrayList;
10 import java.util.HashMap;
11 import java.util.List;
14 import jp.ac.aiit.xdf.application.interceptors.UIDesignInterceptingManager;
15 import jp.ac.aiit.xdf.application.interceptors.UIDesignResource;
16 import jp.ac.aiit.xdf.component.common.CommonTagReferences;
17 import jp.ac.aiit.xdf.core.action.factory.ActionFactory;
18 import jp.ac.aiit.xdf.core.action.factory.DefaultActionFactory;
19 import jp.ac.aiit.xdf.core.exceptions.UnexpectedBehaviorException;
20 import jp.ac.aiit.xdf.core.model.ObjectModel;
21 import jp.ac.aiit.xdf.core.selector.Selector;
22 import jp.ac.aiit.xdf.core.tags.Tagdef.Tag;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
28 * 本フレームワークで作成されたアプリケーションを管理するクラス
29 * プラグイン提供されたコンポーネント群やアクションインスタンスの生成方法などを設定することができる
30 * なお、本クラスはSigletonになっているため、インスタンスの取得にはgetInstanceメソッドを用いること
32 * @author Shunichi Takagi
34 public class Application {
35 private static final Logger log = LoggerFactory.getLogger(Application.class);
40 public static final Application instance = new Application();
42 private Application(){
43 this.toolkit = "swing";
44 this.definedTags = new HashMap<String, Tag>();
45 this.factory = new DefaultActionFactory();
46 this.windows = new HashMap<String, InputStream>();
48 this.refs = new ArrayList<TagReferences>();
49 useTags(new CommonTagReferences());
51 this.openedWindows = new HashMap<String, ObjectModel>();
54 private LifeCycle lifeCycle = new DefaultLifeCycle();
56 private String toolkit;
57 private Map<String, Tag> definedTags;
58 private Map<String, InputStream> windows;
60 private ActionFactory factory;
61 private List<TagReferences> refs;
63 private Map<String, ObjectModel> openedWindows;
66 * アプリケーションのインスタンス取得メソッド
67 * @return シングルトン化されたApplicationのインスタンス
69 public static Application getInstance() {
74 * アプリケーションのインスタンス取得メソッド
75 * 引数で与えられたタグ参照の読み込みをインスタンス取得と同時に行う
77 * @param refs このアプリケーションで利用するタグ参照の固まり。プラグインによって提供される
78 * @return アプリケーションのインスタンス
80 public static Application getInstance(TagReferences ...refs) {
81 for(TagReferences ref : refs) {
82 instance.useTags(ref);
88 * このアプリケーションに対するライフサイクルを設定
90 * @param lifeCycle このアプリケーションに設定されるライフサイクル
92 public void setLifeCycle(LifeCycle lifeCycle) {
93 this.lifeCycle = lifeCycle;
96 * このアプリケーションを実行するツールキット環境を設定する
99 public void setToolkit(String toolkit) {
100 this.toolkit = toolkit;
104 * このアプリケーションを実行するツールキット環境名を取得する
107 public String getToolkit() {
112 * アプリケーション内で使用するタグを追加する
115 public void useTags(TagReferences refs) {
117 this.definedTags = mergeTags(definedTags, refs.getDefinedTags());
121 * アプリケーション内で利用されるActionをインスタンス化するための方法を設定する
122 * @param factory アクションのインスタンス生成ファクトリ
124 public void setActionFactory(ActionFactory factory) {
125 this.factory = factory;
129 * アプリケーション内でアクションのインスタンス化に使用されるファクトリを取得
130 * @return アクションファクトリのインスタンス
132 public ActionFactory getActionFactory() {
137 * アプリケーションにウィンドウを追加する
140 * @param uidesign ウィンドウ定義ファイルへのClasspath上のパス
141 * @throws FileNotFoundException 指定されたファイルが見つからなかった場合にthrowされる
143 public void registWindow(String name, String uidesign) throws FileNotFoundException {
144 URL url = ClassLoader.getSystemResource(uidesign);
147 log.warn("指定された画面定義XMLファイルが見つかりません file:"+uidesign);
148 throw new FileNotFoundException("指定された画面定義XMLファイルが見つかりません file:"+uidesign);
151 windows.put(name, new FileInputStream( new File( url.toURI() ) ));
152 } catch (URISyntaxException e) {
153 log.warn("フレームワーク内部で予期しない例外が発生しました。", e);
154 throw new UnexpectedBehaviorException("フレームワーク内部で予期しない例外が発生しました。", e);
160 * アプリケーションにウィンドウを追加する
163 * @param uidesign ウィンドウ定義ファイルを読み込むためのストリーム
165 public void registWindow(String name, InputStream uidesign) {
166 windows.put(name, uidesign);
172 * @param name 起動するウィンドウの名前
174 public void open(String name) {
175 if( windows.containsKey(name) ) {
176 if( openedWindows.size() == 0 ) {
179 lifeCycle.beforeOpened(name);
181 InputStream inputStream = windows.get(name);
183 UIDesignResource resource = new UIDesignResource(inputStream, definedTags);
184 UIDesignInterceptingManager manager = UIDesignInterceptingManager.getDefaultManager();
185 manager.invoke(resource);
187 ObjectModel model = resource.getModel();
188 model.attr("windowName", name);
190 for (ObjectModel menuModel: new Selector("menugroup").find(model)){
194 ObjectModel frameModel = new Selector("frame").find(model).get(0);
195 frameModel.realize();
199 openedWindows.put(name, model);
201 lifeCycle.afterOpened(name);
203 log.warn("指定された名前のウィンドウは登録されていません name:"+name);
210 * @param name 閉じるウィンドウの名前
212 public void close(String name) {
213 if( openedWindows.containsKey(name) ) {
214 lifeCycle.beforeClosed(name);
216 ObjectModel model = openedWindows.get(name);
217 openedWindows.remove(name);
219 ObjectModel frameModel = new Selector("frame").find(model).get(0);
222 lifeCycle.afterClosed(name);
223 if( openedWindows.size() == 0 ) {
224 lifeCycle.shutdown();
227 log.info("指定されたウィンドウは登録されていないか既に閉じられています。 name:"+name);
231 private Map<String,Tag> mergeTags(Map<String,Tag> arg0, Map<String,Tag> arg1) {
232 for(String tagname1 : arg1.keySet()) {
233 if( arg0.containsKey(tagname1) ) {
234 Tag tag0 = arg0.get(tagname1);
235 Tag tag1 = arg1.get(tagname1);
239 arg0.put(tagname1, arg1.get(tagname1));
240 log.info(tagname1+":"+arg1.get(tagname1));
248 * アプリケーションインスタンスからウィンドウ登録名にてウィンドウオブジェクトモデルを取得する
252 public ObjectModel getWindow(String name){
253 return this.openedWindows.get(name);
257 * 指定されたウィンドウにあるIDのコンポーネントを検索する
259 * @param window ウィンドウ登録名
260 * @param id コンポーネントID
261 * @return コンポーネントオブジェクト
263 public static ObjectModel findById(String window, String id){
264 return Selector.find("#" + id, Application.getInstance().getWindow(window)).get(0);
268 * 指定されたウィンドウのコンポーネントをセレクタ構文を用いて検索する
270 * @param window ウィンドウ登録名
271 * @param selector コンポーネント検索用セレクタ
272 * @return コンポーネントオブジェクト
274 public static List<ObjectModel> findBySelector(String window, String selector) {
275 return Selector.find(selector, Application.getInstance().getWindow(window));