📄 classloader.js
字号:
// Description: js.lang.ClassLoader 类加载器,实现客户端的高速缓存
// Author: Changhua.Wan
// Version: 2004.03.06.01
_package("js.lang");
_import("js.lang.Object");
_import("js.io.UserData");
_import("js.net.Encoder");
function js.lang.ClassLoader() {
var cache = new function() {
// 在内存中创建2.1级Cache
var _memoryCache = new function() {
var _dict = new ActiveXObject("Scripting.Dictionary");
this.get = function(_name) {
if (!_dict.Exists(_name))
return null;
else
return _dict.Item(_name);
};
this.put = function(_name, _value) {
if (_dict.Exists(_name))
_dict.Item(_name) = _value;
else
_dict.Add(_name, _value);
};
this.remove = function(_name) {
if (_dict.Exists(_name)) _dict.Remove(_name);
};
};
// 在UserData中创建2.2级Cache
var _UserData = js.io.UserData; // 定义 js.io.UserData 类的引用
this.lastModified = null;
// UserData Cache 列表
var _dict = new ActiveXObject("Scripting.Dictionary");
this.getDataContext = function(_name) {
var _name = String(_name);
var userdata = null;
if (_dict.Exists(_name)) {
var userdata = _dict.Item(_name);
} else {
var userdata = _UserData.getInstance(_name);
if (userdata == null) {
_throw(0x0511, "JSVM/js.lang.ClassLoader.getDataContext(string): 执行异常{不能获得'"
+ _name
+ "' DataContext接口}"
);
}
_dict.Add(_name, userdata);
}
if (userdata != null) userdata.open();
return userdata;
};
this.removeDataContext = function(_name) {
_memoryCache.remove(_name);
if (_dict.Exists(_name)) _dict.Remove(_name);
};
this.getClassCode = function(_classname) {
var datacontext_name = "JSVM_ClassCache__" + _classname;
var code=_memoryCache.get(datacontext_name);
if (code != null)return code;
var _dtct = this.getDataContext(datacontext_name);
_dtct.load();
var lastmdate = _dtct.getStringValue("last-modified");
if (this.lastModified == null || lastmdate == null || this.lastModified > lastmdate) return null;
code = _dtct.getStringValue("code");
_dtct.close();
_memoryCache.put(datacontext_name, code);
return code;
};
this.putClassCode = function(_classname, _code, _over) {
var datacontext_name = "JSVM_ClassCache__" + _classname;
if (_over == false && _memoryCache.get(datacontext_name) != null) return;
_memoryCache.put(datacontext_name, _code);
var _dtct = this.getDataContext(datacontext_name);
_dtct.setStringValue("name", _classname);
_dtct.setStringValue("code", _code);
_dtct.setStringValue("last-modified", this.lastModified);
_dtct.save();
_dtct.close();
};
this.getPackageInfo = function(_packagename) {
var datacontext_name = "JSVM_PackageCache__" + _packagename;
var info = _memoryCache.get(datacontext_name);
if (info != null) return info;
var _dtct = this.getDataContext(datacontext_name);
_dtct.load();
var lastmdate = _dtct.getStringValue("last-modified");
if (this.lastModified == null || lastmdate == null || this.lastModified > lastmdate) return null;
info = _dtct.getStringValue("class-list");
_memoryCache.put(datacontext_name, info);
_dtct.close();
return info;
};
this.putPackageInfo = function(_packagename, _info) {
var datacontext_name = "JSVM_PackageCache__" + _packagename;
_memoryCache.put(datacontext_name, _info);
var _dtct = this.getDataContext(datacontext_name);
_dtct.setStringValue("name", _packagename);
_dtct.setStringValue("class-list", _info);
_dtct.setStringValue("last-modified", this.lastModified);
_dtct.save();
_dtct.close();
};
this.getLibInfo = function(_libname) {
var datacontext_name = "JSVM_LibCache__Info";
var _dtct = this.getDataContext(datacontext_name);
_dtct.load();
var _ver = _dtct.getStringValue(_libname + "_ver");
_dtct.close();
return _ver;
};
this.putLibInfo = function(_libname, _ver) {
var datacontext_name = "JSVM_LibCache__Info";
var _dtct = this.getDataContext(datacontext_name);
_dtct.load();
_dtct.setStringValue(_libname + "_ver", _ver);
_dtct.save();
_dtct.close();
};
};
// 初始化方法
this.initialize = function() {
var configurl = $js_classpath + "class-inf.xml";
var xmldom = new ActiveXObject("Microsoft.XMLDOM");
xmldom.async = false;
if (xmldom.load(configurl)) {
var root = xmldom.documentElement;
var ldnode = root.selectSingleNode("//last-modified");
if (ldnode != null) cache.lastModified = ldnode.getAttribute("date");
var alnodes = root.selectNodes("//auto-load/class[@name]");
for (var i = 0; i < alnodes.length; i++) {
var cls = alnodes.item(i).getAttribute("name");
if (cls != null && /^(\w)+(\.(\w)+)*$/.test(cls)) {
_import(cls);
} else {
_throw(0x0512,
"js.lang.ClassLoader/initialize(): 执行异常{auto-load:["
+ cls
+ "]非法}"
);
}
}
} else {
_throw(0x0513, "js.lang.ClassLoader/initialize(): 执行异常{class-info配置文件损坏}");
}
// -- 加载 lib-inf 配置
if (xmldom.load($js_libpath + "lib-inf.xml")) {
var root = xmldom.documentElement;
var refnodes = root.selectNodes("libRef");
for (var i = 0; i < refnodes.length; i++) {
var _node = refnodes.item(i);
var _name = _node.getAttribute("name");
var _async = _node.getAttribute("async");
var _ver = _node.getAttribute("version");
var _oldVer = cache.getLibInfo(_name);
if (_oldVer == null || _oldVer < _ver) {
cache.putLibInfo(_name, _ver);
this.loadLib(_name, _async);
}
}
}
};
var _getPackageName = function(_classname) {
var _packagename = "-";
var lidx = _classname.lastIndexOf(".");
if (lidx != -1) {
_packagename = _classname.substring(0, lidx);
}
return _packagename;
}
this.loadClass = function(_classname) {
if ($js_runMode == "debug")
return this.loadClassFormServer(_classname);
var code = cache.getClassCode(_classname);
if (code == null) {
code = this.loadClassFormServer(_classname);
if (code != null) cache.putClassCode(_classname, code);
}
return code;
};
this.loadPackage = function(_packagename) {
if ($js_runMode == "debug")
return this.loadPackageFormServer(_packagename);
var classlist = cache.getPackageInfo(_packagename);
if (classlist == null) {
classlist = this.loadPackageFormServer(_packagename);
if (classlist != null) cache.putPackageInfo(_packagename, classlist.toString());
}
return classlist;
};
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
this.loadClassFormServer = function(_classname) {
var _classpath = _classname.replace(/\./gi,"/");
_classpath = $js_classpath + _classpath + ".js";
xmlHttp.open("GET", _classpath, false);
xmlHttp.send();
if (xmlHttp.status == 200 || xmlHttp.status == 0) {
// 如果编码类型是 ASCII ,且含有中文必须进行编码
// 如果编码类型是 UNICODE,UTF-8 直接 return(xmlHttp.responseText) 即可
var _charset = js.net.Encoder.getCharset(xmlHttp.responseBody);
if (_charset == "ASCII")
return js.net.Encoder.ascToStr(xmlHttp.responseBody);
else
return xmlHttp.responseText;
} else {
_throw(0x0514,
"js.lang.ClassLoader/loadClass():不能加载 "
+ _classname
+ " 类资源 {HTTP-STATUS:"
+ xmlHttp.status
+ "}"
);
}
return null;
};
this.loadPackageFormServer = function(_packagename) {
var _packagepath = _packagename.replace(/\./gi, "/");
var _packagepath = $js_classpath + _packagepath + "/package.xml";
var xmlDom = new ActiveXObject("Microsoft.XMLDOM");
xmlDom.async = false;
if (xmlDom.load(_packagepath)) {
var classlist = new Array();
var root = xmlDom.documentElement;
var clsNodes = root.selectNodes("class");
for (var i = 0; i < clsNodes.length; i++) {
var clsName = clsNodes.item(i).getAttribute("name");
classlist[i] = clsName;
}
return classlist;
} else {
_throw(0x0515,
"js.lang.ClassLoader/loadPackageFormServer():"
+ _packagename
+ " 包时出错{package.xml 配置文件无法加载}"
);
}
};
this.loadLib = function(_name, _async) {
var xmlDom = new ActiveXObject("Microsoft.XMLDOM");
xmlDom.async = (_async == "true" && @_jscript_version >= 5.5)? true : false;
if (!xmlDom.async) {
if (xmlDom.load($js_libpath+_name)) {
this.loadClassFromPackageNode(null, xmlDom.documentElement);
} else {
_throw(0x0516,
"js.lang.ClassLoader/loadLib():"
+ _name
+ " 类库时解析出错{同步}"
);
}
} else {
var _self = this;
var _xmlDom = xmlDom;
xmlDom.onreadystatechange = function() {
if (_xmlDom.readyState != 4) return;
var root = _xmlDom.documentElement;
if (root != null) {
_self.loadClassFromPackageNode(null, root);
} else {
_throw(0x0517,
"js.lang.ClassLoader/loadLib():"
+ _name
+ " 类库时解析出错{异步}"
);
}
};
xmlDom.load($js_libpath + _name);
}
};
this.loadClassFromPackageNode = function(_parentname, _node) {
var _pname = (_parentname==null)? "" : (
((_parentname == "")? "" : (_parentname + ".")) + _node.getAttribute("name")
);
var _cnodes = _node.selectNodes("Class");
for (var i = 0; i < _cnodes.length; i++) {
var _cnode = _cnodes.item(i);
var _classname = (_pname == "") ? "" : (_pname + "." ) + _cnode.getAttribute("name");
var _code = _cnode.text;
cache.putClassCode(_classname, _code, false);
}
var _pnodes = _node.selectNodes("Package");
for (var i = 0; i < _pnodes.length; i++) {
var _pnode = _pnodes.item(i);
this.loadClassFromPackageNode(_pname, _pnode);
}
};
this.clearCache = function() {
// TODO
}
this.initialize();
}
var _p = js.lang.ClassLoader._extends("js.lang.Object");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -