OSDN Git Service

srcディレクトリとdocディレクトリを作成
[xdf/git-repos.git] / src / xdf / src / main / java / jp / ac / aiit / xdf / core / selector / Rule.java
1 package jp.ac.aiit.xdf.core.selector;
2
3 import java.util.Arrays;
4 import java.util.HashSet;
5 import java.util.List;
6 import java.util.Set;
7 import java.util.regex.Matcher;
8 import java.util.regex.Pattern;
9
10 import jp.ac.aiit.xdf.core.model.ObjectModel;
11
12 /**
13  * セレクタ内ののルール記述の実装(ユーザガイドへ参照)
14  * 
15  * @author Shunichi Takagi
16  */
17 public class Rule {
18         private static final Pattern TAGNAME_EXTRACTOR = Pattern.compile("^([^.#]+).*");
19         private static final Pattern ID_EXTRACTOR = Pattern.compile(".*#([^.]+).*");
20         private static final Pattern CLASS_EXTRACTOR = Pattern.compile("\\.([^.#]+)");
21         
22         private String tagName = null;
23         private String id = null;
24         private List<String> classes = null;
25         
26         /**
27          * コンストラクター
28          * @param rule
29          */
30         public Rule(String rule) {
31                 this(extract(rule, TAGNAME_EXTRACTOR), extract(rule, ID_EXTRACTOR), extractClasses(rule));
32         }
33         
34         /**
35          * コンストラクター
36          * @param tagName タグ名
37          * @param id 画面定義XMLのid定義
38          * @param classes 画面定義XMLのclass定義
39          */
40         public Rule(String tagName, String id, List<String> classes) {
41                 this.tagName = tagName;
42                 this.id = id;
43                 this.classes = classes;
44         }
45         
46         private static String extract(String text, Pattern pattern) {
47                 Matcher m = pattern.matcher(text);
48                 if( m.matches() ) {
49                         return m.group(1);
50                 } else {
51                         return null;
52                 }
53         }
54         
55         //TODO 指定されたクラス名の抽出がうまくいかない
56         private static List<String> extractClasses(String text) {
57                 Matcher m = CLASS_EXTRACTOR.matcher(text);
58                 
59                 if( m.matches() ) {
60                         String classSentence = m.group(1);
61                         String[] classes = classSentence.split(".");
62                         
63                         return Arrays.asList(classes);
64                 } else {
65                         return null;
66                 }
67         }
68         
69         /**
70          * ルートオブジェクトモデルを取得する
71          * @param findRoot
72          * @return オブジェクトモデルセット
73          */
74         public Set<ObjectModel> find(ObjectModel findRoot) {
75                 return findImpl(findRoot, new HashSet<ObjectModel>());
76         }
77         
78         private Set<ObjectModel> findImpl(ObjectModel findRoot, Set<ObjectModel> result) {
79                 if( match(findRoot) ) {
80                         result.add(findRoot);
81                 }
82                 
83                 for(ObjectModel child : findRoot.children()) {
84                         findImpl(child, result);
85                 }
86                 
87                 return result;
88         }
89         
90         /**
91          * ルールによるオブジェクトモデルをマッチングする
92          * @param model オブジェクトモデル
93          * @return マッチング結果
94          */
95         public boolean match(ObjectModel model) {
96                 return matchTagName(model) && matchID(model) && matchClasses(model);
97         }
98
99         private boolean matchTagName(ObjectModel model) {
100                 return ( tagName == null ? true : tagName.equals(model.tagname()) );
101         }
102
103         private boolean matchID(ObjectModel model) {
104                 return ( id == null ? true : id.equals(model.id()) );
105         }
106         
107         private boolean matchClasses(ObjectModel model) {
108                 if( classes == null ) {
109                         return true;
110                 } else {
111                         for(String clazz : classes) {
112                                 if( !model.hasClass(clazz) ) {
113                                         return false;
114                                 }
115                         }
116                         return true;
117                 }
118         }
119 }