import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
public class WebXmlConfigImpl {
/**listenerList存放web.xml中的listener节点*/
private List listenerList = new ArrayList();
/**filterList存放web.xml中的filter节点*/
private List filterList = new ArrayList();
/**servletMap存放web.xml中的servlet节点*/
private Map servletMap = new HashMap();
/**MimeMap存放web.xml中的mime-mapping节点*/
private Map mimeMap = new HashMap();
/**tldMap存放web.xml中的taglab节点*/
private Map tldMap = new HashMap();
/**sc存放web.xml中的session-config节点*/
private SessionConfig sc = new SessionConfig();
/**源文件中没有的配置项个数*/
public static int srcWebNumber=0;
/**目标文件中没有的配置项个数*/
public static int newWebNumber=0;
/**值不同的配置项个数*/
public static int differentWebNumber=0;
/**存放WebXmlConfigImpl类运行后的输出结果*/
public static StringBuffer sbWeb=new StringBuffer();
/**
* 根据文件路径构建Doc对象
* @param file web.xml文件路径
* @throws Exception
*/
public WebXmlConfigImpl(String filePath) throws Exception{
File webXml=new File(filePath);
SAXBuilder saxBuilder = new SAXBuilder();
Document doc = saxBuilder.build(webXml);
parseDoc(doc);
}
/**
* 解析Doc
* @param doc 文档对象
*/
private void parseDoc(Document doc){
if(doc!=null){
Element webapps = doc.getRootElement();
parseListener(webapps);
parseFilter(webapps);
parseServlet(webapps);
parseMimeMap(webapps);
parseTagLib(webapps);
parseSession(webapps);
}else{
System.exit(0);
}
}
/**
* 获取所有listener
* @param webapps 根节点
*/
private void parseListener(Element webapps){
List liss = webapps.getChildren("listener");
int count = liss.size();
for(int i=0;i<count;i++){
Listener listener = new Listener();
Element ele = (Element)liss.get(i);
listener.setClassName(ele.getChildTextTrim("listener-class"));
this.listenerList.add(listener);
}
}
/**
* 获取所有Filter
* @param webapps 根节点
*/
private void parseFilter(Element webapps){
List filters = webapps.getChildren("filter");
List mappings = webapps.getChildren("filter-mapping");
int count = filters.size();
int mcount = mappings.size();
for(int i=0;i<count;i++){
Filter_temp filter=new Filter_temp();
Element fele =(Element) filters.get(i);
filter.setName(fele.getChildTextTrim("filter-name"));
filter.setClassname(fele.getChildTextTrim("filter-class"));
List params = fele.getChildren("init-param");
int pcount = params.size();
List fps = new ArrayList();
for(int j =0;j<pcount;j++){
Element pe = (Element)params.get(j);
Param param = new Param();
param.setName(pe.getChildTextTrim("param-name"));
param.setValue(pe.getChildTextTrim("param-value"));
fps.add(param);
}
filter.setParams(fps);
List mapArr = new ArrayList();
for(int k=0;k<mcount;k++){
Element mapItem = (Element)mappings.get(k);
String mapName = mapItem.getChildTextTrim("filter-name");
if(mapName.equals(filter.getName())){
Element mappingurls = mapItem.getChild("url-pattern");
if(mappingurls==null){
Element cls = mapItem.getChild("servlet-name");
filter.getMappingClass().add(cls.getText());
}else{
mapArr.add(mappingurls.getText());
}
}
}
filter.setMapping(mapArr);
this.filterList.add(filter);
}
}
/**
* 获取所有Sevlet
* @param webapps 根节点
*/
private void parseServlet(Element webapps){
List ss = webapps.getChildren("servlet");
List sms = webapps.getChildren("servlet-mapping");
int scount = ss.size();
for(int i=0;i<scount;i++){
Servlet servlet = new Servlet();
Element se = (Element)ss.get(i);
servlet.setName(se.getChildTextTrim("servlet-name"));
servlet.setClassname(se.getChildTextTrim("servlet-class"));
List params = new ArrayList();
List elesp = se.getChildren("init-param");
for(Iterator iter = elesp.iterator();iter.hasNext();){
Element ele = (Element)iter.next();
Param param = new Param();
param.setName(ele.getChildTextTrim("param-name"));
param.setValue(ele.getChildTextTrim("param-value"));
params.add(param);
}
servlet.setParams(params);
String loadOn = se.getChildTextTrim("load-on-startup");
if(loadOn!=null&&!"".equals(loadOn)){
servlet.setStartSeq(loadOn);
}
for(Iterator iter = sms.iterator();iter.hasNext();){
Element mapping = (Element)iter.next();
String mname = mapping.getChildTextTrim("servlet-name");
if(mname.equals(servlet.getName())){
servlet.setMapping(mapping.getChildTextTrim("url-pattern"));
break;
}
}
this.servletMap.put(servlet.getName(),servlet);
}
}
/**
* 获取所有Mime
* @param webapps 根节点
*/
private void parseMimeMap(Element webapps){
List ms = webapps.getChildren("mime-mapping");
int mimeCount = ms.size();
for(int i=0;i<mimeCount;i++){
Element m = (Element)ms.get(i);
MimeType mt = new MimeType();
String ext = m.getChildTextTrim("extension");
mt.setExtension(ext);
mt.setMimetype(m.getChildTextTrim("mime-type"));
this.mimeMap.put(ext,mt);
}
}
/**
* 获取所有TagLib
* @param webapps 根节点
*/
private void parseTagLib(Element webapps){
List ms = webapps.getChildren("taglib");
int mimeCount = ms.size();
for(int i=0;i<mimeCount;i++){
Element m = (Element)ms.get(i);
Tld tld = new Tld();
String uri = m.getChildTextTrim("taglib-uri");
String lac = m.getChildTextTrim("taglib-location");
tld.setTldLocation(lac);
tld.setTlduri(uri);
this.tldMap.put(uri,tld);
}
}
/**
* 获取session-config
* @param webapps 根节点
*/
private void parseSession(Element webapps){
Element element=webapps.getChild("session-config");
String timeout=element.getChildTextTrim("session-timeout");
sc.setTimeout(timeout);
}
/**
* 配置文件比较方法
* @param newWebXml 目标web.xml配置文件
*/
public void Compare(WebXmlConfigImpl newWebXml){
compareListener(newWebXml);
compareFilter(newWebXml);
compareServlet(newWebXml);
compareTagLib(newWebXml);
compareMimeMap(newWebXml);
compareSession(newWebXml);
}
/**
* 比较listener
* @param newWebXml 目标web.xml配置文件
*/
public void compareListener(WebXmlConfigImpl newWebXml){
List srcList = this.listenerList;
List newList = newWebXml.listenerList;
int srcCount = srcList.size();
int newCount = newList.size();
for(int i=0;i<srcCount;i++){
Listener lis = (Listener)srcList.get(i);
String srcName = lis.getClassName();
boolean isExists=false;
Listener lis_p=null;
for(int j=0;j<newCount;j++){
lis_p = (Listener)newList.get(j);
String newName = lis_p.getClassName();
if(newName.equals(srcName)){
isExists=true;
}
}
if(!isExists){
System.out.println("<Listener>:"+srcName+"不存在目标文件中");
sbWeb.append("<Listener>:").append(srcName).append("不存在目标文件中").append("\r\n");
newWebNumber++;
}
}
for(int m=0;m<newCount;m++){
Listener lis_p=(Listener)newList.get(m);
String newName=lis_p.getClassName();
boolean isExists=false;
Listener lis=null;
for(int n=0;n<srcCount;n++){
lis=(Listener)srcList.get(n);
String srcName=lis.getClassName();
if(srcName.equals(newName)){
isExists=true;
}
}
if(!isExists){
System.out.println("<Listener>:"+newName+"不存在源文件中");
sbWeb.append("<Listener>:").append(newName).append("不存在源文件中").append("\r\n");
srcWebNumber++;
}
}
}
/**
* 比较filter
* @param newWebXml 目标web.xml配置文件
*/
public void compareFilter(WebXmlConfigImpl newWebXml){
List frList = this.filterList;
List frList_p = newWebXml.filterList;
int count_p = frList_p.size();
int count = frList.size();
for(int i=0;i<count;i++){
Filter_temp filter = (Filter_temp)frList.get(i);
String filterName = filter.getName();
Filter_temp filter_p=null;
boolean isExists = false;
for(int j=0;j<count_p;j++){
filter_p = (Filter_temp)frList_p.get(j);
String filterName_p = filter_p.getName();
if(filterName_p.equals(filterName)){
isExists = true;
compareFilter(filter,filter_p);
}
}
if(!isExists){
System.out.println("<Filter>:"+filterName+"不存在目标文件中");
sbWeb.append("<Filter>:").append(filterName).append("不存在目标文件中").append("\r\n");
newWebNumber++;
}
}
for(int m=0;m<count_p;m++){
Filter_temp filter_p = (Filter_temp)frList_p.get(m);
String filter_pName = filter_p.getName();
Filter_temp filter = null;
boolean isExists = false;
for(int n=0;n<count;n++){
filter = (Filter_temp)frList.get(n);
String filterName=filter.getName();
if(filterName.equals(filter_pName)){
isExists = true;
}
}
if(!isExists){
System.out.println("<Filter>:"+filter_pName+"不存在源文件中");
sbWeb.append("<Filter>:").append(filter_pName).append("不存在源文件中").append("\r\n");
srcWebNumber++;
}
}
}
/**
* 比较servlet
* @param newWebXml 目标web.xml配置文件
*/
public void compareServlet(WebXmlConfigImpl newWebXml){
Map smap = this.servletMap;
Map smap_p = newWebXml.servletMap;
Set srcEntrys = smap.entrySet();
Set newEntrys = smap_p.entrySet();
for(Iterator iter = srcEntrys.iterator();iter.hasNext();){
Entry entry = (Entry)iter.next();
String servletName =(String)entry.getKey();
//Servlet servlet_h=(Servlet)entry.getValue();
Servlet servlet_p = (Servlet)smap_p.get(servletName);
Servlet servlet = (Servlet)smap.get(servletName);
if(servlet_p==null){//如果目标文件中不存在该servlet标签则输出
System.out.println("<Servlet>:"+servletName+"不存在目标文件中");
sbWeb.append("<Servlet>:").append(servletName).append("不存在目标文件中").append("\r\n");
newWebNumber++;
}else{//如果目标文件存在该servlet标签则判断是否相同
compareServlet(servlet,servlet_p);
}
}
for(Iterator iter = newEntrys.iterator();iter.hasNext();){
Entry entry = (Entry)iter.next();
String servletName =(String)entry.getKey();
//Servlet servlet_h=(Servlet)entry.getValue();
Servlet servlet_p = (Servlet)smap.get(servletName);
if(servlet_p==null){//如果目标文件中不存在该servlet标签则输出
System.out.println("<Servlet>:"+servletName+"不存在源文件中");
sbWeb.append("<Servlet>:").append(servletName).append("不存在源文件中").append("\r\n");
srcWebNumber++;
}
}
}
/**
* 比较taglib
* @param newWebXml 目标web.xml配置文件
*/
public void compareTagLib(WebXmlConfigImpl newWebXml){
Map smap = this.tldMap;
Map smap_p = newWebXml.tldMap;
Set srcEntrys = smap.entrySet();
Set newEntrys =smap_p.entrySet();
for(Iterator iter = srcEntrys.iterator();iter.hasNext();){
Entry entry =(Entry)iter.next();
String tldName = (String)entry.getKey();
Tld tld_p = (Tld)smap_p.get(tldName);
Tld tld = (Tld)smap.get(tldName);
if(tld_p==null){
System.out.println("<TagLib>:"+tldName+"不存在目标文件中");
sbWeb.append("<TagLib>:").append(tldName).append("不存在目标文件中").append("\r\n");
newWebNumber++;
}else if(!tld_p.getTlduri().equals(tld.getTlduri())||!tld_p.getTldLocation().equals(tld.getTldLocation())){
System.out.println("<TagLib>"+tldName+"值不同");
sbWeb.append("<TagLib>:").append(tldName).append("值不同").append("\r\n");
differentWebNumber++;
}
}
for(Iterator iter=newEntrys.iterator();iter.hasNext();){
Entry entry=(Entry)iter.next();
String tld_pName =(String)entry.getKey();
Tld tld =(Tld)smap.get(tld_pName);
if(tld==null){
System.out.println("<TagLib>:"+tld_pName+"不存在源文件中");
sbWeb.append("<TagLib>:").append(tld_pName).append("不存在源文件中").append("\r\n");
srcWebNumber++;
}
}
}
/**
* 比较mime-mapping
* @param newWebXml 目标web.xml配置文件
*/
public void compareMimeMap(WebXmlConfigImpl newWebXml){
Map smap = this.mimeMap;
Map smap_p = newWebXml.mimeMap;
Set srcEntrys = smap.entrySet();
Set newEntrys = smap_p.entrySet();
for(Iterator iter = srcEntrys.iterator();iter.hasNext();){
Entry entry = (Entry)iter.next();
String mmname = (String)entry.getKey();
MimeType mm_p = (MimeType)smap_p.get(mmname);
MimeType mm = (MimeType)smap.get(mmname);
if(mm_p==null){
System.out.println("<Mime-mapping>:"+mmname+"不存在目标文件中");
sbWeb.append("<Mime-mapping>:").append(mmname).append("不存在目标文件中").append("\r\n");
newWebNumber++;
}else if(!mm_p.getExtension().equals(mm.getExtension())||!mm_p.getMimetype().equals(mm.getMimetype())){
System.out.println("<Mime-mapping>:"+mmname+"值不同");
sbWeb.append("<Mime-mapping>:").append(mmname).append("值不同").append("\r\n");
differentWebNumber++;
}
}
for(Iterator iter = newEntrys.iterator();iter.hasNext();){
Entry entry = (Entry)iter.next();
String mm_pname = (String)entry.getKey();
MimeType mm = (MimeType)smap.get(mm_pname);
if(mm==null){
System.out.println("<Mime-mapping>:"+mm_pname+"不存在源文件中");
sbWeb.append("<Mime-mapping>:").append(mm_pname).append("不存在源文件中").append("\r\n");
srcWebNumber++;
}
}
}
/**
* 比较session-config
* @param newWebXml 目标web.xml配置文件
*/
public void compareSession(WebXmlConfigImpl newWebXml){
String srcSession=this.sc.getTimeout();
String newSession=newWebXml.sc.getTimeout();
if(!srcSession.equals(newSession)){
System.out.print("<session-config>值不同");
sbWeb.append("<session-config>值不同").append("\r\n");
differentWebNumber++;
}
}
/**
* 详细比较每个servlet
* @param servlet 源servlet
* @param servlet_p 目标servlet
*/
public void compareServlet(Servlet servlet,Servlet servlet_p){
List srcList=servlet.getParams();
List newList=servlet_p.getParams();
String srcName=servlet.getName();
String newName=servlet_p.getName();
String srcClassName=servlet.getClassname();
String newClassName=servlet_p.getClassname();
String srcMapping=servlet.getMapping();
String newMapping=servlet_p.getMapping();
String srcStartSeq=servlet.getStartSeq();
String newStartSeq=servlet_p.getStartSeq();
if(!srcName.equals(newName)){
System.out.println("<Servlet>:"+servlet.getName()+"的属性<servlet-name>值不同");
sbWeb.append("<Servlet>:").append(servlet.getName()).append("的属性<servlet-name>值不同").append("\r\n");
differentWebNumber++;
}
if(!srcClassName.equals(newClassName)){
System.out.println("<Servlet>:"+servlet.getName()+"的属性<servlet-class>值不同");
sbWeb.append("<Servlet>:").append(servlet.getName()).append("的属性<servlet-class>值不同").append("\r\n");
differentWebNumber++;
}
if(null!=srcStartSeq&&null!=newStartSeq){
if(!srcStartSeq.equals(newStartSeq)){
System.out.println("<Servlet>:"+servlet.getName()+"的属性<load-on-startup>值不同");
sbWeb.append("<Servlet>:").append(servlet.getName()).append("的属性<load-on-startup>值不同").append("\r\n");
differentWebNumber++;
}
}
if(!srcMapping.equals(newMapping)){
System.out.println("<Servlet>:"+servlet.getName()+"的属性<url-pattern>值不同");
sbWeb.append("<Servlet>:").append(servlet.getName()).append("的属性<url-pattern>值不同").append("\r\n");
differentWebNumber++;
}
if(srcList.size()==newList.size()){
for(int i=0;i<srcList.size();i++){
Param srcParam=(Param)srcList.get(i);
String srcParamName=srcParam.getName();
String srcParamValue=srcParam.getValue();
Param newParam=(Param)newList.get(i);
String newParamName=newParam.getName();
String newParamValue=newParam.getValue();
if(!srcParamName.equals(newParamName)||!srcParamValue.equals(newParamValue)){
System.out.println("<Servlet>:"+servlet.getName()+"的属性<init-param>值不同");
sbWeb.append("<Servlet>:").append(servlet.getName()).append("的属性<init-param>值不同").append("\r\n");
differentWebNumber++;
}
}
}else{
System.out.println("<Servlet>:"+servlet.getName()+"的属性<init-param>值不同");
sbWeb.append("<Servlet>:").append(servlet.getName()).append("的属性<init-param>值不同").append("\r\n");
differentWebNumber++;
}
}
/**
* 详细比较每个filter
* @param filter 源filter
* @param filter_p 目标filter
*/
public void compareFilter(Filter_temp filter,Filter_temp filter_p){
List srcParamsList=filter.getParams();
List newParamsList=filter_p.getParams();
List srcMappingList=filter.getMapping();
List newMappingList=filter_p.getMapping();
List srcMappingClassList=filter.getMappingClass();
List newMappingClassList=filter_p.getMappingClass();
String srcFilterName=filter.getName();
String newFilterName=filter_p.getName();
String srcFilterClassName=filter.getClassname();
String newFilterClassName=filter_p.getClassname();
if(!srcFilterName.equals(newFilterName)){
System.out.println("<Filter>:"+filter.getName()+"的属性<filter-name>值不同");
sbWeb.append("<Filter>:").append(filter.getName()).append("的属性<filter-name>值不同").append("\r\n");
differentWebNumber++;
}
if(!srcFilterClassName.equals(newFilterClassName)){
System.out.println("<Filter>:"+filter.getName()+"的属性<filter-class>值不同");
sbWeb.append("<Filter>:").append(filter.getName()).append("的属性<filter-class>值不同").append("\r\n");
differentWebNumber++;
}
if(srcParamsList.size()==newParamsList.size()){
for(int i=0;i<srcParamsList.size();i++){
Param srcParam=(Param)srcParamsList.get(i);
String srcParamName=srcParam.getName();
String srcParamValue=srcParam.getValue();
Param newParam=(Param)newParamsList.get(i);
String newParamName=newParam.getName();
String newParamValue=newParam.getValue();
if(!srcParamName.equals(newParamName)||!srcParamValue.equals(newParamValue)){
System.out.println("<Filter>:"+filter.getName()+"的属性<init-param>值不同");
sbWeb.append("<Filter>:").append(filter.getName()).append("的属性<init-param>值不同").append("\r\n");
differentWebNumber++;
}
}
}else{
System.out.println("<Filter>:"+filter.getName()+"的属性<init-param>值不同");
sbWeb.append("<Filter>:").append(filter.getName()).append("的属性<init-param>值不同").append("\r\n");
differentWebNumber++;
}
if(srcMappingList.size()==newMappingList.size()){
for(int i=0;i<srcMappingList.size();i++){
String srcUrl=(String)srcMappingList.get(i);
String newUrl=(String)newMappingList.get(i);
if(!srcUrl.equals(newUrl)){
System.out.println("<Filter>:"+filter.getName()+"的属性<url-pattern>值不同");
sbWeb.append("<Filter>:").append(filter.getName()).append("的属性<url-pattern>值不同").append("\r\n");
differentWebNumber++;
}
}
}else{
System.out.println("<Filter>:"+filter.getName()+"的属性<url-pattern>值不同");
sbWeb.append("<Filter>:").append(filter.getName()).append("的属性<url-pattern>值不同").append("\r\n");
differentWebNumber++;
}
if(srcMappingClassList.size()==newMappingClassList.size()){
for(int i=0;i<srcMappingClassList.size();i++){
String srcServlet=(String)srcMappingClassList.get(i);
String newServlet=(String)newMappingClassList.get(i);
if(!srcServlet.equals(newServlet)){
System.out.println("<Filter>:"+filter.getName()+"的属性<servlet-name>值不同");
sbWeb.append("<Filter>:").append(filter.getName()).append("的属性<servlet-name>值不同").append("\r\n");
differentWebNumber++;
}
}
}else{
System.out.println("<Filter>:"+filter.getName()+"的属性<servlet-name>值不同");
sbWeb.append("<Filter>:").append(filter.getName()).append("的属性<servlet-name>值不同").append("\r\n");
differentWebNumber++;
}
}