From f7d2b4294153218423051066990738aafe407713 Mon Sep 17 00:00:00 2001 From: Olyutorskii Date: Thu, 12 Mar 2020 22:37:39 +0900 Subject: [PATCH] implement XML element decoder. --- src/main/java/jp/sfjp/jindolf/Controller.java | 21 ++++--- .../java/jp/sfjp/jindolf/data/xml/ElemTag.java | 65 ++++++++++++++++++++++ .../jp/sfjp/jindolf/data/xml/VillageHandler.java | 45 ++++++++++----- 3 files changed, 107 insertions(+), 24 deletions(-) create mode 100644 src/main/java/jp/sfjp/jindolf/data/xml/ElemTag.java diff --git a/src/main/java/jp/sfjp/jindolf/Controller.java b/src/main/java/jp/sfjp/jindolf/Controller.java index a4e1703..db179b0 100644 --- a/src/main/java/jp/sfjp/jindolf/Controller.java +++ b/src/main/java/jp/sfjp/jindolf/Controller.java @@ -1216,15 +1216,18 @@ public class Controller if(result != JFileChooser.APPROVE_OPTION) return; File selected = chooser.getSelectedFile(); - Village village; - try{ - village = VillageLoader.parseVillage(selected); - }catch(IOException e){ - System.out.println(e); - return; - } - - selectedVillage(village); + submitHeavyBusyTask(() -> { + Village village; + try{ + village = VillageLoader.parseVillage(selected); + }catch(IOException e){ + System.out.println(e); + return; + } + EventQueue.invokeLater(() -> { + selectedVillage(village); + }); + }, "XML読み込み中", "XML読み込み完了"); return; } diff --git a/src/main/java/jp/sfjp/jindolf/data/xml/ElemTag.java b/src/main/java/jp/sfjp/jindolf/data/xml/ElemTag.java new file mode 100644 index 0000000..c5693e6 --- /dev/null +++ b/src/main/java/jp/sfjp/jindolf/data/xml/ElemTag.java @@ -0,0 +1,65 @@ +/* + * village XML file element tags + * + * License : The MIT License + * Copyright(c) 2020 olyutorskii + */ + +package jp.sfjp.jindolf.data.xml; + +import java.util.HashMap; +import java.util.Map; + +/** + * XMLファイルのタグ要素名デコーダ。 + */ +public enum ElemTag { + + VILLAGE("village"), + AVATAR("avatar"), + PERIOD("period"), + TALK("talk"), + LI("li"), + ; + + + private final String name; + + + /** + * constructor. + * + * @param name element name + */ + ElemTag(String name){ + this.name = name; + return; + } + + + /** + * get ElemTag map with name-space Prefixed key. + * + * @param pfx prefix + * @return ElemTag + */ + public static Map getQNameMap(String pfx){ + Map result = new HashMap<>(); + + String lead; + if(pfx.isEmpty()){ + lead = ""; + }else{ + lead = pfx + ":"; + } + + for(ElemTag tag : values()){ + String key = lead + tag.name; + key = key.intern(); + result.put(key, tag); + } + + return result; + } + +} diff --git a/src/main/java/jp/sfjp/jindolf/data/xml/VillageHandler.java b/src/main/java/jp/sfjp/jindolf/data/xml/VillageHandler.java index dee37e7..d8bafc7 100644 --- a/src/main/java/jp/sfjp/jindolf/data/xml/VillageHandler.java +++ b/src/main/java/jp/sfjp/jindolf/data/xml/VillageHandler.java @@ -51,6 +51,7 @@ public class VillageHandler implements ContentHandler{ private final StringBuilder content = new StringBuilder(250); private final Map idAvatarMap = new HashMap<>(); + private Map qNameMap = ElemTag.getQNameMap(""); /** @@ -164,6 +165,20 @@ public class VillageHandler implements ContentHandler{ return result; } + /** + * decode ElemTag. + * + * @param uri URI of namespace + * @param localName local name + * @param qName Qname + * @return + */ + private ElemTag decodeElemTag(String uri, + String localName, + String qName){ + ElemTag result = this.qNameMap.get(qName); + return result; + } /** * パースした結果のVillageを返す。 @@ -382,6 +397,7 @@ public class VillageHandler implements ContentHandler{ throws SAXException { if(NS_JINARCHIVE.equals(uri)){ this.nsPfx = prefix; + this.qNameMap = ElemTag.getQNameMap(this.nsPfx); } return; } @@ -413,24 +429,23 @@ public class VillageHandler implements ContentHandler{ String qName, Attributes atts) throws SAXException { - if( ! NS_JINARCHIVE.equals(uri)){ - return; - } + ElemTag tag = decodeElemTag(uri, localName, qName); + if(tag == null) return; - switch(localName){ - case "village": + switch(tag){ + case VILLAGE: startVillage(atts); break; - case "avatar": + case AVATAR: startAvatar(atts); break; - case "period": + case PERIOD: startPeriod(atts); break; - case "talk": + case TALK: startTalk(atts); break; - case "li": + case LI: startLi(atts); break; default: @@ -451,14 +466,14 @@ public class VillageHandler implements ContentHandler{ @Override public void endElement(String uri, String localName, String qName) throws SAXException { - if( ! NS_JINARCHIVE.equals(uri)){ - return; - } - switch(localName){ - case "talk": + ElemTag tag = decodeElemTag(uri, localName, qName); + if(tag == null) return; + + switch(tag){ + case TALK: endTalk(); break; - case "li": + case LI: endLi(); break; default: -- 2.11.0