OSDN Git Service

srcディレクトリとdocディレクトリを作成
[xdf/git-repos.git] / src / xdf / src / main / java / jp / ac / aiit / xdf / application / interceptors / StyleParseInterceptor.java
1 package jp.ac.aiit.xdf.application.interceptors;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileReader;
6 import java.io.IOException;
7 import java.net.URISyntaxException;
8 import java.util.HashMap;
9 import java.util.List;
10 import java.util.Map;
11 import java.util.regex.Matcher;
12 import java.util.regex.Pattern;
13
14 import jp.ac.aiit.xdf.core.model.ObjectModel;
15 import jp.ac.aiit.xdf.core.selector.Selector;
16
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
19
20 /**
21  * 画面定義XMLに記述されたスタイルシートを読み込み、それに指定された情報に従い各コンポーネントに対する属性の設定を行う
22  * 
23  * @author kodama
24  */
25 public class StyleParseInterceptor implements UIDesignInterceptor {
26         private static final Logger log = LoggerFactory.getLogger(StyleParseInterceptor.class);
27         //「・・{・・}」という記述単位を抽出する正規表現
28         private static final Pattern STYLEUNIT_FINDER = Pattern.compile(".*?\\{.*?\\}");
29         
30         @Override
31         public void intercept(UIDesignResource resource) {
32                 ObjectModel modelRoot = resource.getModel();
33                 List<ObjectModel> styleModels = Selector.find("style", modelRoot);
34                 
35                 for(ObjectModel styleModel : styleModels) {
36                         String src = (String) styleModel.attr("src");
37                         try {
38                                 String style = extractStyleContents( new File( ClassLoader.getSystemResource(src).toURI() ) );
39                                 
40                                 //スタイルシート内容全体上で上記スタイル記述単位を探索する。
41                                 Matcher m = STYLEUNIT_FINDER.matcher(style);
42                                 while(m.find()){
43                                         applyStyle(m.group(), modelRoot);
44                                 }
45                         } catch(URISyntaxException e) {
46                                 log.warn("指定されたスタイルファイルの読み込みに失敗しました。file:"+src, e);
47                         }
48                 }
49         }
50         
51         private String extractStyleContents(File file) {
52                 BufferedReader reader = null;
53                 StringBuilder builder = new StringBuilder();
54                 try{
55                         reader = new BufferedReader(new FileReader(file));
56                         for(String line; (line = reader.readLine()) != null; ){
57                                 //(コメント行や「//」以降を無視する)
58                                 if(!(line = line.replaceFirst("//.*", "").trim()).isEmpty()){
59                                         builder.append(line);
60                                 }
61                         }
62                 } catch(IOException ioe){
63                         return null;
64                 } finally{
65                         try{ reader.close(); } catch(Exception e){}
66                 }
67                 //(コメント( /* ・・ */ )を除いた)スタイルシート内容全体を返す
68                 return builder.toString().replaceAll("/\\*.*?\\*/", "");
69         }
70
71         private static void applyStyle(String styleUnit, ObjectModel applyRoot){
72                 String selector = styleUnit.replaceFirst("\\{.*", "").trim(); //「{」より左をセレクタ部として取出す
73                 
74                 //属性の記述単位で分割
75                 String[] defAttrs = styleUnit.replaceFirst("^.*?\\{", "").replaceFirst("\\}.*", "").split(";");
76
77                 Map<String, String> attributes = new HashMap<String, String>();
78                 for(String defAttr : defAttrs){
79                         if( !( defAttr = defAttr.trim() ).isEmpty()){
80                                 //属性の名前と値の区切りは:と=の2種類
81                                 String[] attr = defAttr.split("[:=]");
82                                 attributes.put(attr[0], attr.length > 1 ? attr[1].replaceAll("\"", "").trim() : "");
83                         }
84                 }
85
86                 List<ObjectModel> targets = Selector.find(selector, applyRoot);
87                 for(ObjectModel target : targets) {
88                         for(Map.Entry<String, String> entry : attributes.entrySet()) {
89                                 target.attrWeakly(entry.getKey(), entry.getValue());
90                         }
91                 }
92         }
93 }