package org.infosec.ismp.situation.calculate.substep; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletionService; import org.infosec.ismp.situation.calculate.substep.callable.AttackCallable; import org.infosec.ismp.situation.calculate.substep.callable.result.ResultExponential; import org.infosec.ismp.situation.model.Event; import org.infosec.ismp.situation.model.SituationEvent; public class AttackReckon { private Map<String, int[]> map = new HashMap<String, int[]>(); private List<SituationEvent> list = new ArrayList<SituationEvent>(); private CompletionService<ResultExponential> completionService; public void setCompletionService( CompletionService<ResultExponential> completionService) { this.completionService = completionService; } public int mapSize() { return map.size(); } ///分析事件 参数是事件。 public void analyzeEvent(Event event) { int[] count; int x = event.getPriority();///获得这个事件的优先级 String ip = event.getDestAddress();///获得这个事件的目的IP SituationEvent situationEvent = new SituationEvent();///态势对应事件类 situationEvent.setEventId(event.getId());///事件id situationEvent.setSrcmod(event.getSrcmod());///事件产生模块 situationEvent.setEventIP(ip); list.add(situationEvent); if (ip != null && ip.length() > 0) { if (map.containsKey(ip)) { count = map.get(ip);///取得map里的ip赋给count } else { count = new int[] { 0, 0, 0, 0, 0 };///如果map里没有ip则新建一个。 } if (x > 0) {///x 为优先级取值。 switch (x) { case 1: count[0] = count[0] + 1; break; case 2: count[1] = count[1] + 1; break; case 3: count[2] = count[2] + 1; break; case 4: count[3] = count[3] + 1; break; case 5: count[4] = count[4] + 1; break; } map.put(ip, count); } } } ///计算指数。 public void reckonExponential(Timestamp endtime, int index) { synchronized (map) { Map<String, int[]> maps = new HashMap<String, int[]>(map); List<SituationEvent> lists = new ArrayList<SituationEvent>(list); completionService.submit(new AttackCallable(maps, index, endtime ,lists));///提交计算攻击事件态势的任务 map.clear(); list.clear(); } } }