package com.browsesoft;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.rmi.server.UnicastRemoteObject;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.aote.entity.EntityType;
import com.aote.entity.EntityTypeFactory;
import com.aote.util.ObjectHelper;
import com.aote.util.ThreadLocals;
import com.browsesoft.baseadapter.BasicEntity;
import com.browsesoft.baseadapter.SimpleEntity;
import com.browsesoft.dbtools.Complete;
import com.browsesoft.dbtools.DBTools;
import com.browsesoft.htmlcomponent.HTMLPage;
import com.browsesoft.oa.EncryptMachine;
import com.browsesoft.oa.GetEncryptMachineTool;
import com.browsesoft.resource.Resource;
import com.browsesoft.user.Organization;
import com.browsesoft.user.Role;
import com.browsesoft.user.User;
/**
* 对象管理器,负责装载所有的对象,查找所有的对象
*/
public class EntityManager extends UnicastRemoteObject implements Manager,
Serializable, EntityManagerRMI {
/**
*
*/
private static final long serialVersionUID = 8687688515346497348L;
/**
* 存放对象的链表
*/
public LinkedList objects = new LinkedList();
/**
* 每个请求保存一个对象缓存,以便解决内存与数据库不一致的问题,并部分保证性能。
*/
// private Map pageManagers = new HashMap();
/**
* 存放类名与表名的对应关系
*/
private Map classNameAndTableNames = new HashMap();
/**
* 存放在导入旧系统对象时,需要事后处理的对象
*/
private Collection completes = new LinkedList();
/**
* 管理器自己
*/
private static EntityManager self;
public EntityManager() throws Exception {
self = this;
}
/**
* 根据属性文件转载所有的对象
*/
public void load() throws Exception {
System.out.println("begin VerifyLicence");
// 校验licence
// if (!VerifyLicence.verify("licence.xml") ||
// !Certificate.certificate()) {
// System.out.println("invalid licence");
// return;
// }
// 取得文档对象
Document doc = (Document) PropertiesService.getDocument();
// 取得对象列表
NodeList list = doc.getElementsByTagName("entity");
// 取得实体
System.out.println("objectmanager length:" + list.getLength());
Node tag = list.item(0);
// 取得节点列表
NodeList children = tag.getChildNodes();
System.out.println("children length:" + children.getLength());
for (int i = 0; i < children.getLength(); i++) {
// 判断节点的类型是否是元素节点
if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {
// 取出子节点元素
Element child = (Element) children.item(i);
System.out.println("child node element" + child.toString());
// 创建对象
createObject(child);
}
}
// 建立关系
createRelations();
}
/**
* 实体之间创建关系
*/
private void createRelations() {
// 将对象链表转换成迭代器
Iterator it = objects.iterator();
while (it.hasNext()) {
// 实体之间创建关系
((Entity) it.next()).createRelation();
}
}
/**
* 根据登录名称得到用户
*
* @param username
* @return
*/
public synchronized SimpleEntity getUserForLoginName(String username)
throws Exception {
SimpleEntity se = null;
LinkedList list = this.getObjects(
"com.browsesoft.baseadapter.SimpleEntity", "ename", username);
if (list.size() > 0) {
se = (SimpleEntity) list.get(0);
}
return se;
}
/**
* 根据ID获取对象
*
* @return Object
*/
public synchronized Object getObject(String id) {
// 将对象链表转换成迭代器
Iterator iterator = objects.iterator();
while (iterator.hasNext()) {
// 取出每个尸实体
Entity entity = (Entity) iterator.next();
try {
// 判断是否是要得实体,是则返回
if (entity.getID().equals(id)) {
return entity;
}
} catch (Exception e) {
throw new RuntimeException(entity.getAttributes().toString());
}
}
return null;
}
/**
* 根据属性名=属性值对查找,在常驻对象中查找
*
* @param className
* 要查找的对象类型
* @param hashtable
* 属性名=属性值对 return 找到的对象列表
*/
public synchronized LinkedList getObjectsInResident(String className,
Hashtable ht) {
try {
LinkedList list = new LinkedList();
// 将链表转换成迭代器
Iterator it = objects.iterator();
while (it.hasNext()) {
// 取出实体
Entity entity = (Entity) it.next();
// 判断是否是要的实体
if (Class.forName(className).isInstance(entity)) {
// 取出实体的属性命和属性值判断和登录名,密码是否相符
if (isSame(entity, ht)) {
list.add(entity);
}
}
}
return list;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 根据属性名=属性值对查找
*
* @param className
* 要查找的对象类型
* @param hashtable
* 属性名=属性值对 return 找到的对象列表
*/
public synchronized LinkedList getObjects(String className, Hashtable ht)
throws Exception {
LinkedList list = new LinkedList();
// 将链表转换成迭代器
Iterator it = objects.iterator();
while (it.hasNext()) {
// 取出实体
Entity entity = (Entity) it.next();
// 判断是否是要的实体
if (Class.forName(className).isInstance(entity)) {
// 取出实体的属性命和属性值判断和登录名,密码是否相符
if (isSame(entity, ht)) {
list.add(entity);
}
}
}
// 根据类名得到所有要延迟加载的表名
Iterator iter = EntityTypeFactory.getInstance()
.getTableNamesByClassName(className);
// 如果有要延迟加载的表
if (iter.hasNext()) {
list.addAll(this.getObject(iter, className, ht));
}
// 返回迭代器
return list;
}
/**
* 根据Map条件,找实体,如果实体没有加载,根据element提供的信息加载
*/
public List getEntities(String entityType, Map ht, Element element) {
// 如果得不到实体描述
if (!EntityTypeFactory.getInstance().contains(entityType)) {
// 根据元素加载对象
String table = element.getAttribute("tablename");
String className = element.getAttribute("model");
String types = element.getAttribute("entitytype");
String lazy = element.getAttribute("isLazy");
this.createObject(element, table, className, types, lazy);
}
return this.getEntities(entityType, new Hashtable(ht));
}
/**
* 根据单一条件,找实体,如果实体没有加载,根据element提供的信息加载
*/
public List getEntities(String entityType, String name, String value,
Element element) {
Map ht = new HashMap();
ht.put(name, value);
return this.getEntities(entityType, ht, element);
}
/**
* 找实体的所有对象,如果实体没有加载,根据element提供的信息加载
*/
public List getEntities(String entityType, Element element) {
Map ht = new HashMap();
return this.getEntities(entityType, ht, element);
}
/**
* 根据属性名=属性值对查找
*
* @param className
* 要查找的对象类型
* @param hashtable
* 属性名=属性值对 return 找到的对象列表
*/
public LinkedList getEntities(String entityType, Hashtable ht) {
LinkedList list = new LinkedList();
// 将链表转换成迭代器
Iterator it = objects.iterator();
while (it.hasNext()) {
// 取出实体
Entity entity = (Entity) it.next();
// 判断是否是要的实体
if (entity instanceof BasicEntity) {
String type = ((BasicEntity) entity).getEntityType();
// 取出实体的属性命和属性值判断和登录名,密码是否相符
if (type != null && type.equals(entityType)
&& isSame(entity, ht)) {
list.add(entity);
}
}
}
return list;
}
/**
* 取得部分属�