1 package jp.ac.aiit.xdf.core.selector;
3 import java.util.Arrays;
4 import java.util.HashSet;
7 import java.util.regex.Matcher;
8 import java.util.regex.Pattern;
10 import jp.ac.aiit.xdf.core.model.ObjectModel;
13 * セレクタ内ののルール記述の実装(ユーザガイドへ参照)
15 * @author Shunichi Takagi
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("\\.([^.#]+)");
22 private String tagName = null;
23 private String id = null;
24 private List<String> classes = null;
30 public Rule(String rule) {
31 this(extract(rule, TAGNAME_EXTRACTOR), extract(rule, ID_EXTRACTOR), extractClasses(rule));
37 * @param id 画面定義XMLのid定義
38 * @param classes 画面定義XMLのclass定義
40 public Rule(String tagName, String id, List<String> classes) {
41 this.tagName = tagName;
43 this.classes = classes;
46 private static String extract(String text, Pattern pattern) {
47 Matcher m = pattern.matcher(text);
55 //TODO 指定されたクラス名の抽出がうまくいかない
56 private static List<String> extractClasses(String text) {
57 Matcher m = CLASS_EXTRACTOR.matcher(text);
60 String classSentence = m.group(1);
61 String[] classes = classSentence.split(".");
63 return Arrays.asList(classes);
72 * @return オブジェクトモデルセット
74 public Set<ObjectModel> find(ObjectModel findRoot) {
75 return findImpl(findRoot, new HashSet<ObjectModel>());
78 private Set<ObjectModel> findImpl(ObjectModel findRoot, Set<ObjectModel> result) {
79 if( match(findRoot) ) {
83 for(ObjectModel child : findRoot.children()) {
84 findImpl(child, result);
91 * ルールによるオブジェクトモデルをマッチングする
92 * @param model オブジェクトモデル
95 public boolean match(ObjectModel model) {
96 return matchTagName(model) && matchID(model) && matchClasses(model);
99 private boolean matchTagName(ObjectModel model) {
100 return ( tagName == null ? true : tagName.equals(model.tagname()) );
103 private boolean matchID(ObjectModel model) {
104 return ( id == null ? true : id.equals(model.id()) );
107 private boolean matchClasses(ObjectModel model) {
108 if( classes == null ) {
111 for(String clazz : classes) {
112 if( !model.hasClass(clazz) ) {