package org.infosec.ismp.sitecheck;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;
import org.apache.activemq.management.PollCountStatisticImpl;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.htmlparser.util.ParserException;
import org.infosec.ismp.model.poller.PollStatus;
import org.infosec.ismp.ping.Pinger;
import org.infosec.ismp.util.ThreadCategory;
import org.infosec.ismp.util.scheduler.ReadyRunnable;
import org.infosec.ismp.util.scheduler.Schedule;
import com.sun.tools.javac.util.Log;
public class SiteCheckService implements ReadyRunnable {
public final static String SITECHECK_STATUS_NORMAL = "NORMAL";
public final static String SITECHECK_STATUS_EXCEPTION = "EXCEPTION";
public final static String STATUS_UP = "Up";
public final static String STATUS_DOWN = "Down";
private boolean isReset = false; //当做重置操作时候为true 表示该次检测为重置后第一次检测
private boolean isReady = true;
private Schedule schedule;
private SiteCheckModel model;
private SiteCheckMessageSend siteSend;
private String siteCheckStatus = SITECHECK_STATUS_NORMAL; //解析网站状态 "NORMAL", "EXCEPTION", "Down"
private Set linkSet; // 网站链接元素集合
private Set scriptSet; // 网站script元素集合
private HttpSiteMonitor monitor; //用来获取访问站点返回时间和访问状态
public HttpSiteMonitor getMonitor() {
return monitor;
}
public void setMonitor(HttpSiteMonitor monitor) {
this.monitor = monitor;
}
public SiteCheckMessageSend getSiteSend() {
return siteSend;
}
public void setSiteSend(SiteCheckMessageSend siteSend) {
this.siteSend = siteSend;
}
public void setReady(boolean isReady) {
this.isReady = isReady;
}
public SiteCheckModel getModel() {
return model;
}
public void setModel(SiteCheckModel model) {
this.model = model;
}
public Schedule getSchedule() {
return schedule;
}
public void setSchedule(Schedule schedule) {
this.schedule = schedule;
}
public boolean isReady() {
return isReady;
}
public void run() {
siteCheck();
log().debug(
"SiteCheck消息发送MQ完毕!nodeId:" + model.getNodeid() + "URL:"
+ monitor.getIpAddr());
}
/**
* sitecheck服务主方法
*/
private void siteCheck() {
siteCheckStatus = SITECHECK_STATUS_NORMAL;
try {
monitor.httpOnline();//用来测试网站是否可以请求到
} catch (HttpException e) {
e.printStackTrace();
log().warn("网址输入不正确或可能是协议不对或者返回的内容有问题!"+monitor.getIpAddr(),e);
return;
} catch (IOException e) {
e.printStackTrace();
log().warn("发生网络异常!"+monitor.getIpAddr(),e);
return;
}
// System.out.println("monitor.getStatusCode()==========================="+monitor.getStatusCode());
// System.out.println("monitor.getResponseTime()==========================="+monitor.getResponseTime());
String pingStatus = monitor.getStatusCode();
long responseTime = monitor.getResponseTime();
if (STATUS_UP.equalsIgnoreCase(pingStatus))
{
try {
siteCheckParser(monitor.getIpAddr());
} catch (ParserException e) {
log().warn(
"SiteCheckService类SiteCheck()方法siteCheckParser失败!nodeId:"
+ model.getNodeid() + "URL:"
+ monitor.getIpAddr(), e);
return;
} catch (NoSuchAlgorithmException e) {
log().fatal(
"SiteCheckService类SiteCheck()方法siteCheckParser失败!nodeId:"
+ model.getNodeid() + "URL:"
+ monitor.getIpAddr(), e);
return;
}
}else
{
siteCheckStatus = STATUS_DOWN;
}
model.setPingStatus(pingStatus);// ping状态 "Down" ,"Up"
model.setResponseTime(responseTime);
model.setSiteCheckStatus(siteCheckStatus);//解析网站状态 "NORMAL", "EXCEPTION", "Down"
model.setReset(isReset);
// System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
// System.out.println("pingStatus:"+pingStatus);
// System.out.println("siteCheckStatus:"+siteCheckStatus);
try {
siteSend.springSend(model);
log().debug(
"nodeId:" + model.getNodeid() + "URL:"
+ monitor.getIpAddr() + "发功MQ队列消息成功!");
} catch (Exception e) {
log().fatal(
"SiteCheckService类SiteCheck()方法发送MQ信息失败!nodeId:"
+ model.getNodeid() + "URL:"
+ monitor.getIpAddr(), e);
}
isReset=false;
}
/**
* 验证页面超链元素和script元素
*
* @param url
* @return
* @throws ParserException
* @throws NoSuchAlgorithmException
*/
private void siteCheckParser(String url) throws ParserException,
NoSuchAlgorithmException {
SiteCheckParser parser = new SiteCheckParser(url);
Set linkSetTmp = parser.getLinkText();// 获取解析页面超链集合
Set scriptSetTmp = parser.getScriptText();// 获取解析页面script集合
if (null != linkSet) { // 如果不为NULL 说明不是第一次解析该网站 ,则监控与第一次解析页面是否有改变
for (Iterator iterator = linkSetTmp.iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
if (!linkSet.contains(key)) {// 判断链接内容是否存在
// System.out.println("key:"+key);
siteCheckStatus = SITECHECK_STATUS_EXCEPTION;
}
}
} else// 程序启动第一次解析该网站获取链接集合
{
log().debug("程序启动第一次解析该网站获取链接集合,URL:" + url);
linkSet = linkSetTmp;
siteCheckStatus = SITECHECK_STATUS_NORMAL;
}
if (null != scriptSet) { // 如果不为NULL 说明不是第一次解析该网站 ,则监控与第一次解析页面是否有改变
for (Iterator iterator = scriptSetTmp.iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
if (!scriptSet.contains(key)) {
siteCheckStatus = SITECHECK_STATUS_EXCEPTION;
// System.out.println("scriptKey"+key);
}
}
} else// 程序启动第一次解析该网站获取script集合
{
log().debug("程序启动第一次解析该网站获取script集合,URL:" + url);
scriptSet = scriptSetTmp;
siteCheckStatus = SITECHECK_STATUS_NORMAL;
}
// System.out.println("linkSetTmp.size():"+linkSetTmp.size());
// System.out.println("scriptSetTmp.size():"+scriptSetTmp.size());
// System.out.println("linkSet.size():"+linkSet.size());
// System.out.println("scriptSet.size():"+scriptSet.size());
// System.out.println("siteCheckStatus:"+siteCheckStatus);
}
/**
* 将该服务放入调度池中
*/
public void schedule() {
if (schedule == null)
throw new IllegalStateException(
"Cannot schedule a service whose schedule is set to null");
schedule.schedule();
log().debug(
"SiteCheck该服务放入调度池中!nodeId:" + model.getNodeid() + "URL:"
+ monitor.getIpAddr());
}
/**
* 重置sitecheck方法
*/
public void resetSiteCheck() {
linkSet = null;
scriptSet = null;
isReset = true;
}
/**
* 取消该服务
*/
public void delete() {
if (schedule == null)
throw new IllegalStateException(
"Cannot unschedule a service whose schedule is set to null");
schedule.unschedule();
log().debug(
"SiteCheck取消该服务!nodeId:" + model.getNodeid() + "URL:"
+ monitor.getIpAddr());
}
private ThreadCategory log() {
return ThreadCategory.getInstance(getClass());
}
}