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 }