ML文件?我们可以使用一个基于用于创建不同的类型的DOM组件的方法的工厂;然而,这将创建过多的“工场”组件,并且你可能需要添加新的"工场"组件作为你的实体模型扩展。我们需要的是一个可以使用实体局部对象,引导容器管理关系和创建动态DOM构架的公用程序。这个公用程序将负责在双向关系中循环引用,以避免无限的循环和深入导航关系元素。
使用CMP2和XML处理动态数值对象(2)
时间:2010-12-21
接下来我们将演示一个可以提供这个功能的公用程序类。
package ws.business.service.util;
导入JAXP类。
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
导入DOM类
import org.w3c.dom.Document;
import org.w3c.dom.Element;
导入EJB类
import javax.ejb.EJBLocalObject;
导入Collection类。
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
导入bean内省类。<0}
import java.beans.Introspector;
import java.beans.BeanInfo;
import java.beans.PropertyDescriptor;
import java.beans.IntrospectionException;
导入reflection类
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
public class DOMGenerator {
生成的文件
private Document doc;
用户定义的深度∶
private int drillDownDepth;
存储循环引用的私有实例变量∶
private ArrayList _circularRef = new ArrayList();
存储当前深度的私有实例变量∶
private int _currentDepth;
方法getEJBLocalHome,getLocalHandle,getClass和getPrimaryKey不必
被处理。
private static String RESERVED =
"EJBLocalHome^localHandle^class^primaryKey";
public DOMGenerator(String docElementName, int drillDownDepth) {
try {
使用标准JAXP调用来创建一个DOM并把它存储为一个实例变量。
DocumentBuilderFactory fact =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fact.newDocumentBuilder();
doc = builder.newDocument();
}catch(ParserConfigurationException ex) {
throw new RuntimeChainedException(ex);
}
存储drilldown深度。
this.drillDownDepth = drillDownDepth;
以用户定义的名称创建文件元素。
doc.appendChild(doc.createElement(docElementName));
}
创建传递DOM的局部引用的方法。
public Document getDOM(EJBLocalObject local) {
try {
调用把容器管理持久性与关系域填充到元素中以便传递局部引用的方
法。
populateElement(doc.getDocumentElement(), local);
返回DOM。
return doc;
}catch(IntrospectionException ex) {
throw new RuntimeException(ex.getMessage());
}catch(IllegalAccessException ex) {
throw new RuntimeException(ex.getMessage());
}catch(InvocationTargetException ex) {
throw new RuntimeException(ex.getMessage());
}
}
private void populateElement(Element parent, EJBLocalObject local)
throws
IntrospectionException, IllegalAccessException,
InvocationTargetException
{
把当前的局部引用添加到连接引用列表中。
_circularRef.add(local);
增加当前的drilldown深度。
_currentDepth++;
取得当前的局部引用的bean组件信息。
BeanInfo info = Introspector.getBeanInfo(local.getClass());
取得属性描述信息列表并重复数组。
PropertyDescriptor properties[] = info.getPropertyDescriptors();
|