/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- BrowserItem
- onMousePressed
- actionPerformed
- setCookie
- postMailAction
- postPacketAction
- postEventAction
- 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;
}
}
}
}