1 package jp.ac.aiit.xdf.application.interceptors;
3 import java.io.IOException;
5 import java.util.Locale;
8 import javax.xml.parsers.DocumentBuilder;
9 import javax.xml.parsers.DocumentBuilderFactory;
10 import javax.xml.parsers.ParserConfigurationException;
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;
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;
27 * @author Shunichi Takagi
29 public class XMLParseInterceptor implements UIDesignInterceptor {
32 public void intercept(UIDesignResource resource) {
34 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
35 DocumentBuilder builder = factory.newDocumentBuilder();
37 Document doc = builder.parse(resource.getInputStream());
38 Element elem = doc.getDocumentElement();
40 resource.setModel( parseElement(elem, resource.getUsableTags()) );
42 } catch (ParserConfigurationException e) {
44 } catch (SAXException e) {
46 } catch (IOException e) {
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();
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);
59 NamedNodeMap map = elem.getAttributes();
60 for(int i=0; i<map.getLength(); i++) {
61 Node node = map.item(i);
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());
69 model.attr(node.getNodeName(), mapper.typeConvert(node.getNodeName(), node.getNodeValue()));
73 NodeList children = elem.getChildNodes();
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) );
82 //TODO 【暫定】タグの中身に子要素が全くない場合、中身をvalueとみなす。
84 model.attr("value", elem.getTextContent());
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();