⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boks.java

📁 Network Administration Visualized 网络管理可视化源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * $Id: Boks.java 3553 2006-07-17 13:35:29Z mortenv $ * * Copyright 2004 Norwegian University of Science and Technology *  * This file is part of Network Administration Visualized (NAV) *  * NAV is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *  * NAV is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with NAV; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * * Authors: Kristian Eide <kreide@online.no> */import java.io.*;import java.util.*;class Boks{	public static boolean DEBUG_OUT = true;	public static boolean VERBOSE_OUT = true;	public static final int PROC_UPLINK_LEVEL = Integer.MAX_VALUE;	int boksid;	Integer boksidI;	int gwboksid;	List boksbakList;	Map mp = new HashMap();	Map mpCount;	Map mpBoksbak = new HashMap();	Map boksbakMp = new HashMap();	Map rawBoksbakMp = new HashMap();	String uplinkMp;	Integer uplinkBoksid;	Map bokser;	boolean isSW;	boolean hasUplink;	int maxBehindMp;	int behindMpCount;	public static Map boksNavn;	public static Map boksType;	/*	String uplinkPort;	Integer uplink;	HashMap hm;	HashMap nettelPort;	ArrayList porter;	ArrayList downlinks = new ArrayList();	*/	int numDownlinks;	public Boks(int boksid, int gwboksid, List boksbakList, Map bokser, boolean isSW, boolean hasUplink)	{		this.boksid = boksid;		this.gwboksid = gwboksid;		this.boksbakList = boksbakList;		boksidI = new Integer(boksid);		this.bokser = bokser;		this.isSW = isSW;		this.hasUplink = hasUplink;	}	public void init()	{		if (DEBUG_OUT) outl("-->Boks(" + boksid + "): <b>" + boksNavn.get(boksidI) + "</b> (checking " + boksbakList.size() + " links)<br>");		for (int i=0; i<boksbakList.size(); i++) {			String[] s = (String[])boksbakList.get(i);			String ifindex = s[0];			int boksbak = Integer.parseInt(s[1]);			String toIfindex = s[2];			//String mpKey = modul+":"+port;			String mpKey = ifindex;			BoksMpBak bmp = new BoksMpBak(new Integer(boksbak), toIfindex);			if (mpKey.equals(uplinkMp)) continue; // Ikke legg til for uplink-porten			//if (boksbak == gwboksid && hasUplink) {			if (boksbak == gwboksid) {				// Vi har funnet uplink-porten				uplinkMp = mpKey;				/*				if (rawBoksbakMp.containsValue(mpKey)) {					Collection c = rawBoksbakMp.values();					while (c.remove(mpKey));				}				continue;				*/			}			//rawBoksbakMp.put(new Integer(boksbak), mpKey);			if (toIfindex == null) {				if (rawBoksbakMp.containsKey(new Integer(boksbak))) {					// Oh oh, nå er vi i trøbbel, da det er flere linker til denne enheten uten at vi vet mp bak					// (og da går vi ut ifra at andre siden heller ikke vet vår mp)					outl("---->[<font color=red>WARNING</font>]: Boks(" + boksid + "): <b>" + boksNavn.get(boksidI) + "</b>, mer enn en link til boks("+boksbak+") "+boksNavn.get(new Integer(boksbak))+", uten at vi vet mp i andre enden.<br>");				} else {					rawBoksbakMp.put(new Integer(boksbak), mpKey);				}			}			List l;			/*			if (!mp.containsKey(mpKey)) {				if (DEBUG_OUT) outl("---->Modul: <b>" + modul + "</b> Port: <b>" + port + "</b><br>");				mp.put(mpKey, l = new ArrayList());			} else {				l = (ArrayList)mp.get(mpKey);			}			*/			if ( (l=(List)mp.get(mpKey)) == null) {				if (DEBUG_OUT) outl("---->ifindex: <b>" + ifindex + "</b><br>");				mp.put(mpKey, l = new ArrayList());			}			if (DEBUG_OUT) outl("------>Boksbak("+boksbak+"): <b>" + boksNavn.get(new Integer(boksbak)) + "</b> toIfindex: <b>"+toIfindex+"</b><br>");			l.add(bmp);			if (l.size() > maxBehindMp) maxBehindMp = l.size();		}		//if (uplinkMp != null) mp.remove(uplinkMp);		// HashMap som brukes til å hente ut antall enheter bak hver port		{			mpCount = new HashMap();			Iterator iter = mp.entrySet().iterator();			while (iter.hasNext()) {				Map.Entry entry = (Map.Entry)iter.next();				String mpKey = (String)entry.getKey();				List l = (List)entry.getValue();				mpCount.put(mpKey, new Integer(l.size()));				behindMpCount += l.size();			}		}		if (DEBUG_OUT) outl("---->Uplink mp is: <b>" + ((uplinkMp!=null)?uplinkMp:"N/A") + "</b><br>" );		if (DEBUG_OUT) outl("---->Antall porter: <b>" + mp.size() + "</b> behindMpCount: <b>"+behindMpCount+"</b><br>" );	}	public boolean proc_mp(int level)	{		boolean madeChange = false;		Set removeMp = new HashSet();		Iterator iter = mp.entrySet().iterator();		while (iter.hasNext()) {			Map.Entry entry = (Map.Entry)iter.next();			String mpKey = (String)entry.getKey();			List l = (List)entry.getValue();			/*			if (foundUplinkMp() && mpKey.equals(uplinkMp)) {				if (!isSW) continue;				if (level != PROC_UPLINK_LEVEL && foundUplinkBoksid()) continue;			}			*/			if ( (foundUplinkMp() && mpKey.equals(uplinkMp)) && (!isSW || level != PROC_UPLINK_LEVEL && foundUplinkBoksid()) ) continue;			//if ( ((ArrayList)mpCount.get(mpKey)).size() != level) continue;			/*			for (int i=0; i < l.size(); i++) {				// Sjekk om vi allerede har funnet uplink for denne enheten, i så tilfellet tar vi den ut fra listen				Integer boksbak = (Integer)l.get(i);				//outl("Trying to find boksbak: <b>" + boksbak + "</b><br>");				Boks b = (Boks)bokser.get(boksbak);				if (b.foundUplinkBoksid()) {					madeChange = true;					if (DEBUG_OUT) outl("<font color=red>[Remove]</font> Boks("+getBoksid()+"): <b>" + getName() + "</b> Mp: <b>"+mpKey+"</b> Removed("+b.getBoksid()+"</b>): <b>" + b.getName() + "</b><br>");				//if ( ((Boks)bokser.get(l.get(i))).foundUplinkBoksid() ) {					l.remove(i);					i--;				}			}			*/			// Sjekk om vi kan sjekke denne porten på denne level			if ( ((Integer)mpCount.get(mpKey)).intValue() != level && level != PROC_UPLINK_LEVEL) {				//int mpCnt = ((Integer)mpCount.get(mpKey)).intValue();				//if (DEBUG_OUT) outl("<font color=blue>[Level]</font> Boks("+getBoksid()+"): <b>" + getName() + "</b> Mp: <b>"+mpKey+"</b> --><b>"+mpCnt+" != " + level + "</b><br>");				continue;			}			if (l.size() == 1) {				// Funnet en port med kun en enhet, og vi må derfor ha direkte downlink til den				madeChange = true;				// Porten på denne siden				BoksMpBak myBmp = new BoksMpBak(getBoksid(), mpKey);				BoksMpBak bmp = (BoksMpBak)l.get(0);				// Hent boksen fra mpBoksbak hvis den finnes der				if (mpBoksbak.containsKey(mpKey)) {					BoksMpBak bmpA = (BoksMpBak)mpBoksbak.get(mpKey);					if (!bmp.boksbak.equals(bmpA.boksbak)) {						outl("<font color=red>[WARNING]</font> Conflicting boksbak in mp vs. mpBoksbak for Boks("+getBoksid()+"): <b>" + getName() + "</b> Mp: <b>"+mpKey+"</b> bmp: " + bmp + ", bmpA: " + bmpA + " <br>");					}					bmp = bmpA;				}				Boks b = (Boks)bokser.get(bmp.boksbak);				if (bmp.toIfindex == null && b.foundUplinkMp()) {					// Vi velger bare uplink-porten siden vi er direkte uplink					bmp.setToIfindex(b.getUplinkMp());				}				b.addUplinkBoksid(myBmp, bmp.toIfindex);				// Sett at vi har link til denne enheten				mpBoksbak.put(mpKey, bmp);				boksbakMp.put(bmp.hashKey(), mpKey);				if (DEBUG_OUT) outl("<font color=green>[Found]</font> Boks("+getBoksid()+"): <b>" + getName() + "</b> Mp: <b>"+mpKey+"</b> Boksbak("+b.getBoksid()+"</b>): <b>" + b.getName() + "</b> bmp: " + bmp + "<br>");				// Vi kan nå ta bort hele listen				removeMp.add(mpKey);			}		}		if (level == PROC_UPLINK_LEVEL) mp.remove(uplinkMp);		mp.keySet().removeAll(removeMp);		return madeChange;	}	public void removeFromMp()	{		Iterator iter = mp.entrySet().iterator();		while (iter.hasNext()) {			Map.Entry entry = (Map.Entry)iter.next();			String mpKey = (String)entry.getKey();			List l = (List)entry.getValue();			for (int i=0; i < l.size(); i++) {				// Sjekk om vi allerede har funnet uplink for denne enheten, i så tilfellet tar vi den ut fra listen				BoksMpBak bmp = (BoksMpBak)l.get(i);				//Integer boksbak = (Integer)l.get(i);				Boks b = (Boks)bokser.get(bmp.boksbak);				if (b.foundUplinkBoksid() && !b.isSW() ) {					if (DEBUG_OUT) outl("<font color=red>[Remove]</font> Boks("+getBoksid()+"): <b>" + getName() + "</b> Mp: <b>"+mpKey+"</b> Removed("+b.getBoksid()+"</b>): <b>" + b.getName() + "</b><br>");					l.remove(i);					i--;				}			}		}	}	public void guess()	{		if (mp.size() == 0) return;		Iterator iter = mp.entrySet().iterator();		while (iter.hasNext()) {			Map.Entry entry = (Map.Entry)iter.next();			String mpKey = (String)entry.getKey();			List l = (List)entry.getValue();			// Prøv å gjette hvilken enhet som er riktig, gå ut ifra at SW alltid står over KANT			int bestGuessIndex = -1;			for (int i=0; i < l.size(); i++) {				Boks b = (Boks)bokser.get( ((BoksMpBak)l.get(i)).boksbak );				if (b.isSW()) {					if (bestGuessIndex == -1) bestGuessIndex = i; else bestGuessIndex = -2;				}			}			if (bestGuessIndex < 0) {				// Mer enn en SW, gjett på den med høyest antall connections				int cnt=0;				for (int i=0; i < l.size(); i++) {					Boks b = (Boks)bokser.get( ((BoksMpBak)l.get(i)).boksbak );					if (b.getBehindMpCount() > cnt) {						cnt = b.getBehindMpCount();						bestGuessIndex = i;					}				}			}			if (bestGuessIndex >= 0) {				// Porten på denne siden				BoksMpBak myBmp = new BoksMpBak(getBoksid(), mpKey);				// Vi har funnet en kandidat, og velger den				BoksMpBak bmp = (BoksMpBak)l.get(bestGuessIndex);				Boks b = (Boks)bokser.get(bmp.boksbak);				if (bmp.toIfindex == null && b.foundUplinkMp()) {					// Vi velger bare uplink-porten siden vi er direkte uplink					bmp.setToIfindex(b.getUplinkMp());				}				b.addUplinkBoksid(myBmp, bmp.toIfindex);				// Sett at vi har link til denne enheten				mpBoksbak.put(mpKey, bmp);				boksbakMp.put(bmp.hashKey(), mpKey);				if (VERBOSE_OUT) outl("<font color=purple>[Guess]</font> Boks("+getBoksid()+"): <b>" + getName() + "</b> Mp: <b>"+mpKey+"</b> Boksbak("+b.getBoksid()+"</b>): <b>" + b.getName() + "</b><br>");			}			/*			String bestGuess = " Best guess: N/A";			if (bestGuessIndex >= 0) {				Boks b = (Boks)bokser.get(l.get(bestGuessIndex));				bestGuess = " Best guess("+b.getBoksid()+"): <b>"+b.getName()+"</b>";			}			com.outl("-->MP: <b>"+mpKey+"</b> Candidates: <b>"+l.size()+"</b>"+bestGuess+"<br>");			for (int i=0; i < l.size(); i++) {				// Sjekk om vi allerede har funnet uplink for denne enheten, i så tilfellet tar vi den ut fra listen				Integer boksbak = (Integer)l.get(i);				//outl("Trying to find boksbak: <b>" + boksbak + "</b><br>");				Boks b = (Boks)bokser.get(boksbak);				com.outl("---->Boksbak("+b.getBoksid()+"): <b>"+b.getName()+"</b><br>");			}			*/		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -