OSDN Git Service

initial commit
[xdf/git-repos.git] / xdf / src / main / java / jp / ac / aiit / xdf / application / interceptors / XMLParseInterceptor.java
1 package jp.ac.aiit.xdf.application.interceptors;
2
3 import java.io.IOException;
4 import java.util.List;
5 import java.util.Locale;
6 import java.util.Map;
7
8 import javax.xml.parsers.DocumentBuilder;
9 import javax.xml.parsers.DocumentBuilderFactory;
10 import javax.xml.parsers.ParserConfigurationException;
11
12 import jp.ac.aiit.xdf.application.Application;
13 import jp.ac.aiit.xdf.component.ComponentMapper;
14 import jp.ac.aiit.xdf.core.model.ObjectModel;
15 import jp.ac.aiit.xdf.core.tags.Tagdef.Tag;
16 import jp.ac.aiit.xdf.utils.Reflections;
17
18 import org.w3c.dom.Document;
19 import org.w3c.dom.Element;
20 import org.w3c.dom.NamedNodeMap;
21 import org.w3c.dom.Node;
22 import org.w3c.dom.NodeList;
23 import org.xml.sax.SAXException;
24
25 /**
26  * 画面定義XMLインターセプター
27  * @author Shunichi Takagi
28  */
29 public class XMLParseInterceptor implements UIDesignInterceptor {
30
31         @Override
32         public void intercept(UIDesignResource resource) {
33                 try {
34                         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
35                         DocumentBuilder builder = factory.newDocumentBuilder();
36                         
37                         Document doc = builder.parse(resource.getInputStream());
38                         Element elem = doc.getDocumentElement();
39                         
40                         resource.setModel( parseElement(elem, resource.getUsableTags()) );
41                         
42                 } catch (ParserConfigurationException e) {
43                         e.printStackTrace();
44                 } catch (SAXException e) {
45                         e.printStackTrace();
46                 } catch (IOException e) {
47                         e.printStackTrace();
48                 }
49         }
50         
51         private ObjectModel parseElement(Element elem, Map<String,Tag> definedTags) {
52                         Tag tag = definedTags.get(elem.getTagName().toLowerCase(Locale.ENGLISH));
53                         String className = tag.getModelclass();
54                         
55                         ObjectModel model = (ObjectModel) Reflections.getInstance(className, tag.getName());
56                         ComponentMapper mapper = (ComponentMapper) Reflections.getInstance(getMapperClass(tag.getComponentMapper(), Application.getInstance().getToolkit()));
57                         model.setComponentMapper(mapper);
58                         
59                         NamedNodeMap map = elem.getAttributes();
60                         for(int i=0; i<map.getLength(); i++) {
61                                 Node node = map.item(i);
62                                 
63                                 //TODO node.getNodeType()の値に応じて処理を分岐しなければならない <label>あいうえお</label>の処理なども必要
64                                 if( node.getNodeName().toLowerCase() == "id" ) {
65                                         model.id(node.getNodeValue());
66                                 } else if( node.getNodeName().toLowerCase() == "class" ) {
67                                         model.addClass(node.getNodeValue());
68                                 } else {
69                                         model.attr(node.getNodeName(), mapper.typeConvert(node.getNodeName(), node.getNodeValue()));
70                                 }
71                         }
72
73                         NodeList children = elem.getChildNodes();
74                         int numofElem = 0;
75                         for(int i=0; i<children.getLength(); i++) {
76                                 Node child = children.item(i);
77                                 if( child instanceof Element ) {
78                                         model.append( parseElement((Element) child, definedTags) );
79                                         numofElem++;
80                                 }
81                         }
82                         //TODO 【暫定】タグの中身に子要素が全くない場合、中身をvalueとみなす。
83                         if(numofElem < 1) {
84                                 model.attr("value", elem.getTextContent());
85                         }
86                         return model;
87                 }
88         
89                 private String getMapperClass(List<jp.ac.aiit.xdf.core.tags.Tagdef.Tag.ComponentMapper> mapperClasses, String toolkit) {
90                         for(jp.ac.aiit.xdf.core.tags.Tagdef.Tag.ComponentMapper mapper : mapperClasses) {
91                                 if( mapper.getEnv().equals(toolkit) || mapper.getEnv().equals("common") ) {
92                                         return mapper.getClazz();
93                                 }
94                         }
95                         return null;
96                 }
97 }