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    }