`
uule
  • 浏览: 6359244 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

XML缓存工具类WebserviceXml

 
阅读更多

实现每次代理时,将服务对应的XML Node数据webservice节点写入webservices.xml中。

具体方法是将整个XML提取为一个XML操作工具类WebserviceXml,根节点下的每个子节点抽象为NODE对象WebserviceNode,缓存WebserviceInfoCache操作XML类,XML类中操作NODE元素对象。

 

webservices.xml:

<?xml version="1.0" encoding="UTF-8"?>

<webservices xmlns="http://ws.test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="webservices.xsd">  
  <webservice wsname="ws1" wsversion=""> 
    <wsdlurl>http://localhost:8888/ws1?wsdl</wsdlurl> 
  </webservice>  
  <webservice wsname="ws2"> 
    <wsdlurl>http://localhost:8888/ws2?wsdl</wsdlurl> 
  </webservice>  
  <webservice wsname="ws3" wsversion="v1"> 
    <wsdlurl>http://localhost:8888/ws3?wsdl</wsdlurl> 
  </webservice>  
  <webservice wsname="srv4"> 
    <wsdlurl>http://localhost:8889/ws4?wsdl</wsdlurl> 
  </webservice>  
  <webservice wsname="ESB_YS_YS_InquiryMachineInfoSrv">
    <wsdlurl>http://10.204.104.87:8888/ESB_YS_YS_InquiryMachineInfoSrv/ESBYSYSInquiryMachineInfoSrv?wsdl</wsdlurl>
  </webservice>
</webservices>

 webservices.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://ws.test.com" 
	targetNamespace="http://ws.test.com" 
	xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	elementFormDefault="qualified" 
	attributeFormDefault="unqualified">
	<!-- 简易元素的定义 -->
	<xs:element name="wsdlurl" type="xs:string"/>
	
	<!-- 复合元素的定义 -->
	<xs:element name="webservice">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="wsdlurl"/>
			</xs:sequence>
			<xs:attribute name="wsname" type="xs:string" use="required"/>
			<xs:attribute name="wsversion" type="xs:string"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="webservices">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="webservice" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

 这两个文件放在JBOSS的D:\jboss-5.1.0.GA\server\default\conf\wsconfig路径下,wsconfig为自增文件夹。

 

WebserviceNode节点MODEL类:

/**
 * 对应webservices.xml中的webservice节点
 * 
 *
 */
public class WebserviceNode {

	public WebserviceNode() {
		super();
	}

	public WebserviceNode(String wsName, String wsVersion, String wsdlUrl) {
		super();
		this.wsName = wsName;
		this.wsVersion = wsVersion;
		this.wsdlUrl = wsdlUrl;
	}

	private String wsName;
	
	private String wsVersion;
	
	private String wsdlUrl;
	
	
	public boolean hasVersionInfo(){
		return StringUtil.isNotEmpty(getWsVersion());
	}
	
	public String getWsName() {
		return wsName;
	}

	public void setWsName(String wsName) {
		if(wsName != null){
			this.wsName = wsName.trim();
		}
	}

	public String getWsVersion() {
		return wsVersion;
	}

	public void setWsVersion(String wsVersion) {
		if(wsVersion != null){
			this.wsVersion = wsVersion.trim();
		}
	}

	public String getWsdlUrl() {
		return wsdlUrl;
	}

	public void setWsdlUrl(String wsdlUrl) {
		if(wsdlUrl != null){
			this.wsdlUrl = wsdlUrl;
		}
	}

	@Override
	public String toString() {
		return "WebserviceInfo [wsName=" + wsName + (hasVersionInfo() ? ", wsVersion=" + wsVersion : "")
				+ ", wsdlUrl=" + wsdlUrl + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((wsName == null) ? 0 : wsName.hashCode());
		result = prime * result
				+ ((wsVersion == null) ? 0 : wsVersion.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		WebserviceNode other = (WebserviceNode) obj;
		if (wsName == null) {
			if (other.wsName != null)
				return false;
		} else if (!wsName.equals(other.wsName))
			return false;
		if (wsVersion == null) {
			if (other.wsVersion != null)
				return false;
		} else if (!wsVersion.equals(other.wsVersion))
			return false;
		return true;
	}
	
	
}

 

 

WebserviceXml类:

(包含Main测试方法)

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * 作为webservices.xml文件的抽象类
 * schema 参考webservices.xsd
 */
public class WebserviceXml {

	private final static String PATH;
	
	static{
		PATH = System.getProperty("jboss.server.home.dir") + "/conf/wsconfig/webservices.xml";
		
	
	}
	
	
	private Document doc = null;
	
	private List<WebserviceNode> wis = new ArrayList<WebserviceNode>();
	
	public WebserviceXml() {
		super();
		load();
	}
	
	/**
	 * 从硬盘加载
	 */
	@SuppressWarnings("unchecked")
	private void load(){
		// 从xml中加载数据		
		SAXReader sr = new SAXReader();
		File xml = new File(PATH);
		try {
			if(xml.exists() && xml.isFile()){
				doc = sr.read(xml);
			}else{
				System.err.println("'" + PATH + "' is Not Exists...");
			}
		} catch (DocumentException e) {
			System.err.println("Load '" + PATH + "' is Failed...");
			e.printStackTrace();
		}
		if(doc != null){
			Element root = doc.getRootElement();
			List<Element> elementList = root.elements();
	        for (Element e : elementList) { 
	        	WebserviceNode wi = new WebserviceNode();
	        	wi.setWsName(e.attributeValue("wsname"));
	        	wi.setWsVersion(e.attributeValue("wsversion"));
	        	wi.setWsdlUrl(e.elementText("wsdlurl"));
	        	
	        	wis.add(wi);
	        }
		}
	}
	
	/**
	 * 添加或更新多个webservice子节点
	 * @param wi 封装的服务信息们
	 */
	public synchronized void addOrUpdate(List<WebserviceNode> addWis){
		if(doc != null){
			Element root = doc.getRootElement();
			
			for(WebserviceNode wi : addWis){
				addOrUpdateWebservice(wi, root);
			}
			
			save();
		}
	}

	/**
	 * 添加或更新单个webservice子节点
	 * @param wi 封装的服务信息
	 */
	public synchronized void addOrUpdate(WebserviceNode wi) {
		if(doc != null){
			Element root = doc.getRootElement();
			
			addOrUpdateWebservice(wi, root);
			
			save();
		}
	}

	/**
	 * 在指定的节点上添加webservice子节点
	 * 
	 * @param wi 封装的服务信息
	 * @param root root节点
	 */
	private void addOrUpdateWebservice(WebserviceNode wi, Element root) {
		removeWebservices(wi, root);
		
		addOrUpdateWebserviceElement(wi, root);
		
		wis.add(wi);
	}

	/**
	 * 查找匹配的webservice元素
	 * 
	 * @param wi
	 * @param root
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private List<Element> findWebserviceElements(WebserviceNode wi, Element root) {
		Map<String, String> ns = new HashMap<String, String>();
		ns.put("vis", "http://ws.vispractice.com");
		
		String xpath = "/vis:webservices/vis:webservice[@wsname='"+ wi.getWsName() + "'" + (wi.hasVersionInfo() ? " and @wsversion='" + wi.getWsVersion() + "'" : " and (not(@wsversion) or normalize-space(@wsversion)='')") + "]";
		XPath x = root.createXPath(xpath);
		x.setNamespaceURIs(ns);
		
		//System.out.println(xpath);
		
		List<Element> es = x.selectNodes(root);
		return es;
	}

	/**
	 * 在指定的节点上添加webservice子节点(xml document)
	 * 
	 * @param wi
	 * @param root
	 */
	private void addOrUpdateWebserviceElement(WebserviceNode wi, Element root) {
		Element ws = root.addElement("webservice");
		ws.addAttribute("wsname", wi.getWsName());
		if(wi.hasVersionInfo()){
			ws.addAttribute("wsversion", wi.getWsVersion());
		}
		ws.addElement("wsdlurl").setText(wi.getWsdlUrl());
	}
	
	/**
	 * 保存至硬盘
	 */
	private void save() {
		// 将document保存至硬盘
		OutputFormat format = OutputFormat.createPrettyPrint();
		try {
			XMLWriter writer = new XMLWriter(new FileWriter(PATH), format);
			writer.write(doc);
			writer.close();
		} catch (IOException e) {
			System.err.println("Persist '" + PATH + "' is Failed...");
			e.printStackTrace();
		}
	}
	
	/**
	 * 返回webservice子节点清单
	 * @return
	 */
	public List<WebserviceNode> get(){
		
		return wis;
	}

	/**
	 * 删除指定的webservice节点
	 * 
	 * @param wis
	 */
	public void remove(List<WebserviceNode> rmWis){
		// 删除指定的webservice节点
		Element root = doc.getRootElement();
		for(WebserviceNode wi : rmWis){
			removeWebservices(wi, root);
		}
		
		save();
	}
	
	private void removeWebservices(WebserviceNode wi, Element root) {
		List<Element> es = findWebserviceElements(wi, root);
		
		if(es.size() > 0){
			// 删除doc中的元素
			for(Element e : es){
				root.remove(e);
			}
			// 删除集合中的元素
			Iterator<WebserviceNode> wiIterator = wis.iterator();
			while(wiIterator.hasNext()){  
				WebserviceNode i = wiIterator.next();  
				if(i.equals(wi)){
					wiIterator.remove();
				}
			}  
		}
	}
	
	/**
	 * 测试使用,注意把path修改成本地路径
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		WebserviceXml wx = new WebserviceXml();
		for(WebserviceNode wi : wx.get()){
			System.out.println(wi);
		}
		
		/* == add test == 
		WebserviceNode wi = new WebserviceNode();
		wi.setWsName(" srv5 ");
		wi.setWsVersion("v3.2");
		wi.setWsdlUrl("http://localhost:8888/ws4?wsdl");
		WebserviceNode wi2 = new WebserviceNode("srv4", null, "http://localhost:8889/ws4?wsdl");
		
		List<WebserviceNode> twis = new ArrayList<WebserviceNode>();
		twis.add(wi);
		twis.add(wi2);
		
		wx.addOrUpdate(twis);
		*/
		
		/* == remove test == */
		WebserviceNode wi3 = new WebserviceNode();
		wi3.setWsName(" srv5 ");
		wi3.setWsVersion("v3.2");
		List<WebserviceNode> twis2 = new ArrayList<WebserviceNode>();
		twis2.add(wi3);
		wx.remove(twis2);
		
	}
	
}

  

缓存类WebserviceInfoCache:

 

import java.util.HashMap;
import java.util.List;

/**
 * 服务信息缓存
 */
public class WebserviceInfoCache {

	/**
	 * 存储WebserviceInfo信息
	 * key:目前为wsname,启用wsversion后则使用wsname+"_"+wsversion
	 * value:WebserviceInfo对象
	 */
	private static HashMap<String, WebserviceNode> cache = new HashMap<String, WebserviceNode>();
	
	private static WebserviceXml wx;
	
	/**
	 * 调用WebserviceXml填充cache属性
	 */
	static{
		load();
	}
	
	private static void load(){
		// 调用WebserviceXml填充cache属性
		wx = new WebserviceXml();
		List<WebserviceNode> wis = wx.get();
		for(WebserviceNode wi : wis){
			cache.put(buildKey(wi), wi);
		}
	}
	
	/**
	 * 根据封装的服务信息创建key
	 * @param wi
	 * @return
	 */
	private static String buildKey(WebserviceNode wi) {
		StringBuilder key = new StringBuilder();
		if(wi != null && wi.getWsName() != null){
			key.append(wi.getWsName());
			if(wi.hasVersionInfo()){
				key.append("_").append(wi.getWsVersion().trim());
			}
		}
		return key.toString();
	}

	/**
	 * 通过wsname或wsname+"_"+wsversion获取wsdlurl信息
	 * @param wi 封装的服务信息
	 * @return wsdlurl信息,如果没有查找到缓存的信息,则返回null
	 */
	public static String getWebserviceWsdlUrl(WebserviceNode wi){
		WebserviceNode cc = cache.get(buildKey(wi));
		if(cc != null){
			return cc.getWsdlUrl();
		}
		return null;
	}
	
	/**
	 * 刷新缓存
	 */
	public static void refresh(){
		wx = null;
		cache = new HashMap<String, WebserviceNode>();
		load();
	}

	/**
	 * 添加或更新单个wsdlurl
	 * @param wi 封装的服务信息
	 */
	public static void addOrUpdateWebserviceInfo(WebserviceNode wi){
		// 添加单个wsdlurl
		cache.put(buildKey(wi), wi);
		wx.addOrUpdate(wi);
	}
	
	/**
	 * 添加或更新多个wsdlurl
	 * @param addWis 封装的服务信息们
	 */
	public static void addOrUpdateWebserviceInfo(List<WebserviceNode> addWis){
		// 添加多个wsdlurl
		for(WebserviceNode wi : addWis){
			cache.put(buildKey(wi), wi);
		}
		wx.addOrUpdate(addWis);
	}
	
	public static void removeWebserviceInfo(List<WebserviceNode> rmWis){
		wx.remove(rmWis);
	}
}

 

 。。。 

 

 

 

 

 

分享到:
评论

相关推荐

    xml解析工具类

    本教程将详细介绍一个名为"WXML"的XML解析工具类,该工具类能便捷地将XML数据转换为Java对象,从而简化开发流程。 首先,XML解析分为两种主要方式:DOM(Document Object Model)和SAX(Simple API for XML)。DOM...

    XML读写工具类

    本人没分了,特别来分享一下,通用的XML读写工具类,同志们下下绝对不后悔

    java一键xml转map,一键map转xml工具类

    本文将详细讲解如何使用Java实现XML到Map以及Map到XML的一键转换,并介绍一个已封装好的工具类`EasyXmlUtil`。 首先,XML到Map的转换涉及到XML的解析。在Java中,我们可以使用`javax.xml.parsers....

    json与xml互相转换工具类

    json与xml互相转换工具类

    微信公众号支付签名生成工具类和xml转换工具类和双向验证请求工具类

    微信公众号支付签名生成工具类和xml和map转换工具类和双向验证请求工具类

    Android xml 解析工具类

    Android XML 解析工具类 Android XML 解析工具类是一个功能强大且实用的工具类,提供了多种方法来解析 XML 文档。该工具类提供了四种方法来获取 XML 节点的内容,分别是 getMarkString、getMarkString、...

    XmlUtils.java XML解析工具类

    XML解析工具类

    asp xml 缓存类

    2. 缓存类的实现原理:该缓存类通过首先检查是否存在一个XML文件来决定是直接从缓存中读取数据还是从数据库中获取数据。如果缓存文件不存在或者已经过期,则从数据库中读取数据,并更新缓存。 3. 文件缓存的时间...

    java的xml和json相互转换工具类,亲测直接用

    本篇文章将详细介绍Java中如何实现XML和JSON的相互转换,并提供一个名为`XmlToJson.java`的工具类作为参考。 首先,XML是一种结构化的数据表示方式,它以树形结构存储数据,易于人类阅读和编写,同时也易于机器解析...

    xml与实体类转换工具

    本文将详细介绍如何使用工具类进行XML与实体类的转换,并探讨相关依赖和实现方法。 首先,XML转换为Java实体类的基本原理是通过解析XML文档,创建对应的Java对象。Java中常用的库有JAXB(Java Architecture for XML...

    一次代码重构之旅-快速读写xml文件工具类封装

    在描述中提到的博客文章“一次代码重构之旅-快速读写xml文件工具类封装”,作者分享了如何通过Java进行XML操作的优化,将原始的XML处理代码整合到一个工具类中,提供简洁易用的API。在阅读该博客文章的过程中,我们...

    java XML 和json 转换工具类

    java XML 和json 转换工具类 java XML 和json 转换工具类java XML 和json 转换工具类 java XML 和json 转换工具类java XML 和json 转换工具类 java XML 和json 转换工具类java XML 和json 转换工具类 java XML 和...

    C# 造作XML文件工具类

    这是一个C#操作XML文件的工具类,基本上你要用的都给你写好了,直接使用

    Xml和Json互转工具类

    本实例主要是通过json-libjar包中的工具类进行操作,简单实现了xml字符串和json字符串之间的转化,xml文件和json文件的转化。而且还兼容jsonObject和jsonArray两种格式,自己摸索,记录一下以便学习。

    java通用解析XML工具类

    本文将详细介绍如何创建一个Java通用的XML解析工具类,以便于在项目中复用和简化XML处理。 首先,我们来看DOM解析方式。DOM解析器会将整个XML文档加载到内存中,形成一棵树形结构,便于对XML进行随机访问。以下是一...

    java的xml和json相互转换工具类,直接用

    实现的一个简单的基于java 的,可以在xml和json之间相互转换的工具类,因为实在没有积分了,所以要点积分,希望理解~

    xml文件的配置读取工具类

    这些给定的文件名表明它们是Java编程语言中的工具类,用于处理XML配置文件的读取和管理。以下是对这些类可能包含的功能的详细解释: 1. **PortalConfig.java**:这个类可能专门用于处理与门户应用相关的配置信息。...

    java xml-repair修复工具类

    Java XML-repair修复工具类是Java编程中处理XML文档时的一种实用工具,它主要用于修复XML文件的格式问题,确保XML文档符合W3C标准,从而能够被正确解析和处理。XML(eXtensible Markup Language)是一种用于标记数据...

Global site tag (gtag.js) - Google Analytics