OSDN Git Service

initial commit
[xdf/git-repos.git] / xdf / src / main / java / jp / ac / aiit / xdf / core / selector / RuleSequence.java
1 package jp.ac.aiit.xdf.core.selector;
2
3 import java.util.ArrayList;
4 import java.util.HashSet;
5 import java.util.List;
6 import java.util.Set;
7
8 import jp.ac.aiit.xdf.core.model.ObjectModel;
9
10 /**
11  * @author Shunichi Takagi
12  * セレクターのルールシーケンス(ユーザガイドへ参照)
13  */
14 public class RuleSequence {
15         private List<Rule> rules;
16         
17         /**
18          * コンストラクター
19          * @param ruleSequence
20          */
21         public RuleSequence(String ruleSequence) {
22                 this( extractRules(ruleSequence) );
23         }
24         
25         /**
26          * コンストラクター
27          * @param rules
28          */
29         public RuleSequence(List<Rule> rules) {
30                 this.rules = rules;
31         }
32         
33         private static List<Rule> extractRules(String ruleSequence) {
34                 List<Rule> rules = new ArrayList<Rule>();
35                 String[] ruleStrings = ruleSequence.split(" ");
36                 
37                 for(String ruleString : ruleStrings) {
38                         rules.add( new Rule(ruleString.trim()) );
39                 }
40                 
41                 return rules;
42         }
43         
44         /**
45          * オブジェクトモデルをマッチングする
46          * @param findRoot
47          * @return オブジェクトモデルセット
48          */
49         public Set<ObjectModel> find(ObjectModel findRoot) {
50                 Set<ObjectModel> findRoots = new HashSet<ObjectModel>();
51                 findRoots.add(findRoot);
52                 
53                 return findImpl(findRoots, 0);
54         }
55         
56         private Set<ObjectModel> findImpl(Set<ObjectModel> findRoots, int ruleIndex) {
57                 try {
58                         Rule rule = rules.get(ruleIndex);
59                         
60                         Set<ObjectModel> result = new HashSet<ObjectModel>();
61                         for(ObjectModel findRoot : findRoots) {
62                                 result.addAll( findImpl( rule.find(findRoot), ruleIndex+1 ) );
63                         }
64                         
65                         return result;
66                 } catch(IndexOutOfBoundsException e) {
67                         return findRoots;
68                 }
69         }
70 }