Skip to content

Instantly share code, notes, and snippets.

@jetgeng
Created August 12, 2012 23:20
Show Gist options
  • Save jetgeng/3335274 to your computer and use it in GitHub Desktop.
Save jetgeng/3335274 to your computer and use it in GitHub Desktop.
parser spring-dm
# -*- coding: utf-8 -*-
'''
Created on Aug 11, 2012
@author: gengjet
'''
from xml.sax import make_parser, handler
class SuperBean():
'''
保存所有Bean的父亲
'''
def __init__(self, beanid, bundle):
self._id = beanid
self._bundle = bundle
class Bean(SuperBean):
'''
只是为<bean> 这个标签服务
'''
def __init__(self, bundle ,attrs):
self._id = attrs.get("id")
self._classname = attrs.get("class")
self._bundle = bundle
self.refs={}
def addProperty(self, atts):
'''
这里的ref,可能是services,和bean。这个有点小麻烦。
这里有两种情况,
1. atts 中包括 name和ref两项
1. atts 中只包括一项name,ref是在他的子节点中给出
我只要求出ref相关的类名就可以了。
'''
if atts["name"] != None :
self.refs[atts.get("name")] = atts.get("ref") if atts.get("ref") == None else ""
def resolve(self,beans,refs):
pass
def __str__ (self):
return "Bean (id= %s , bundle = %s , class=%s ) " \
%( self._id , self._bundle, self._classname )
class Service(Bean):
'''
发布出来的一个服务是一个服务,在这里 _classname,代表的是一个接口。
'''
def __init__(self, bundle ,attrs):
self._id = attrs.get(u"id")
self._bundle = bundle
self._classname = attrs.get(u"interface")
self._ref = attrs.get(u"ref")
def resolve(self,beans):
'''
获取ref代表的真正的类
'''
pass
def __str__ (self):
return "Services (id= %s , bundle = %s , interface=%s , refName = %s) " \
%( self._id , self._bundle, self._classname , self._ref)
class ServiceRef(Bean):
def __init__(self,attrs):
self._id = attrs["id"]
self._classname = attrs["interface"]
def __str__ (self):
return "ServiceRef (id= %s , bundle = %s , interface=%s ) " \
%( self._id , self._bundle, self._classname )
class BeanParser(handler.ContentHandler):
'''
就是一个简单的Xml解析解析器。获取其中的关于Service的信息。
'''
def __init__(self,bundle):
'''
Constructor
'''
self._beans = {}
self._services={}
self._refs = {}
self._bundle = bundle
def startElement(self,name , attrs):
if u'osgi:service' == name :
service = Service('myBundle', attrs)
self._services[service._id] = service
print "get a services %s" % service
elif u'bean' == name :
self.currentBean = Bean(self._bundle , attrs)
elif u'property' == name :
self.currentPropertyName = attrs["name"]
self.currentBean.addProperty(attrs)
elif u'ref' == name :
if self.currentBean != None and self.currentPropertyName != None :
self.currentBean.addProperty({"name":self.currentPropertyName,"ref":attrs["bean"]})
print "add property %s to Bean %s" % (self.currentPropertyName, self.currentBean)
elif u'osgi:reference' == name :
osgiReference = ServiceRef(self._bundle,attrs)
self._refs[osgiReference._id] = osgiReference
print "handle bean interface is : %s" % attrs.get("interface")
#print name ,attrs
def endElement(self, name):
if u'bean' == name and self.currentBean != None:
self._beans[self.currentBean._id] = self.currentBean
self.currentBean = None
elif u'property' == name :
self.currentPropertyName = None
print "add bean id is : %s" % self.currentBean
handler.ContentHandler.endElement(self, name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment