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

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

DEFINITIONS

This source file includes following definitions.
  1. WebSim
  2. init
  3. setDefault
  4. paint
  5. update
  6. drawAll
  7. drawBack
  8. drawKey
  9. drawPack
  10. start
  11. run
  12. stop
  13. mousePressed
  14. loadImages
  15. getImageArray
  16. addPacket
  17. setSSLStatus
  18. sentOpenKey
  19. recOpenKey
  20. recComKey
  21. getDNS
  22. getHTTP
  23. getCert
  24. mouseClicked
  25. mouseEntered
  26. mouseExited
  27. mouseReleased

package jp.ac.nime.computer.websim;
                  
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

import jp.ac.nime.computer.*;

/**
 * WWWシミュレータメインアプレットクラス
 * 
 * @version 1.00 2003/03/31
 * @author Toshikazu Matsumoto Avion Corp.
 */
public class WebSim extends JApplet implements MouseListener,Runnable
{
        private Vector m_vcMachine;             //表示マシンオブジェクト列
        private Image m_imBrow;                 //ブラウザ画像
        private Image m_imServ;                 //サーバー画像
        private Image m_imPacket;               //パケット画像
        private Image m_imBuil;                 //認証局画像
        private Image m_imKey1;                 //鍵画像1
        private Image m_imKey2;                 //鍵画像2
        private Image m_imKey3;                 //鍵画像3
        private Image[] m_imArray;              //画像配列
        private Image m_imOff=null;             //オフスクリーンイメージ
        private Thread m_Thread=null;   //スレッド
        private Vector m_vcPacket=null; //パケットオブジェクト列
        private Vector m_vcHTTP;                //HTTPサーバーオブジェクト列
        private Vector m_vcDNS;                 //DNSサーバーオブジェクト列
        private Vector m_vcPC;                  //PCオブジェクト列
        private CertServItem m_CertItem;//認証局オブジェクト
        
        private boolean m_bStartSSL             =false;
        private boolean m_bSentOpenKey  =false;
        private boolean m_bRecOpenKey   =false;
        private boolean m_bRecComKey    =false;
                
        /**
         * アプレット初期化
         */
        public void init()
        {
                this.m_vcMachine=new Vector();
                this.m_vcPacket=new Vector();
                this.m_imArray=new Image[7];
                
                this.m_vcHTTP=new Vector();
                this.m_vcDNS=new Vector();
                this.m_vcPC=new Vector();
                
                if(this.loadImages()==false)
                {
                        JOptionPane.showMessageDialog(null, "エラー","画像の読み込みに失敗しました", JOptionPane.ERROR_MESSAGE);
                        return;
                }
                
                this.getContentPane().setBackground(new Color(57,109,165));
                this.addMouseListener(this);
                this.setDefault();
                this.repaint();
        }
        /**
         * 各種デフォルト値の設定
         */
        private void setDefault()
        {
                BrowserItem objBrow=new BrowserItem(this,"192.168.0.4",this.m_imBrow,100,100);
                this.m_vcMachine.addElement(objBrow);
                this.m_vcPC.addElement(objBrow);
                DNSServItem objDNS=new DNSServItem(this,"192.168.0.3",this.m_imServ,320,80);
                this.m_vcMachine.addElement(objDNS);
                this.m_vcDNS.addElement(objDNS);
                HTTPServItem objHTTP=new HTTPServItem(this,"192.168.0.1",this.m_imServ,480,300);
                this.m_vcMachine.addElement(objHTTP);
                this.m_vcHTTP.addElement(objHTTP);
                objHTTP=new HTTPServItem(this,"192.168.0.2",this.m_imServ,460,120);
                this.m_vcMachine.addElement(objHTTP);
                this.m_vcHTTP.addElement(objHTTP);
                this.m_CertItem=new CertServItem(this,"192.168.0.10",this.m_imBuil,100,300);
                this.m_vcMachine.addElement(this.m_CertItem);
        }
        /**
         * グラフィックの描画(オフスクリーンイメージからメインスクリーンへのコピー)
         * @param g 描画グラフィック領域
         */
        public void paint(Graphics g)
        {
                if(this.m_imOff==null)
                {
                        Dimension d=this.getSize();
                        this.m_imOff=this.createImage(d.width,d.height);
                }
                this.drawAll();
                g.drawImage(this.m_imOff,0,0,this);
                this.m_imOff.flush();
        }
        /**
         * グラフィックの再描画
         * @param g 描画グラフィック領域
         */
        public void update(Graphics g)
        {
                this.paint(g);
        }
        /**
         * オフスクリーンイメージへの各グラフィックの描画
         */
        private void drawAll()
        {
                Graphics g=this.m_imOff.getGraphics();
                this.drawBack(g);
                if(this.m_bStartSSL)this.drawKey(g);
                this.drawPack(g);
        }
        /**
         * 各マシンの画像、背景等の描画
         * @param g 描画グラフィック領域
         */
        private void drawBack(Graphics g)
        {
                g.setColor(new Color(57,109,165));
                g.fillRect(0,0,640,480);
                
                g.setColor(Color.black);
                g.drawLine(100+this.m_imBrow.getWidth(this)/2,100+this.m_imBrow.getHeight(this)/2,310,250);
                g.drawLine(320+this.m_imServ.getWidth(this)/2,80+this.m_imServ.getHeight(this)/2,310,250);
                g.drawLine(480+this.m_imServ.getWidth(this)/2,300+this.m_imServ.getHeight(this)/2,310,250);
                g.drawLine(460+this.m_imServ.getWidth(this)/2,120+this.m_imServ.getHeight(this)/2,310,250);
                g.drawLine(100+this.m_imBuil.getWidth(this)/2,300+this.m_imBuil.getHeight(this)/2,310,250);
                
                g.setColor(Color.white);
                g.fillOval(180,200,260,100);
                g.setColor(Color.black);
                g.drawOval(180,200,260,100);
                g.setFont(new Font("SansSerif",Font.BOLD,20));
                g.drawString("インターネット",240,255);
                
                g.setFont(new Font("SansSerif",Font.BOLD,12));
                FontMetrics fontMet=g.getFontMetrics();
                
                for(int i=0;i<this.m_vcMachine.size();i++)
                {
                        MachineItem item=(MachineItem)this.m_vcMachine.elementAt(i);
                        g.drawImage(item.getImage(),item.m_nPosX,item.m_nPosY,this);
                        g.drawString(item.getLabel(),item.m_nPosX+(item.getImage().getWidth(this)-fontMet.stringWidth(item.getLabel()))/2,item.m_nPosY+item.getImage().getHeight(this)+fontMet.getAscent());
                }
        }
        /**
         * 鍵状態の描画
         * @param g 描画グラフィック領域
         */
        private void drawKey(Graphics g)
        {
                MachineItem client=(MachineItem)this.m_vcPC.elementAt(0);
                MachineItem serv = (MachineItem)this.m_vcHTTP.elementAt(1);
                
                g.setColor(Color.white);
                g.fillRoundRect(client.m_nPosX-80,client.m_nPosY-80,100,100,10,10);
                g.fillRoundRect(serv.m_nPosX+40,serv.m_nPosY-80,100,100,10,10);
                
                g.setColor(Color.black);
                g.drawRoundRect(client.m_nPosX-80,client.m_nPosY-80,100,100,10,10);
                g.drawRoundRect(serv.m_nPosX+40,serv.m_nPosY-80,100,100,10,10);
                
                if(this.m_bRecOpenKey)g.drawImage(this.m_imKey1,client.m_nPosX-60,client.m_nPosY-60,this);
                g.drawImage(this.m_imKey2,client.m_nPosX-20,client.m_nPosY-60,this);
                
                if(!this.m_bSentOpenKey)g.drawImage(this.m_imKey1,serv.m_nPosX+40+20,serv.m_nPosY-80+20,this);
                if(this.m_bRecComKey)g.drawImage(this.m_imKey2,serv.m_nPosX+40+20,serv.m_nPosY-80+20,this);
                g.drawImage(this.m_imKey3,serv.m_nPosX+40+60,serv.m_nPosY-80+20,this);
                
                g.setColor(Color.black);
                g.setFont(new Font("SansSerif",Font.PLAIN,12));
                FontMetrics fontMet=g.getFontMetrics();
                
                if(this.m_bRecOpenKey)g.drawString("公開鍵",(client.m_nPosX-60)+(this.m_imKey1.getWidth(this)-fontMet.stringWidth("共通鍵"))/2,client.m_nPosY+this.m_imKey1.getHeight(this)+fontMet.getHeight()-60);
                g.drawString("共通鍵",(client.m_nPosX-20)+(this.m_imKey2.getWidth(this)-fontMet.stringWidth("公開鍵"))/2,client.m_nPosY+this.m_imKey2.getHeight(this)+fontMet.getHeight()-60);
                
                if(!this.m_bSentOpenKey)g.drawString("公開鍵",(serv.m_nPosX+40+20)+(this.m_imKey1.getWidth(this)-fontMet.stringWidth("共通鍵"))/2,(serv.m_nPosY-80+20)+this.m_imKey1.getHeight(this)+fontMet.getHeight());
                if(this.m_bRecComKey)g.drawString("共通鍵",(serv.m_nPosX+40+20)+(this.m_imKey2.getWidth(this)-fontMet.stringWidth("共通鍵"))/2,(serv.m_nPosY-80+20)+this.m_imKey2.getHeight(this)+fontMet.getHeight());
                g.drawString("秘密鍵",(serv.m_nPosX+40+60)+(this.m_imKey3.getWidth(this)-fontMet.stringWidth("公開鍵"))/2,(serv.m_nPosY-80+20)+this.m_imKey3.getHeight(this)+fontMet.getHeight());
        }
        /**
         * 各パケットの描画
         * @param g 描画グラフィック領域
         */
        private void drawPack(Graphics g)
        {
                Vector vcPack=this.m_vcPacket;
                for(int i=0;i<vcPack.size();i++)
                {
                        HTTPPacketData objPack=(HTTPPacketData)this.m_vcPacket.elementAt(i);
                        MachineItem objFrom     =objPack.getMoveFrom();
                        MachineItem objTo       =objPack.getMoveTo();
                        int nProcess            =objPack.getProcess();
                        int nStatus                     =objPack.getStatus();
                        int nIconWidth          =0;
                        int nIconHeight         =0;
                        
                        if(objPack.getIcon()!=null)
                        {
                                nIconWidth      =objPack.getIcon().getWidth(this);
                                nIconHeight     =objPack.getIcon().getHeight(this);
                        }
                        
                        if(nProcess>=200)
                        {
                                this.m_vcPacket.removeElementAt(i);
                                objPack.setProcess(1);
                                objTo.postPacketAction(objPack);
                                continue;
                        }
                        int nPointX=0;
                        int nPointY=0;
                        if(nProcess<100)
                        {
                                nPointX=(int)((float)((310-objFrom.getImage().getWidth(this)/2-objFrom.m_nPosX)*nProcess)/100)+objFrom.m_nPosX+objFrom.getImage().getWidth(this)/2-nIconWidth/2;
                                nPointY=(int)((float)((250-objFrom.getImage().getHeight(this)/2-objFrom.m_nPosY)*nProcess)/100)+objFrom.m_nPosY+objFrom.getImage().getHeight(this)/2-nIconHeight/2;
                        }
                        else
                        {
                                nPointX=(int)((float)((objTo.m_nPosX+objTo.getImage().getWidth(this)/2-310)*(nProcess-100))/100)+310-nIconWidth/2;
                                nPointY=(int)((float)((objTo.m_nPosY+objTo.getImage().getHeight(this)/2-250)*(nProcess-100))/100)+250-nIconHeight/2;
                        }
                        
                        g.setFont(new Font("SansSerif",Font.BOLD,12));
                        FontMetrics fontmet=g.getFontMetrics();
                        
                        g.drawString
                                (
                                        objPack.getMemo(),
                                        nPointX,
                                        nPointY+nIconHeight+fontmet.getHeight()
                                );
                        if(objPack.getIcon()!=null)
                        {
                                g.drawImage
                                        (
                                                objPack.getIcon(),
                                                nPointX,
                                                nPointY,
                                                this
                                        );
                        }
                }
        }
        /**
         * スレッドの開始、生成
         */
        public void start()
        {
                if(this.m_Thread==null)
                {
                        this.m_Thread=new Thread(this);
                }
                this.m_Thread.start();
        }
        /**
         * スレッドの実行
         */
        public void run()
        {
                while(this.m_Thread!=null)
                {
                        this.repaint();
                        try
                        {
                                this.m_Thread.sleep(80);
                        }
                        catch(InterruptedException e)
                        {
                                this.m_Thread=null;
                        }
                }
        }
        /**
         * スレッドの停止
         */
        public void stop()
        {
                this.m_Thread.stop();
        }
        /**
         * マウス押下時のアクション
         */
        public void mousePressed(MouseEvent evt)
        {
                for(int i=0;i<this.m_vcMachine.size();i++)
                {
                        MachineItem item=(MachineItem)this.m_vcMachine.elementAt(i);
                        
                        if(
                           evt.getX()>=item.m_nPosX
                           &&evt.getX()<=item.m_nPosX+item.getImage().getWidth(this)
                           &&evt.getY()>=item.m_nPosY
                           &&evt.getY()<=item.m_nPosY+item.getImage().getHeight(this)
                          )
                        {
                                item.onMousePressed();
                        }
                }
        }
        /**
         * 各種画像ファイルの読み込み
         */
        private boolean loadImages()
        {
                MediaTracker objTrack=new MediaTracker(this);
                try
                {
                        this.m_imServ=this.getImage(this.getCodeBase(),"images/server.gif");
                        this.m_imBrow=this.getImage(this.getCodeBase(),"images/pc.gif");
                        this.m_imPacket=this.getImage(this.getCodeBase(),"images/packet.gif");
                        this.m_imBuil=this.getImage(this.getCodeBase(),"images/buil.gif");
                        this.m_imKey1=this.getImage(this.getCodeBase(),"images/key1.gif");
                        this.m_imKey2=this.getImage(this.getCodeBase(),"images/key2.gif");
                        this.m_imKey3=this.getImage(this.getCodeBase(),"images/key3.gif");
                }
                catch(Exception e)
                {
                        return false;
                }
                
                objTrack.addImage(this.m_imBrow,0);
                objTrack.addImage(this.m_imServ,0);
                objTrack.addImage(this.m_imPacket,0);
                objTrack.addImage(this.m_imBuil,0);
                objTrack.addImage(this.m_imKey1,0);
                objTrack.addImage(this.m_imKey2,0);
                objTrack.addImage(this.m_imKey3,0);
                
                this.m_imArray[0]=this.m_imBrow;
                this.m_imArray[1]=this.m_imServ;
                this.m_imArray[2]=this.m_imPacket;
                this.m_imArray[3]=this.m_imBuil;
                this.m_imArray[4]=this.m_imKey1;
                this.m_imArray[5]=this.m_imKey2;
                this.m_imArray[6]=this.m_imKey3;
                                           
                try
                {
                        objTrack.checkID(0);
                        objTrack.waitForAll();
                }
                catch(Exception e)
                {
                        return false;
                }
                
                return true;
        }
        /**
         * 指定画像の取り出し
         * @param n 指定番号
         * @return 取り出した画像
         */
        public Image getImageArray(int n)
        {
                return this.m_imArray[n];
        }
        /**
         * 描画するパケット列にオブジェクトを追加
         * @param objPack 追加するHTTPパケットオブジェクト
         */
        public void addPacket(HTTPPacketData objPack)
        {
                this.m_vcPacket.addElement(objPack);
        }
        /**
         * SSLのシミュレート状態をセット
         * @param b 状態フラグ
         */
        public void setSSLStatus(boolean b)
        {
                this.m_bStartSSL=b;
                if(!b)
                {
                        this.m_bRecComKey=false;
                        this.m_bRecOpenKey=false;
                        this.m_bSentOpenKey=false;
                }
        }
        /**
         * SSLのシミュレートで公開キーの送信を通知
         */
        public void sentOpenKey()
        {
                this.m_bSentOpenKey=true;
        }
        /**
         * SSLのシミュレートで公開キーの受け取りを通知
         */
        public void recOpenKey()
        {
                this.m_bRecOpenKey=true;
        }
        /**
         * SSLのシミュレートで共通キーの受け取りを通知
         */
        public void recComKey()
        {
                this.m_bRecComKey=true;
        }
        /**
         * DNSサーバーオブジェクトを取得
         * @return 取得したマシンオブジェクト
         */
        public MachineItem getDNS()
        {
                return (DNSServItem)this.m_vcDNS.elementAt(0);
        }
        /**
         * HTTPサーバーオブジェクトをIPアドレス文字列から取得
         * @return 取得したマシンオブジェクト
         */
        public MachineItem getHTTP(String sIP)
        {
                for(int i=0;i<this.m_vcHTTP.size();i++)
                {
                        HTTPServItem item=(HTTPServItem)this.m_vcHTTP.elementAt(i);
                        if(item.getIP().compareTo(sIP)==0)
                        {
                                return item;
                        }
                }
                return null;
        }
        /**
         * 認証局オブジェクトを取得
         * @return 取得したマシンオブジェクト
         */
        public MachineItem getCert()
        {
                return this.m_CertItem;
        }
        /**
         * マウスクリック時のアクション
         */
        public void mouseClicked(MouseEvent evt) 
        {
        }
        /**
         * マウスが領域に入った場合のアクション
         */
        public void mouseEntered(MouseEvent evt)
        {
        }
        /**
         * マウスが領域から出た場合のアクション
         */
        public void mouseExited(MouseEvent evt)
        {
        }
        /**
         * マウスを離した場合のアクション
         */
        public void mouseReleased(MouseEvent evt)
        {
        }
        
}

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