init.XML文档
<?xml version="1.0" encoding="UTF-8"?>
<init package="com.oa.model"><!-- 组织机构管理 -->
<entity class= "Company"
name = "大学"
description = "塞上明珠"
call = "partyService.addParty">
<entity class="Department" name="教务处">
<entity class="Position" name="教务处处长">
<entity class="Person" name="张三" sex="男" tel="1111">
</entity>
</entity>
<entity class="Position" name="教务处副处长">
<entity class="Person" name="李四" sex="女" tel="1222">
</entity>
</entity>
</entity>
<entity class="Department" name="图书馆">
<entity class="Position" name="图书馆馆长">
<entity class="Person" name="王五" sex="女" tel="2222">
</entity>
<entity class="Person" name="赵六" sex="男" tel="2111">
</entity>
</entity>
</entity>
<entity class="Company" name="大学南校区"></entity>
</entity>
</init>
//解析方法
public void addInitData() {
try {
//解析init.xml文档
Document doc = new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(init.xml));
//得到根元素
Element root = doc.getRootElement();
//得到包名
String pkg = root.valueOf("@package");
//得到根元素下的entity集合
List<Element> entities = root.selectNodes("entity");
for(Iterator<Element> iter = entities.iterator() ; iter.hasNext();){
Element e = iter.next();
addEntity(e,pkg,null,null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void addEntity(Element e, String pkg, Object parent, String callString) {
try {
//处理当前Element
// 1. 要创建一个什么样类型的对象
//要创建类的全包名
String className = pkg + "." + e.attributeValue("class");
//根据类名创建实体对象
Object entity = Class.forName(className).newInstance();
//给实体对象当中的属性赋值
Iterator iter = e.attributeIterator();
while(iter.hasNext()){
Attribute attr = (Attribute)iter.next();
String propName = attr.getName();
//判断除了class和call属性的其它属性赋值
if(!"class".equals(propName) && !"call".equals(propName)){
String propValue = attr.getValue();
BeanUtils.copyProperty(entity, propName, propValue);
}
}
//给entity父实体属性赋值
BeanUtils.copyProperty(entity, "parent", parent);
// 2. 存储对象(调用哪一个Service的哪一个方法?)
String call = e.attributeValue("call");
if(call != null){
callString = call;
}
if(callString == null){
throw new RuntimeException("无法创建实体对象,调用方法未知!");
}
// 3. 调用相应的方法存储实体
String[] mesg = callString.split("\\.");
String serviceName = mesg[0];
String methodName = mesg[1];
//得到Service对象
Object serviceObject = factory.getBean(serviceName);
//得到要调用的Servce对象上的方法的反射类
for(Method m : serviceObject.getClass().getMethods()){
if(methodName.equals(m.getName())){
//调用这个方法
m.invoke(serviceObject, entity);
}
}
// 4. 考虑当前Element下有没有子元素
List<Element> subEntities = e.elements("entity");
for(Iterator<Element> itr = subEntities.iterator(); itr.hasNext();){
Element subElement = itr.next();
addEntity(subElement, pkg, entity, callString);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}