OSDN Git Service

フィールド名変更
[coroid/inqubus.git] / frontend / src / saccubus / conv / NicoXMLReader.java
1 package saccubus.conv;
2
3 import java.util.regex.Pattern;
4
5 import org.xml.sax.helpers.DefaultHandler;
6 import org.xml.sax.Attributes;
7
8 /**
9  * <p>
10  * タイトル: さきゅばす
11  * </p>
12  *
13  * <p>
14  * 説明: ニコニコ動画の動画をコメントつきで保存
15  * </p>
16  *
17  * <p>
18  * 著作権: Copyright (c) 2007 PSI
19  * </p>
20  *
21  * <p>
22  * 会社名:
23  * </p>
24  *
25  * @author 未入力
26  * @version 1.0
27  */
28 public class NicoXMLReader extends DefaultHandler {
29
30     private final Packet packet;
31     private final Pattern ngWord;
32     private final Pattern ngId;
33     private Chat item;
34     private boolean itemKicked;
35
36     public NicoXMLReader(Packet packet, String ng_id, String ng_word) {
37         this.packet = packet;
38         this.ngWord = makePattern(ng_word);
39         this.ngId = makePattern(ng_id);
40     }
41
42     private static Pattern makePattern(String word) {
43         if (word == null || word.length() <= 0) {
44             return null;
45         }
46         final String tmp[] = word.split(" ");
47         String tmp2[] = new String[tmp.length];
48         int tmp_index = 0;
49         int index;
50         for (index = 0; index < tmp.length && tmp_index < tmp.length; index++) {
51             if (tmp[tmp_index].startsWith("/")) {
52                 final StringBuilder str = new StringBuilder(tmp[tmp_index]);
53                 for (tmp_index++; tmp_index < tmp.length; tmp_index++) {
54                     str.append(" ").append(tmp[tmp_index]);
55                     if (tmp[tmp_index].endsWith("/")) {
56                         tmp_index++;
57                         break;
58                     }
59                 }
60                 tmp2[index] = str.toString();
61             } else if (tmp[tmp_index].startsWith("\"")) {
62                 final StringBuilder str = new StringBuilder(tmp[tmp_index]);
63                 for (tmp_index++; tmp_index < tmp.length; tmp_index++) {
64                     str.append(" ").append(tmp[tmp_index]);
65                     if (tmp[tmp_index].endsWith("\"")) {
66                         tmp_index++;
67                         break;
68                     }
69                 }
70                 tmp2[index] = str.toString();
71             } else {
72                 tmp2[index] = tmp[tmp_index];
73                 tmp_index++;
74             }
75         }
76         final String elt[] = new String[index];
77         System.arraycopy(tmp2, 0, elt, 0, index);
78         final StringBuilder reg = new StringBuilder();
79         for (int i = 0; i < elt.length; i++) {
80             final String e = elt[i];
81             System.out.println(e);
82             if (i > 0) {
83                 reg.append("|");
84             }
85             if (e.indexOf('/') == 0 && e.lastIndexOf('/') == e.length() - 1) {
86                 reg.append("(").append(e.substring(1, e.length() - 1)).append(")");
87             } else if (e.indexOf('\"') == 0
88                     && e.lastIndexOf('\"') == e.length() - 1) {
89                 reg.append("(").append(Pattern.quote(e.substring(1, e.length() - 1))).append(")");
90             } else {
91                 reg.append("(.*(").append(Pattern.quote(e)).append(")+.*)");
92             }
93         }
94         System.out.println("reg:" + reg);
95         return Pattern.compile(reg.toString());
96     }
97
98     private static boolean match(Pattern pat, String word) {
99         if (word == null || word.length() <= 0 || pat == null) {
100             return false;
101         }
102         return pat.matcher(word).matches();
103     }
104
105     /**
106      *
107      */
108     @Override
109     public void startDocument() {
110         System.out.println("Start converting to interval file.");
111     }
112
113     /**
114      *
115      * @param uri
116      *            String
117      * @param localName
118      *            String
119      * @param qName
120      *            String
121      * @param attributes
122      *            Attributes
123      */
124     @Override
125     public void startElement(final String uri, final String localName, final String qName,
126             final Attributes attributes) {
127         if (qName.equalsIgnoreCase("chat")) {
128             // System.out.println("----------");
129             item = new Chat();
130             itemKicked = false;
131             //マイメモリ削除対象
132             final String deleted = attributes.getValue("deleted");
133             if (deleted != null && deleted.equalsIgnoreCase("1")) {
134                 itemKicked = true;
135                 return;
136             }
137             item.setDate(attributes.getValue("date"));
138             final String mail = attributes.getValue("mail");
139             if (match(ngWord, mail)) {
140                 itemKicked = true;
141                 return;
142             }
143             item.setMail(mail);
144             item.setNo(attributes.getValue("no"));
145             final String user_id = attributes.getValue("user_id");
146             if (match(ngId, user_id)) {
147                 itemKicked = true;
148                 return;
149             }
150             item.setUserID(user_id);
151             item.setVpos(attributes.getValue("vpos"));
152
153         }
154     }
155
156     /**
157      *
158      * @param ch
159      *            char[]
160      * @param offset
161      *            int
162      * @param length
163      *            int
164      */
165     @Override
166     public void characters(final char[] ch, final int offset, final int length) {
167         final char input[] = (new String(ch, offset, length)).toCharArray();
168         for (int i = 0; i < input.length; i++) {
169             if (!Character.isDefined(input[i])) {
170                 input[i] = '?';
171             }
172         }
173         if (item != null) {
174             final String com = new String(input);
175             if (match(ngWord, com)) {
176                 itemKicked = true;
177                 return;
178             }
179             item.setComment(com);
180         }
181     }
182
183     /**
184      *
185      * @param uri
186      *            String
187      * @param localName
188      *            String
189      * @param qName
190      *            String
191      */
192     @Override
193     public void endElement(final String uri, final String localName, final String qName) {
194         if (qName.equalsIgnoreCase("chat")) {
195             if (!itemKicked) {
196                 packet.addChat(item);
197             }
198             item = null;
199         }
200     }
201
202     /**
203      * ドキュメント終了
204      */
205     @Override
206     public void endDocument() {
207         // System.out.println("----------");
208         System.out.println("Converting finished.");
209     }
210 }