1 package jp.ac.aiit.xdf.application.interceptors;
3 import java.io.BufferedReader;
5 import java.io.FileReader;
6 import java.io.IOException;
7 import java.net.URISyntaxException;
8 import java.util.HashMap;
11 import java.util.regex.Matcher;
12 import java.util.regex.Pattern;
14 import jp.ac.aiit.xdf.core.model.ObjectModel;
15 import jp.ac.aiit.xdf.core.selector.Selector;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
21 * 画面定義XMLに記述されたスタイルシートを読み込み、それに指定された情報に従い各コンポーネントに対する属性の設定を行う
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(".*?\\{.*?\\}");
31 public void intercept(UIDesignResource resource) {
32 ObjectModel modelRoot = resource.getModel();
33 List<ObjectModel> styleModels = Selector.find("style", modelRoot);
35 for(ObjectModel styleModel : styleModels) {
36 String src = (String) styleModel.attr("src");
38 String style = extractStyleContents( new File( ClassLoader.getSystemResource(src).toURI() ) );
40 //スタイルシート内容全体上で上記スタイル記述単位を探索する。
41 Matcher m = STYLEUNIT_FINDER.matcher(style);
43 applyStyle(m.group(), modelRoot);
45 } catch(URISyntaxException e) {
46 log.warn("指定されたスタイルファイルの読み込みに失敗しました。file:"+src, e);
51 private String extractStyleContents(File file) {
52 BufferedReader reader = null;
53 StringBuilder builder = new StringBuilder();
55 reader = new BufferedReader(new FileReader(file));
56 for(String line; (line = reader.readLine()) != null; ){
58 if(!(line = line.replaceFirst("//.*", "").trim()).isEmpty()){
62 } catch(IOException ioe){
65 try{ reader.close(); } catch(Exception e){}
67 //(コメント( /* ・・ */ )を除いた)スタイルシート内容全体を返す
68 return builder.toString().replaceAll("/\\*.*?\\*/", "");
71 private static void applyStyle(String styleUnit, ObjectModel applyRoot){
72 String selector = styleUnit.replaceFirst("\\{.*", "").trim(); //「{」より左をセレクタ部として取出す
75 String[] defAttrs = styleUnit.replaceFirst("^.*?\\{", "").replaceFirst("\\}.*", "").split(";");
77 Map<String, String> attributes = new HashMap<String, String>();
78 for(String defAttr : defAttrs){
79 if( !( defAttr = defAttr.trim() ).isEmpty()){
81 String[] attr = defAttr.split("[:=]");
82 attributes.put(attr[0], attr.length > 1 ? attr[1].replaceAll("\"", "").trim() : "");
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());