001    /*
002     * To change this template, choose Tools | Templates
003     * and open the template in the editor.
004     */
005    
006    package org.util.xml;
007    
008    import org.util.xml.parse.ElementParser;
009    import java.awt.BorderLayout;
010    import java.awt.Desktop;
011    import java.awt.GridLayout;
012    import java.awt.event.ActionEvent;
013    import java.awt.event.ActionListener;
014    import java.io.BufferedReader;
015    import java.io.InputStream;
016    import java.io.InputStreamReader;
017    import java.net.URI;
018    import java.net.URL;
019    import javax.swing.AbstractAction;
020    import javax.swing.BorderFactory;
021    import javax.swing.BoxLayout;
022    import javax.swing.JButton;
023    import javax.swing.JFrame;
024    import javax.swing.JOptionPane;
025    import javax.swing.JPanel;
026    import javax.swing.JScrollPane;
027    import javax.swing.JTextArea;
028    import javax.swing.JTextField;
029    import org.util.xml.element.Element;
030    import org.util.xml.element.TagElement;
031    import org.util.xml.parse.policy.HTMLParserPolicy;
032    import org.util.xml.parse.policy.XMLParserPolicy;
033    
034    /**
035     *
036     * @author masaru
037     */
038    public class Main {
039        
040        JTextArea textarea1 = new JTextArea();
041        JTextArea textarea2 = new JTextArea();
042        //JTextArea textarea3 = new JTextArea();
043        JPanel buttonpane = new JPanel();
044        
045        
046        public static void main(String[] args) throws Exception {
047            new Main();
048        }
049    
050        public Main() {
051            
052            JPanel panel = new JPanel(new GridLayout(1,3));
053            panel.add(new JScrollPane(textarea1));
054            panel.add(new JScrollPane(textarea2));
055            //panel.add(new JScrollPane(textarea3));
056            panel.add(buttonpane);
057            
058            JTextField textfield = new JTextField("http://www.google.com/");
059            textfield.addActionListener(new ActionListener(){
060                public void actionPerformed(final ActionEvent e) {
061                    new Thread(new Runnable(){public void run(){
062                        openURL(((JTextField)e.getSource()).getText());
063                    }}).start();
064                }
065            });
066            
067            JPanel contentpane = new JPanel(new BorderLayout());
068            contentpane.add(textfield,BorderLayout.NORTH);
069            contentpane.add(panel,BorderLayout.CENTER);
070            contentpane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
071            
072            JFrame frame = new JFrame();
073            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
074            frame.setContentPane(contentpane);
075            frame.setSize(200,200);
076            frame.setLocation(100,100);
077            frame.setVisible(true);
078    
079        }
080        public void openURL(final String urltext) {
081            
082            try{
083                String encoding = "JISAutoDetect";
084                URL url = new URL(urltext);
085                textarea1.setText("");
086    
087                BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(), encoding));
088                String tmp;
089                while((tmp=br.readLine()) != null)
090                    textarea1.append(tmp+"\n");
091                br.close();
092    
093                final JPanel subbuttonpane = new JPanel();
094                subbuttonpane.setLayout(new BoxLayout(subbuttonpane, BoxLayout.Y_AXIS));
095    
096                
097                //textarea3.setText("");
098                buttonpane.removeAll();
099                buttonpane.setLayout(new BorderLayout());
100                JScrollPane sp = new JScrollPane(subbuttonpane);
101                sp.getVerticalScrollBar().setUnitIncrement(30);
102                buttonpane.add(sp, BorderLayout.CENTER);
103    
104                /// XMLParser parser = new XMLParser(new InputStreamReader(new FileInputStream(file)));
105                InputStream is2 = url.openStream();
106                ElementParser parser = new ElementParser(is2);
107                parser.setPolicy(new HTMLParserPolicy(){
108    /*
109                    public boolean allowTagKey(String tagkey) {
110                        
111                        // if(tagkey.equals("br")) return false;
112                        // return true;
113                        
114                        // return (tagkey==null || tagkey.equals("html") || tagkey.equals("body") || tagkey.equals("b") || tagkey.equals("center") || tagkey.equals("table") || tagkey.equals("td") || tagkey.equals("tr") || tagkey.equals("a"));
115                        return true;
116                    }
117                    
118                    public boolean allowAttributes(Attributes attributes) {
119                        return true;
120                    }
121    */
122                    @Override
123                    public Element allowElement(Element element) {
124                        super.allowElement(element);
125                        
126                        if(element.isTagElement()) {
127                            String text = ((TagElement)element).getKey();
128                            if(text.toLowerCase().equals("a")) {
129                                String surl = ((TagElement)element).getAttributeValue("href","");
130                                String comment = element.toString();
131                                if(!surl.startsWith("http:"))
132                                    surl = urltext + "/../"+surl;
133                                final String url = surl;
134                                if(url.startsWith("http:")) {
135                                    JButton button = new JButton(new AbstractAction(url){
136                                        public void actionPerformed(ActionEvent arg0) {
137                                            try{
138                                                Desktop.getDesktop().browse(new URI(url));
139                                            }catch(Exception e){
140                                                JOptionPane.showMessageDialog(null, "Error:"+e.getMessage()+"\n"+url);
141                                            }
142                                        }
143                                    });
144                                    button.setToolTipText("<html><body>"+comment+"</body></html>");
145                                    subbuttonpane.add(button);
146                                    subbuttonpane.doLayout();
147                                    buttonpane.doLayout();
148                                    buttonpane.setVisible(true);
149                                }
150                                    
151    //                                textarea3.append(url);
152                            }
153                        }
154                        
155                        return element;
156                    }
157                    
158                });
159    
160    //            parser.setPolicy(new XMLParserPolicy());
161                System.out.println("start parsing");
162    
163                parser.parse();
164                is2.close();
165    
166                Element[] element = parser.getResult();
167    
168                Element.setTabText("|");
169    
170                System.out.println("end parsing");
171                textarea2.setText("");
172                for(int i=0;i<element.length;i++)
173                    textarea2.append(element[i].toString());
174                System.out.println("finished");
175                
176            } catch(Exception exc) {
177                exc.printStackTrace();
178                JOptionPane.showMessageDialog(null, exc);
179            }
180        }
181    
182    }