001 package org.util.xml;
002
003 import java.awt.event.KeyEvent;
004 import java.net.SocketAddress;
005 import javax.swing.event.DocumentEvent;
006 import org.util.xml.parse.ElementParser;
007 import java.awt.BorderLayout;
008 import java.awt.Color;
009 import java.awt.Desktop;
010 import java.awt.GridLayout;
011 import java.awt.event.ActionEvent;
012 import java.awt.event.ActionListener;
013 import java.awt.event.KeyAdapter;
014 import java.io.BufferedReader;
015 import java.io.ByteArrayInputStream;
016 import java.io.InputStream;
017 import java.io.InputStreamReader;
018 import java.io.PrintWriter;
019 import java.io.Reader;
020 import java.io.StringReader;
021 import java.io.StringWriter;
022 import java.net.Proxy;
023 import java.net.URI;
024 import java.net.URL;
025 import java.net.URLConnection;
026 import javax.swing.AbstractAction;
027 import javax.swing.BorderFactory;
028 import javax.swing.BoxLayout;
029 import javax.swing.ButtonGroup;
030 import javax.swing.JButton;
031 import javax.swing.JFrame;
032 import javax.swing.JLabel;
033 import javax.swing.JOptionPane;
034 import javax.swing.JPanel;
035 import javax.swing.JRadioButton;
036 import javax.swing.JScrollPane;
037 import javax.swing.JTextArea;
038 import javax.swing.JTextField;
039 import javax.swing.event.DocumentListener;
040 import org.util.xml.element.Element;
041 import org.util.xml.element.TagElement;
042 import org.util.xml.parse.policy.HTMLParserPolicy;
043 import org.util.xml.parse.policy.ParserPolicy;
044 import org.util.xml.parse.policy.XMLParserPolicy;
045
046 /**
047 *
048 * @author masaru
049 */
050 public class Main3 {
051
052 JTextArea textarea1 = new JTextArea();
053 JTextArea textarea2 = new JTextArea();
054 //JTextArea textarea3 = new JTextArea();
055 JPanel buttonpane = new JPanel();
056 ParserPolicy policy_ = null;
057 JTextField tabtext_;
058 JTextField filtertext_;
059 JTextField urltext_;
060 Proxy proxy_;
061 DocumentListener dl_;
062
063 public static void main(String[] args) throws Exception {
064 new Main3();
065 }
066
067 public Main3() {
068 dl_ = new DocumentListener() {
069
070 public void insertUpdate(DocumentEvent e) {
071 changedUpdate(e);
072 }
073
074 public void removeUpdate(DocumentEvent e) {
075 changedUpdate(e);
076 }
077
078 public void changedUpdate(final DocumentEvent e) {
079 try{
080 int length = e.getDocument().getLength();
081 String text = e.getDocument().getText(0, length);
082 startParse(text);
083 }catch(Exception exc) {
084 exc.printStackTrace();
085 }
086 }
087 };
088 textarea1.getDocument().addDocumentListener(dl_);
089
090 final JRadioButton htmlmode = new JRadioButton(new AbstractAction("html mode"){
091
092 public void actionPerformed(ActionEvent arg0) {
093 policy_ = new HTMLParserPolicy() {
094 @Override
095 public Element allowElement(Element element) {
096 super.allowElement(element);
097 if(element.isTextElement()) return element;
098 TagElement tag = (TagElement)element;
099 if(tag.getKey().toLowerCase().matches(filtertext_.getText()))
100 return element;
101 else
102 return null;
103 }
104 @Override
105 public boolean throwExceptionIfDocumentHasError() {
106 return false;
107 }
108 };
109 startParse(textarea1.getText());
110 }
111
112 });
113 final JRadioButton xmlmode = new JRadioButton(new AbstractAction("xml mode"){
114
115 public void actionPerformed(ActionEvent arg0) {
116 policy_ = new XMLParserPolicy() {
117 @Override
118 public Element allowElement(Element element) {
119 super.allowElement(element);
120 if(element.isTextElement()) return element;
121 TagElement tag = (TagElement)element;
122 if(tag.getKey().toLowerCase().matches(filtertext_.getText()))
123 return element;
124 else
125 return null;
126 }
127 @Override
128 public boolean throwExceptionIfDocumentHasError() {
129 return true;
130 }
131
132 };
133 startParse(textarea1.getText());
134 }
135
136 });
137
138 ButtonGroup group = new ButtonGroup();
139 group.add(htmlmode);
140 group.add(xmlmode);
141 KeyAdapter watch_key = new KeyAdapter(){
142 @Override
143 public void keyTyped(KeyEvent ke) {
144 startParse(textarea1.getText());
145 }
146 };
147 buttonpane.add(htmlmode);
148 buttonpane.add(xmlmode);
149 tabtext_=new JTextField(" ", 10);
150 tabtext_.addKeyListener(watch_key);
151 filtertext_ = new JTextField(".*", 10);
152 filtertext_.addKeyListener(watch_key);
153 buttonpane.add(tabtext_);
154 buttonpane.add(filtertext_);
155 urltext_ = new JTextField();
156 urltext_.addActionListener(new ActionListener(){
157 public void actionPerformed(ActionEvent e) {
158 String url = ((JTextField)e.getSource()).getText();
159 openURL(url);
160 }
161 });
162
163 buttonpane.add(new JButton(new AbstractAction("set proxy") {
164
165 public void actionPerformed(ActionEvent arg0) {
166 String host = JOptionPane.showInputDialog("http://[hostname]:[port]\n1. input proxy hostname");
167 String port = JOptionPane.showInputDialog("http://[hostname]:[port]\n2. input proxy port");
168 proxy_ = new Proxy(Proxy.Type.HTTP, InetSocketAddress(host, Integer.parseInt(port)));
169 }
170
171 private SocketAddress InetSocketAddress(String host, int parseInt) {
172 throw new UnsupportedOperationException("Not yet implemented");
173 }
174 }));
175
176 JPanel panel = new JPanel(new GridLayout(1,3));
177 panel.add(new JScrollPane(textarea1));
178 panel.add(new JScrollPane(textarea2));
179 //panel.add(new JScrollPane(textarea3));
180 /*
181 JTextField textfield = new JTextField("http://www.google.com/");
182 textfield.addActionListener(new ActionListener(){
183 public void actionPerformed(final ActionEvent e) {
184 new Thread(new Runnable(){public void run(){
185 openURL(((JTextField)e.getSource()).getText());
186 }}).start();
187 }
188 });
189 */
190
191 JPanel contentpane = new JPanel(new BorderLayout());
192 contentpane.add(urltext_, BorderLayout.NORTH);
193 contentpane.add(panel,BorderLayout.CENTER);
194 contentpane.add(buttonpane,BorderLayout.SOUTH);
195 contentpane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
196
197 JFrame frame = new JFrame();
198 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
199 frame.setContentPane(contentpane);
200 frame.setSize(200,200);
201 frame.setLocation(100,100);
202 frame.setVisible(true);
203
204 xmlmode.doClick();
205 }
206
207 public void startParse(final String text) {
208 new Thread(new Runnable(){public void run(){
209 ElementParser parser = null;
210 try{
211 // System.out.println(textarea1.getText());
212
213 // InputStream is = new ByteArrayInputStream(text.getBytes(encoding));
214 // ElementParser parser = new ElementParser(is);
215 Reader reader = new StringReader(text);
216 parser = new ElementParser(reader);
217 parser.setPolicy(policy_);
218 parser.parse();
219 Element[] elements = parser.getResult();
220 StringBuffer sb = new StringBuffer();
221 for(int i=0;i<elements.length;i++) {
222 elements[i].setTabText(tabtext_.getText());
223 sb.append(elements[i].toString());
224 }
225 textarea2.setForeground(Color.black);
226 textarea2.setText(sb.toString());
227 textarea2.revalidate();
228 } catch(Exception exc) {
229 StringWriter sw = new StringWriter();
230 PrintWriter pw = new PrintWriter(sw);
231 exc.printStackTrace(pw);
232 textarea2.setForeground(Color.red);;
233 textarea2.setText(sw.toString());
234 textarea2.append("\n------------------------\n");
235 if(parser!=null) {
236 StringBuffer sb = new StringBuffer();
237 Element[] elements = parser.getResult();
238 if(elements != null)
239 for(int i=0;i<elements.length;i++) {
240 elements[i].setTabText(tabtext_.getText());
241 sb.append(elements[i].toString());
242 }
243 textarea2.append(sb.toString());
244 }
245 textarea2.revalidate();
246 }
247 }
248 }).start();
249 }
250 public void openURL(final String urltext) {
251 new Thread(new Runnable(){public void run(){
252 try{
253 URL url = new URL(urltext);
254 InputStream is = ( proxy_!=null ? url.openConnection(proxy_).getInputStream() : url.openStream() );
255 ElementParser parser = new ElementParser(is);
256 parser.setPolicy(new HTMLParserPolicy(){
257 @Override
258 public boolean throwExceptionIfDocumentHasError(){
259 return false;
260 }
261 });
262 parser.parse();
263 String encoding = parser.getEncoding();
264 if(encoding.equals("unknown"))
265 encoding = JOptionPane.showInputDialog("input encoding","utf-8");
266 is.close();
267 is = ( proxy_!=null ? url.openConnection(proxy_).getInputStream() : url.openStream() );
268 BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding));
269 textarea1.read(br, "text/plain");
270 textarea1.getDocument().addDocumentListener(dl_);
271 startParse(textarea1.getText());
272 } catch(Exception exc) {
273 JOptionPane.showMessageDialog(null, exc);
274 }
275 }
276 }).start();
277 }
278 }