Created
August 12, 2012 23:20
-
-
Save jetgeng/3335274 to your computer and use it in GitHub Desktop.
parser spring-dm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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