root/www.mail/JavaPopWeb/src/jp/ac/nime/computer/websim/BrowserItem.java

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. BrowserItem
  2. onMousePressed
  3. actionPerformed
  4. setCookie
  5. postMailAction
  6. postPacketAction
  7. postEventAction
  8. run

package jp.ac.nime.computer.websim;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;
import javax.swing.*;

import jp.ac.nime.computer.*;

/**
 * WWWシミュレータ ブラウザーオブジェクトクラス
 * 
 * @version 1.00 2003/03/31
 * @author Toshikazu Matsumoto Avion Corp.
 */
public class BrowserItem extends MachineItem implements ActionListener,Runnable
{
        private WebSim  m_Applet                =null;  //メインアプレットクラス
        private JPopupMenu m_Pop                =null;  //ポップアップメニュー
        private JPopupMenu m_CashPop    =null;  //キャッシュ選択ポップアップメニュー
        private JMenuItem m_MenuURL             =null;  //URL入力メニュー
        private JMenuItem m_MenuReq             =null;  //HTTPリクエストメニュー
        private JMenuItem m_MenuDisp    =null;  //ページ表示メニュー
        private JMenuItem m_MenuCook    =null;  //Cookieメニュー
        private JMenuItem m_MenuCash    =null;  //キャッシュメニュー
        private JMenuItem m_MenuTCP             =null;  //TPC/IPメニュー
        private JMenuItem m_MenuSSL             =null;  //SSLメニュー
        private JMenuItem m_MenuFromCash=null;  //キャッシュから表示メニュー
        private JMenuItem m_MenuCancel  =null;  //キャンセルメニュー
        private Hashtable m_htCook              =null;  //Cookie格納ハッシュテーブル
        private Vector  m_vcCook                =null;  //Cookie列
        private Vector  m_vcCash                =null;  //キャッシュ列
        private String  m_sGetIP                ="";    //DNS問い合わせ結果IP
        private URL             m_URLReq                =null;  //入力URL
        private Thread  m_Thread                =null;  //スレッド
        
        /**
         * クラスコンストラクタ
         * @param parent メインアプレットクラス
         * @param sIP IPアドレス
         * @param imSrc 表示画像
         * @param nX 表示X座標
         * @param nY 表示Y座標
         */
        public BrowserItem(WebSim parent,String sIP,Image imSrc,int nX,int nY)
        {
                super(parent,"WWWブラウザ",sIP,imSrc,nX,nY);
                
                this.m_Applet=parent;
                this.m_MenuURL  =new JMenuItem("URL入力");
                this.m_MenuReq  =new JMenuItem("HTTPリクエスト");
                this.m_MenuDisp =new JMenuItem("ページ表示");
                this.m_MenuCook =new JMenuItem("cookie");
                this.m_MenuCash =new JMenuItem("キャッシュ");
                this.m_MenuTCP  =new JMenuItem("TPC/IP");
                this.m_MenuSSL  =new JMenuItem("SSL");
                
                this.m_MenuFromCash=new JMenuItem("キャッシュから表示");
                this.m_MenuCancel=new JMenuItem("キャンセル");
                
                this.m_MenuURL.addActionListener(this);
                this.m_MenuReq.addActionListener(this);
                this.m_MenuDisp.addActionListener(this);
                this.m_MenuCook.addActionListener(this);
                this.m_MenuCash.addActionListener(this);
                this.m_MenuTCP.addActionListener(this);
                this.m_MenuSSL.addActionListener(this);
                
                this.m_MenuFromCash.addActionListener(this);
                this.m_MenuCancel.addActionListener(this);
                
                this.m_Pop=new JPopupMenu();
                this.m_Pop.add(this.m_MenuURL);
                this.m_Pop.add(this.m_MenuReq);
                this.m_Pop.add(this.m_MenuDisp);
                this.m_Pop.add(this.m_MenuCook);
                this.m_Pop.add(this.m_MenuCash);
                this.m_Pop.add(this.m_MenuTCP);
                this.m_Pop.add(this.m_MenuSSL);
                
                this.m_CashPop=new JPopupMenu();
                this.m_CashPop.add(this.m_MenuFromCash);
                this.m_CashPop.add(this.m_MenuCancel);
                
                this.m_htCook=new Hashtable();
                this.m_vcCook=new Vector();
                this.m_vcCash=new Vector();
                
        }
        /**
         * マウス押下時のアクション
         */
        public boolean onMousePressed()
        {
                this.m_Pop.show(super.getParent(),super.m_nPosX+super.getImage().getWidth(super.getParent()),super.m_nPosY+super.getImage().getHeight(super.getParent()));
                return true;
        }
        /**
         * 各種メニュー選択時のアクション
         */
        public void actionPerformed(ActionEvent evt)
        {
                JMenuItem source=(JMenuItem)evt.getSource();
                //URL入力選択時
                if(source == this.m_MenuURL)
                {
                        String inputValue = JOptionPane.showInputDialog("URL入力"); 
                        try
                        {
                                URL url=new URL(inputValue);
                                this.m_URLReq=url;
                                
                                HTTPPacketData objPack=new HTTPPacketData(this.m_Applet,this.m_Applet.getImageArray(2));
                                objPack.setMemo(url.getHost());
                                objPack.setMoveObject(this,(MachineItem)this.m_Applet.getDNS());
                                objPack.startThread();
                                this.m_Applet.addPacket(objPack);
                        }
                        catch(MalformedURLException e)
                        {
                                JOptionPane.showMessageDialog(null, "URLの入力が不正です","エラー", JOptionPane.ERROR_MESSAGE);
                                return;
                        }
                }
                //HTTPリクエスト選択時
                else if(source == this.m_MenuReq)
                {
                        if(this.m_sGetIP.compareTo("")==0)
                        {
                                JOptionPane.showMessageDialog(null, "URLが入力されていないか、DNSの名前引きが出来ませんでした","エラー", JOptionPane.ERROR_MESSAGE);
                                return;
                        }
                        
                        if(this.m_vcCash.contains(this.m_URLReq.getHost().toString()+"@"+this.m_URLReq.getFile().toString()))
                        {
                                this.m_CashPop.show(super.getParent(),super.m_nPosX+super.getImage().getWidth(super.getParent()),super.m_nPosY+super.getImage().getHeight(super.getParent()));
                                return;
                        }
                
                        String sText="GET "+this.m_URLReq.getFile().toString()+" HTTP/1.1\n";
                        sText+="Host: "+this.m_URLReq.getHost().toString()+"/\n";
                        sText+="Accept: text/html,text/plain,text/sgml, */*;q=0.01\n";
                        sText+="Accept-Encoding: gzip,compress\n";
                        sText+="Accept-Language: ja,en\n";
                        sText+="If-Modified-Since: Tue, 19 Dec 2002 11:31:06 GMT\n";
                        sText+="User-Agent: nime-simurator\n";
                        new TextAreaDialog(super.getRootFrame(),"リクエスト",sText,(MachineItem)this);
                }
                //ページ表示選択時
                else if(source == this.m_MenuDisp)
                {
                        if(this.m_sGetIP.compareTo("")==0)
                        {
                                JOptionPane.showMessageDialog(null, "URLが入力されていないか、DNSの名前引きが出来ませんでした","エラー", JOptionPane.ERROR_MESSAGE);
                                return;
                        }
                        
                        if(this.m_URLReq.getFile().compareTo("/cook.html")==0)
                        {
                                new EasyBrowserDialog(super.getRootFrame(),this,this.m_URLReq.toString(),"クッキーテストページ","",null,true);
                        }
                        else
                        {
                                new EasyBrowserDialog(super.getRootFrame(),this,this.m_URLReq.toString(),"テストページ","これはテストページです",null,false);
                        }       
                        
                }
                //Cookie選択時
                else if(source == this.m_MenuCook)
                {
                        new CookieListDialog(super.getRootFrame(),this.m_htCook,this.m_vcCook);
                }
                //キャッシュ選択時
                else if(source == this.m_MenuCash)
                {
                        new CashListDialog(super.getRootFrame(),this.m_vcCash);
                }
                //TCP/IP選択時
                else if(source == this.m_MenuTCP)
                {
                        this.start();
                }
                //SSL選択時
                else if(source == this.m_MenuSSL)
                {
                        String inputValue = JOptionPane.showInputDialog(this.m_Applet,"URL入力","https://"); 
                        try
                        {
                                URL url=new URL(inputValue);
                                this.m_URLReq=url;
                                
                                HTTPPacketData objPack=new HTTPPacketData(this.m_Applet,this.m_Applet.getImageArray(2));
                                objPack.setMemo("鍵取得");
                                objPack.setServName(url.getHost().toString());
                                objPack.setStatus(HTTPPacketData.HTTP_PACKET_STATUS_GET_OPEN_KEY);
                                objPack.setMoveObject(this,(MachineItem)this.m_Applet.getHTTP("192.168.0.2"));
                                objPack.startThread();
                                this.m_Applet.addPacket(objPack);
                                this.m_Applet.setSSLStatus(true);
                        }
                        catch(MalformedURLException e)
                        {
                                JOptionPane.showMessageDialog(null, "URLの入力が不正です","エラー", JOptionPane.ERROR_MESSAGE);
                                return;
                        }
                }
                //キャッシュから表示選択時
                else if(source == this.m_MenuFromCash)
                {
                        if(this.m_sGetIP.compareTo("")==0)
                        {
                                JOptionPane.showMessageDialog(null, "URLが入力されていないか、DNSの名前引きが出来ませんでした","エラー", JOptionPane.ERROR_MESSAGE);
                                return;
                        }
                        
                        if(this.m_URLReq.getFile().compareTo("/cook.html")==0)
                        {
                                new EasyBrowserDialog(super.getRootFrame(),this,this.m_URLReq.toString(),"クッキーテストページ","",null,true);
                        }
                        else
                        {
                                new EasyBrowserDialog(super.getRootFrame(),this,this.m_URLReq.toString(),"テストページ","これはテストページです",null,false);
                        }       
                }
                //キャンセル選択時
                else if(source == this.m_MenuCancel)
                {
                        String sText="GET "+this.m_URLReq.getFile().toString()+" HTTP/1.1\n";
                        sText+="Host: "+this.m_URLReq.getHost().toString()+"/\n";
                        sText+="Accept: text/html,text/plain,text/sgml, */*;q=0.01\n";
                        sText+="Accept-Encoding: gzip,compress\n";
                        sText+="Accept-Language: ja,en\n";
                        sText+="If-Modified-Since: Tue, 19 Dec 2002 11:31:06 GMT\n";
                        sText+="User-Agent: nime-simurator\n";
                        new TextAreaDialog(super.getRootFrame(),"リクエスト",sText,(MachineItem)this);
                }
        }
        
        /**
         * Cookieをセットをする
         * @param sCook Cookie文字列
         */
        public void setCookie(String sCook)
        {
                this.m_htCook.put(this.m_URLReq.getHost().toString()+"@pass["+this.m_vcCook.size()+"].txt",sCook);
                this.m_vcCook.add(this.m_URLReq.getHost().toString()+"@pass["+this.m_vcCook.size()+"].txt");
                MachineItem tagItem=this.m_Applet.getHTTP(this.m_sGetIP);
                if(tagItem!=null)
                {
                        HTTPPacketData objPack=new HTTPPacketData(this.m_Applet,this.m_Applet.getImageArray(2));
                        objPack.setFileName(this.m_URLReq.getFile());
                        objPack.setMemo("HTTP(Cookie)");
                        objPack.setCookie(sCook);
                        objPack.setStatus(HTTPPacketData.HTTP_PACKET_STATUS_RET_COOK);
                        objPack.setMoveObject(this,tagItem);
                        objPack.startThread();
                        this.m_Applet.addPacket(objPack);
                }
        }
        /**
         * メールオブジェクト到達通知アクション
         * @param obj メールデータオブジェクト
         */
        public void postMailAction(MailDataObject obj)
        {
        }
        /**
         * HTTPパケットオブジェクト到達通知アクション
         * @param obj HTTPパケットオブジェクト
         */
        public void postPacketAction(HTTPPacketData obj)
        {
                int nStatus=obj.getStatus();
                HTTPPacketData objPack=null;
                switch(nStatus)
                {
                case HTTPPacketData.HTTP_PACKET_STATUS_RET_DNS: //DNSからの返信
                        if(obj.getMemo().compareTo("Not Found")!=0)
                        {
                                this.m_sGetIP=obj.getMemo();
                        }
                        break;
                case HTTPPacketData.HTTP_PACKET_STATUS_RET_HTTP: //HTTPサーバーからの返信
                        if(obj.isSuccess()==false)
                        {
                                JOptionPane.showMessageDialog(null, "ページが見つかりませんでした エラー404","エラー", JOptionPane.ERROR_MESSAGE);
                                this.m_sGetIP="";
                                return;
                        }
                        this.m_vcCash.addElement(this.m_URLReq.getHost().toString()+"@"+this.m_URLReq.getFile().toString());                    
                        break;
                case HTTPPacketData.HTTP_PACKET_STATUS_RET_COOK: //Cookieページからの返信
                        new EasyBrowserDialog(super.getRootFrame(),this,this.m_URLReq.toString(),"Cookieテストページ","これはテストページです",null,false);
                        break;
                case HTTPPacketData.HTTP_PACKET_STATUS_TCP_RET: //TCP/IPパケットの到着
                        if(obj.isSuccess()==false)
                        {
                                objPack=new HTTPPacketData(this.m_Applet,this.m_Applet.getImageArray(2));
                                objPack.setMemo("Packet"+(obj.getNumber()+1));
                                objPack.setNumber(obj.getNumber());
                                objPack.setStatus(HTTPPacketData.HTTP_PACKET_STATUS_TCP_TEST);
                                objPack.setMoveObject(this,this.m_Applet.getHTTP("192.168.0.2"));
                                objPack.startThread();
                                this.m_Applet.addPacket(objPack);
                        }
                        break;
                case HTTPPacketData.HTTP_PACKET_STATUS_OPEN_KEY_RET: //公開キー取得
                        this.m_Applet.recOpenKey();
                        objPack=new HTTPPacketData(this.m_Applet,this.m_Applet.getImageArray(4));
                        objPack.setMemo("鍵認証");
                        objPack.setServName(obj.getServName());
                        objPack.setMoveObject(this,(MachineItem)this.m_Applet.getCert());
                        objPack.startThread();
                        this.m_Applet.addPacket(objPack);
                        break;                  
                case HTTPPacketData.HTTP_PACKET_STATUS_CERT_RET: //認証局からの返信
                        //obj.stopThread();
                        int nConf=JOptionPane.YES_OPTION;
                        if(obj.isSuccess()==false)
                        {
                                nConf=JOptionPane.showConfirmDialog(null, "この証明書は、信頼する会社から発行されていません。この証明機関を信頼するかどうか決定して下さい","警告", JOptionPane.YES_NO_OPTION );
                        }
                        if(nConf!=JOptionPane.YES_OPTION)
                        {
                                this.m_Applet.setSSLStatus(false);
                                return;
                        }
                        objPack=new HTTPPacketData(this.m_Applet,this.m_Applet.getImageArray(5));
                        objPack.setMemo("暗号化された共通鍵");
                        objPack.setStatus(HTTPPacketData.HTTP_PACKET_STATUS_COMMON_KEY);
                        objPack.setMoveObject(this,(MachineItem)this.m_Applet.getHTTP("192.168.0.2"));
                        objPack.startThread();
                        this.m_Applet.addPacket(objPack);
                        break;
                case HTTPPacketData.HTTP_PACKET_STATUS_CRYPT_DATA: //暗号化データ到着
                        this.m_Applet.setSSLStatus(false);
                        new EasyBrowserDialog(super.getRootFrame(),this,this.m_URLReq.toString(),"暗号化されたページ","これはテストページです",null,false);
                        break;
                }
        }
        /**
         * 外部からのイベント通知
         * @param nEvent イベント種類
         */
        public void postEventAction(int nEvent)
        {
                if(nEvent==MachineItem.ON_TEXTAREA_DIALOG_CLOSED)
                {
                        MachineItem tagItem=this.m_Applet.getHTTP(this.m_sGetIP);
                        if(tagItem!=null)
                        {
                                HTTPPacketData objPack=new HTTPPacketData(this.m_Applet,this.m_Applet.getImageArray(2));
                                objPack.setFileName(this.m_URLReq.getFile());
                                objPack.setMemo("HTTP");
                                objPack.setMoveObject(this,tagItem);
                                objPack.startThread();
                                this.m_Applet.addPacket(objPack);
                        }
                }
                else if(nEvent==MachineItem.ON_BROWSER_DIALOG_CLOSED)
                {
                }
        }
        /**
         * スレッドの開始、生成
         */
        public void start()
        {
                if(this.m_Thread==null)
                {
                        this.m_Thread=new Thread(this);
                }
                this.m_Thread.start();
        }
        /**
         * スレッドの実行
         */
        public void run()
        {
                int nCount=1;
                while(this.m_Thread!=null)
                {
                        HTTPPacketData objPack=new HTTPPacketData(this.m_Applet,this.m_Applet.getImageArray(2));
                        objPack.setMemo("Packet"+nCount);
                        objPack.setNumber(nCount-1);
                        objPack.setStatus(HTTPPacketData.HTTP_PACKET_STATUS_TCP_TEST);
                        objPack.setMoveObject(this,this.m_Applet.getHTTP("192.168.0.2"));
                        objPack.startThread();
                        this.m_Applet.addPacket(objPack);
                        try
                        {
                                this.m_Thread.sleep(700);
                        }
                        catch(InterruptedException e)
                        {
                                this.m_Thread=null;
                                break;
                        }
                        
                        nCount++;
                        
                        if(nCount>4)
                        {
                                this.m_Thread=null;
                                break;
                        }
                }
        }
}

/* [<][>][^][v][top][bottom][index][help] */