!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.bearcat=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o * MIT Licensed */ var Pointcut = require('./pointcut'); /** * Advisor constructor function. * * @api public */ var Advisor = function() { this.pointcut = null; this.beanName = null; this.runtime = null; this.advice = null; this.order = null; this.bean = null; } /** * Advisor set pointcut. * * @param {Object} pointcut pointcut object * @api public */ Advisor.prototype.setPointcut = function(pointcut) { if (!pointcut) { return; } var p = new Pointcut(); p.setExpression(pointcut); this.pointcut = p; } /** * Advisor get pointcut. * * @return {Object} pointcut object * @api public */ Advisor.prototype.getPointcut = function() { return this.pointcut; } /** * Advisor set advice function name. * * @param {String} advice advice function name * @api public */ Advisor.prototype.setAdvice = function(advice) { this.advice = advice; } /** * Advisor get advice function name. * * @return {String} advice function name * @api public */ Advisor.prototype.getAdvice = function() { return this.advice; } /** * Advisor set bean name. * * @param {String} beanName bean name * @api public */ Advisor.prototype.setBeanName = function(beanName) { this.beanName = beanName; } /** * Advisor get bean name. * * @return {String} bean name * @api public */ Advisor.prototype.getBeanName = function() { return this.beanName; } /** * Advisor set aspect bean. * * @param {Object} bean aspect bean * @api public */ Advisor.prototype.setBean = function(bean) { this.bean = bean; } /** * Advisor get aspect bean. * * @return {Object} aspect bean * @api public */ Advisor.prototype.getBean = function() { return this.bean; } /** * Advisor set advisor chain order. * * @param {Number} order order number * @api public */ Advisor.prototype.setOrder = function(order) { this.order = order; } /** * Advisor get advisor chain order. * * @return {Number} order number * @api public */ Advisor.prototype.getOrder = function() { return this.order; } /** * Advisor set if advisor is runtime. * * @param {Boolean} runtime runtime true|false * @api public */ Advisor.prototype.setRuntime = function(runtime) { this.runtime = runtime; } /** * Advisor get if advisor is runtime. * * @return {Boolean} runtime true|false * @api public */ Advisor.prototype.isRuntime = function() { return this.runtime; } /** * Advisor do parse pointcut,advice. * * @api public */ Advisor.prototype.parse = function() { this.pointcut.parse(); } module.exports = Advisor; },{"./pointcut":9}],3:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat Aspect * Copyright(c) 2015 fantasyni * MIT Licensed */ /** * Aspect constructor function. * * @api public */ var Aspect = function() { this.advisors = []; this.beanName = null; this.beanDefinition = null; this.bean = null; } /** * Aspect add advisor. * * @param {Object} advisor advisor object * @api public */ Aspect.prototype.addAdvisor = function(advisor) { this.advisors.push(advisor); } /** * Aspect get advisors. * * @return {Array} advisors * @api public */ Aspect.prototype.getAdvisors = function() { return this.advisors; } /** * Aspect set beanDefinition. * * @param {Object} beanDefinition beanDefinition object * @api public */ Aspect.prototype.setBeanDefinition = function(beanDefinition) { this.beanDefinition = beanDefinition; } /** * Aspect get beanDefinition. * * @return {Object} beanDefinition object * @api public */ Aspect.prototype.getBeanDefinition = function() { return this.beanDefinition; } /** * Aspect set beanName. * * @param {String} beanName * @api public */ Aspect.prototype.setBeanName = function(beanName) { this.beanName = beanName; } /** * Aspect get beanName. * * @return {String} beanName * @api public */ Aspect.prototype.getBeanName = function() { return this.beanName; } /** * Aspect set aspect bean. * * @param {Object} bean aspect bean object * @api public */ Aspect.prototype.setBean = function(bean) { this.bean = bean; } /** * Aspect get aspect bean. * * @return {Object} aspect bean object * @api public */ Aspect.prototype.getBean = function() { return this.bean; } module.exports = Aspect; },{}],4:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat AutoProxyCreator * Copyright(c) 2015 fantasyni * MIT Licensed */ var ProxyFactory = require('../framework/proxyFactory'); var TargetSource = require('../targetSource'); var AopUtil = require('../../util/aopUtil'); var Utils = require('../../util/utils'); /** * AutoProxyCreator constructor function. * it is a beanPostProcessor * @api public */ var AutoProxyCreator = function() { this.beanFactory = null; } /** * AutoProxyCreator beanPostProcessor before filter wrap bean if necessary. * * @param {Object} beanObject bean object * @param {String} beanName * @return {Object} bean object * @api public */ AutoProxyCreator.prototype.before = function(beanObject, beanName) { return beanObject; } /** * AutoProxyCreator beanPostProcessor after filter wrap bean if necessary. * it may return target proxy object if necessary * * @param {Object} beanObject bean object * @param {String} beanName * @return {Object} bean object * @api public */ AutoProxyCreator.prototype.after = function(beanObject, beanName) { return this.wrapIfNecessary(beanObject, beanName); } /** * AutoProxyCreator set beanFactory. * * @param {Object} beanFactory beanFactory object * @api public */ AutoProxyCreator.prototype.setBeanFactory = function(beanFactory) { this.beanFactory = beanFactory; } /** * AutoProxyCreator get beanFactory. * * @return {Object} beanFactory object * @api public */ AutoProxyCreator.prototype.getBeanFactory = function() { return this.beanFactory; } /** * AutoProxyCreator wrap bean if necessary. * * @param {Object} beanObject bean object * @param {String} beanName * @return {Object} bean object * @api private */ AutoProxyCreator.prototype.wrapIfNecessary = function(beanObject, beanName) { var beanDefinition = this.beanFactory.getBeanDefinition(beanName); // class do not need to be proxied if (!beanDefinition.needProxy()) { return beanObject; } // aspect beanObject do not need to proxy if (beanDefinition.isAspect()) { return beanObject; } var advisors = this.getAdvisorsForBean(beanObject, beanName); if (Utils.checkArray(advisors) && advisors.length) { var proxy = this.createProxy(beanObject, beanName, advisors, new TargetSource(beanName, beanObject)); return proxy; } return beanObject; } /** * AutoProxyCreator create proxy object with specific advisors and targetSource. * * @param {Object} beanObject bean object * @param {String} beanName * @param {Array} advisors advisors list * @param {Object} targetSource targetSource object * @return {Object} bean proxy object * @api private */ AutoProxyCreator.prototype.createProxy = function(beanObject, beanName, advisors, targetSource) { var proxyFactory = new ProxyFactory(); proxyFactory.setBeanFactory(this.getBeanFactory()); proxyFactory.setTarget(targetSource); var methods = AopUtil.getMethodsFromObject(beanObject); proxyFactory.setInterfaces(methods); for (var i = 0; i < advisors.length; i++) { proxyFactory.addAdvisor(advisors[i]); } return proxyFactory.getProxy(); } /** * AutoProxyCreator get advisors for bean. * * @param {Object} beanObject bean object * @param {String} beanName * @return {Array} advisors list * @api private */ AutoProxyCreator.prototype.getAdvisorsForBean = function(beanObject, beanName) { return this.findEligibleAdvisors(beanObject, beanName); } /** * AutoProxyCreator find eligible advisors. * * @param {Object} beanObject bean object * @param {String} beanName * @return {Array} advisors list * @api private */ AutoProxyCreator.prototype.findEligibleAdvisors = function(beanObject, beanName) { var candidateAdvisors = this.findCandidateAdvisors(beanObject, beanName); return this.findAdvisorsThatCanApply(beanObject, beanName, candidateAdvisors); } /** * AutoProxyCreator find all candidate advisors for bean. * * @param {Object} beanObject bean object * @param {String} beanName * @return {Array} advisors list * @api private */ AutoProxyCreator.prototype.findCandidateAdvisors = function(beanObject, beanName) { var aspects = this.beanFactory.getAspects(); var candidateAdvisors = []; for (var i = 0; i < aspects.length; i++) { var aspect = aspects[i]; var beanName = aspect.getBeanName(); var aspectBean = this.beanFactory.getBean(beanName); aspect.setBean(aspectBean); var advisors = aspect.getAdvisors(); for (var j = 0; j < advisors.length; j++) { var advisor = advisors[j]; advisor.setBean(aspectBean); candidateAdvisors.push(advisor); } } return candidateAdvisors; } /** * AutoProxyCreator find all candidate advisors appliable for bean. * * @param {Object} beanObject bean object * @param {String} beanName * @param {Array} candidateAdvisors * @return {Array} advisors list * @api private */ AutoProxyCreator.prototype.findAdvisorsThatCanApply = function(beanObject, beanName, candidateAdvisors) { var advisors = []; for (var i = 0; i < candidateAdvisors.length; i++) { var advisor = candidateAdvisors[i]; if (this.canApply(advisor, beanObject, beanName)) { advisors.push(advisor); } } advisors = AopUtil.sortAdvisorsByOrder(advisors); return advisors; } /** * AutoProxyCreator check whether an advisor can be applied to the specific bean. * * @param {Object} advisor * @param {Object} beanObject * @param {String} beanName * @return {Boolean} true|false * @api private */ AutoProxyCreator.prototype.canApply = function(advisor, beanObject, beanName) { var methods = AopUtil.getMethodsFromObject(beanObject); var pointcut = advisor.getPointcut(); for (var i = 0; i < methods.length; i++) { var targetMethod = beanName + '.' + methods[i]; if (pointcut.match(targetMethod)) { return true; } } return false; } module.exports = AutoProxyCreator; },{"../../util/aopUtil":35,"../../util/utils":44,"../framework/proxyFactory":8,"../targetSource":10}],5:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat AdvisedSupport * Copyright(c) 2015 fantasyni * MIT Licensed */ var Utils = require('../../util/utils'); /** * AdvisedSupport constructor function. * @api public */ var AdvisedSupport = function() { this.advisors = []; this.interfaces = []; this.methodCache = {}; this.beanFactory = null; this.targetSource = null; this.advisorChainFactory = null; } /** * set target. * * @param {Object} target target object * @api public */ AdvisedSupport.prototype.setTarget = function(target) { this.setTargetSource(target); } /** * set target source. * * @param {Object} targetSource object * @api public */ AdvisedSupport.prototype.setTargetSource = function(targetSource) { this.targetSource = targetSource; } /** * get target source. * * @return {Object} targetSource object * @api public */ AdvisedSupport.prototype.getTargetSource = function() { return this.targetSource; } /** * set proxy interfaces. * * @param {Array} interfaces proxy interfaces * @api public */ AdvisedSupport.prototype.setInterfaces = function(interfaces) { for (var i = 0; i < interfaces.length; i++) { this.addInterface(interfaces[i]); } } /** * add proxy interface. * * @param {String} interface proxy interface * @api public */ AdvisedSupport.prototype.addInterface = function(interface) { this.interfaces.push(interface); } /** * get proxy interfaces. * * @return {Array} proxy interfaces * @api public */ AdvisedSupport.prototype.getInterfaces = function() { return this.interfaces; } /** * get advisors. * * @return {Array} advisors * @api public */ AdvisedSupport.prototype.getAdvisors = function() { return this.advisors; } /** * add advisor. * * @param {Object} advisor * @api public */ AdvisedSupport.prototype.addAdvisor = function(advisor) { this.advisors.push(advisor); } /** * get beanFactory. * * @return {Object} beanFactory object * @api public */ AdvisedSupport.prototype.getBeanFactory = function() { return this.beanFactory; } /** * set beanFactory. * * @param {Object} beanFactory beanFactory object * @api public */ AdvisedSupport.prototype.setBeanFactory = function(beanFactory) { this.beanFactory = beanFactory; } /** * get interception advisors for bean. * * @param {String} method * @param {String} beanName * @param {String} adviceType * @return {Object} interception advisors * @api public */ AdvisedSupport.prototype.getInterceptionAdvice = function(method, beanName, adviceType) { var cacheKey = method + "_" + adviceType; var cached = this.methodCache[cacheKey]; if (!cached) { cached = this.doGetInterceptionAdvice(method, beanName, adviceType); this.methodCache[cacheKey] = cached; } return cached; } /** * do get interception advisors for bean. * * @param {String} method * @param {String} beanName * @param {String} adviceType * @return {Object} interception advisors * @api private */ AdvisedSupport.prototype.doGetInterceptionAdvice = function(method, beanName, adviceType) { var interceptorList = []; var advisors = this.getAdvisors(); var targetMethod = beanName + '.' + method; for (var i = 0; i < advisors.length; i++) { var advisor = advisors[i]; var pointcut = advisor.getPointcut(); if (pointcut.getAdviceType() !== adviceType) { continue; } if (pointcut.match(targetMethod)) { interceptorList.push(advisor); } } interceptorList.sort(Utils.compareByOrder); return interceptorList; } module.exports = AdvisedSupport; },{"../../util/utils":44}],6:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat DynamicAopProxy * Copyright(c) 2015 fantasyni * MIT Licensed */ var logger = require('pomelo-logger').getLogger('bearcat', 'DynamicAopProxy'); var Constant = require('../../util/constant'); var Utils = require('../../util/utils'); /** * DynamicAopProxy constructor function. * * @param {Object} advised advisedSupport object * @api public */ var DynamicAopProxy = function(advised) { this.advised = advised; this.dyInit(); } /** * DynamicAopProxy init function. * it will add proxy interfaces to DynamicAopProxy prototype, and proxy to invoke function * * @api public */ DynamicAopProxy.prototype.dyInit = function() { if (!this.advised) { logger.error('DynamicAopProxy init error no advised'); return; } var interfaces = this.advised.getInterfaces(); var self = this; for (var i = 0; i < interfaces.length; i++) { (function(interface) { if (checkFuncName(interface)) { logger.error('init error proxy method interface %j the same as DynamicAopProxy, rename this name to another.', interface) return; }; self[interface] = function() { arguments = Array.prototype.slice.apply(arguments); return self.dyInvoke(interface, arguments); } })(interfaces[i]); } } /** * DynamicAopProxy proxy invoke function. * all target proxy function invoke will delegate to this function * * @param {String} method proxy method name * @param {Array} args proxy method invoke arguments * * @api private */ DynamicAopProxy.prototype.dyInvoke = function(method, args) { var self = this; var invokeCb = args.pop(); var flag = false; if (!Utils.checkFunction(invokeCb)) { // aop target args last must be next function // if (invokeCb) { args.push(invokeCb); // } invokeCb = function() {}; flag = true; } var targetSource = this.advised.getTargetSource(); var beanName = targetSource.getBeanName(); var target = targetSource.getTarget(); var adviseType = Constant.AOP_ADVICE_BEFORE; var beforeAdvisors = this.advised.getInterceptionAdvice(method, beanName, adviseType); adviseType = Constant.AOP_ADVICE_AROUND; var aroundAdvisors = this.advised.getInterceptionAdvice(method, beanName, adviseType); var needAround = false; if (Utils.checkArray(aroundAdvisors) && aroundAdvisors.length) { needAround = true; } adviseType = Constant.AOP_ADVICE_AFTER; var afterAdvisors = this.advised.getInterceptionAdvice(method, beanName, adviseType); var needAfter = false; if (Utils.checkArray(afterAdvisors) && afterAdvisors.length) { needAfter = true; } return this.doInvokeAdvisorsBefore(method, args, beforeAdvisors, function(err) { if (err) { return invokeCb(err); } if (needAround) { return self.doInvokeAdvisorsAround(target, method, args, aroundAdvisors, function() { arguments = Array.prototype.slice.apply(arguments); invokeCb.apply(null, arguments); self.doInvokeAdvisorsAfter(method, arguments, afterAdvisors, function() {}); }); } else { var next = function() { arguments = Array.prototype.slice.apply(arguments); invokeCb.apply(null, arguments); self.doInvokeAdvisorsAfter(method, arguments, afterAdvisors, function() {}); } if (!flag) { args.push(next); return target[method].apply(target, args); } else { var r = target[method].apply(target, args); if (needAfter) { self.doInvokeAdvisorsAfter(method, r, afterAdvisors, function() {}); } return r; } } }); } /** * DynamicAopProxy do invoke before advisors chain. * * @param {String} method proxy method name * @param {Array} args proxy method invoke arguments * @param {Object} advisors target advisors * @param {Function} cb callback function * * @api private */ DynamicAopProxy.prototype.doInvokeAdvisorsBefore = function(method, args, advisors, cb) { var index = 0; args = Array.prototype.slice.apply(args); if (!advisors || !Utils.checkArray(advisors) || !advisors.length) { return cb(); } var next = function(err) { if (err || index >= advisors.length) { return cb(err); } var advisor = advisors[index++]; var advise = advisor.getAdvice(); var aspectBean = advisor.getBean(); var _next = function(err) { next(err); }; if (advisor.isRuntime()) { args.push(_next); aspectBean[advise].apply(aspectBean, args); } else { aspectBean[advise](_next); } } next(); } /** * DynamicAopProxy do invoke around advisors chain. * * @param {Object} target target object * @param {String} method proxy method name * @param {Array} args proxy method invoke arguments * @param {Object} advisors target advisors * @param {Function} cb callback function * * @api private */ DynamicAopProxy.prototype.doInvokeAdvisorsAround = function(target, method, args, advisors, cb) { var advisor = advisors[0]; var advise = advisor.getAdvice(); var aspectBean = advisor.getBean(); // if (Utils.checkObject(args)) { // args = Array.prototype.slice.apply(args); // } if (advisor.isRuntime()) { args.unshift(method); args.unshift(target); args.push(cb); return aspectBean[advise].apply(aspectBean, args); } else { return aspectBean[advise](target, method, cb); } } /** * DynamicAopProxy do invoke after advisors chain. * * @param {String} method proxy method name * @param {Array} args proxy method invoke arguments * @param {Object} advisors target advisors * @param {Function} cb callback function * * @api private */ DynamicAopProxy.prototype.doInvokeAdvisorsAfter = function(method, args, advisors, cb) { var index = 0; if (!advisors || !Utils.checkArray(advisors) || !advisors.length) { return cb(); } // if (Utils.checkObject(args)) { // args = Array.prototype.slice.apply(args); // } else if (!Utils.checkArray(args)) { args = [args]; } var next = function(err) { if (err || index >= advisors.length) { return cb(err); } var advisor = advisors[index++]; var advise = advisor.getAdvice(); var aspectBean = advisor.getBean(); var _next = function(err) { next(err); }; args.push(_next); aspectBean[advise].apply(aspectBean, args); } next(); } var names = ["dyInit", "dyInvoke", "doInvokeAdvisorsBefore", "doInvokeAdvisorsAround", "doInvokeAdvisorsAfter" ]; var checkFuncName = function(name) { for (var i = 0; i < names.length; i++) { if (name === names[i]) { return true; } } return false; } module.exports = DynamicAopProxy; },{"../../util/constant":37,"../../util/utils":44,"pomelo-logger":57}],7:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat DynamicMetaProxy * Copyright(c) 2015 fantasyni * MIT Licensed */ var logger = require('pomelo-logger').getLogger('bearcat', 'DynamicMetaProxy'); var Utils = require('../../util/utils'); /** * DynamicMetaProxy constructor function. * this proxy will be used in bearcat.getBeanByMeta() * getBeanByMeta will first return a dynamicMetaProxy, * when target bean invoked, it will call getBean to get the target object * * @api public */ var DynamicMetaProxy = function() { this.args = null; this.target = null; this.beanFactory = null; this.beanDefinition = null; } /** * DynamicMetaProxy init function. * * @api public */ DynamicMetaProxy.prototype._dyInit = function() { var beanDefinition = this.beanDefinition; if (!beanDefinition) { logger.error('init error no beanDefinition.'); return; } var self = this; var func = beanDefinition.getFunc(); if (Utils.checkFunction(func)) { var proto = func.prototype; for (interface in proto) { if (Utils.checkFunction(proto[interface])) { (function(method) { if (checkFuncName(method)) { logger.error('init error proxy method interface %j the same as DynamicMetaProxy, rename this name to another.', method) return; }; self[method] = function() { return self._dyInvoke(method, arguments); }; })(interface); } } } } /** * DynamicMetaProxy proxy invoke function. * * @param {String} method proxy method name * @param {Array} args target invoke arguments * @api private */ DynamicMetaProxy.prototype._dyInvoke = function(method, args) { var targetBean = this._getBean(); if (Utils.checkFunction(targetBean[method])) { return targetBean[method].apply(targetBean, args); } else { logger.error('invoke error no such method %s in the target bean', method); } } /** * DynamicMetaProxy get target bean through beanFactory. * * @return {Object} target bean * @api public */ DynamicMetaProxy.prototype._getBean = function() { var args = this.args; var beanFactory = this.beanFactory; if (!this.target) { this.target = beanFactory.getBean.apply(beanFactory, args); } return this.target; } var names = ["_dyInit", "_dyInvoke", "_getBean"]; var checkFuncName = function(name) { for (var i = 0; i < names.length; i++) { if (name === names[i]) { return true; } } return false; } module.exports = DynamicMetaProxy; },{"../../util/utils":44,"pomelo-logger":57}],8:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat DynamicAopProxy * Copyright(c) 2015 fantasyni * MIT Licensed */ var RequireUtil = require('../../util/requireUtil'); var DynamicAopProxy = require('./dynamicAopProxy'); var AdvisedSupport = require('./advisedSupport'); var Utils = require('../../util/utils'); var Util = RequireUtil.requireUtil(); /** * ProxyFactory constructor function. * * @param {Object} target target object * @param {Array} interfaces proxy interfaces * @api public */ var ProxyFactory = function(target, interfaces) { this.beanFactory = null; AdvisedSupport.call(this); if (target) { this.setTarget(target); } if (Utils.checkArray(interfaces)) { this.setInterfaces(interfaces); } } Util.inherits(ProxyFactory, AdvisedSupport); /** * ProxyFactory get dynamic proxy. * * @return {Object} dynamic proxy object * @api public */ ProxyFactory.prototype.getProxy = function() { var beanFactory = this.getBeanFactory(); var proxyObject = new DynamicAopProxy(this); return proxyObject; } module.exports = ProxyFactory; },{"../../util/requireUtil":42,"../../util/utils":44,"./advisedSupport":5,"./dynamicAopProxy":6}],9:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat Pointcut * Copyright(c) 2015 fantasyni * MIT Licensed */ var Utils = require('../util/utils'); /** * Pointcut constructor function. * * @api public */ var Pointcut = function() { this.expression = null; this.adviceType = null; this.targetExpression = null; } /** * Pointcut set expression. * * @param {String} expression pointcut expression * @api public */ Pointcut.prototype.setExpression = function(expression) { this.expression = expression; } /** * Pointcut get expression. * * @param {String} pointcut expression * @api public */ Pointcut.prototype.getExpression = function() { return this.expression; } /** * Pointcut set adviceType: before, after, around. * * @param {String} adviceType * @api public */ Pointcut.prototype.setAdviceType = function(adviceType) { this.adviceType = adviceType; } /** * Pointcut get adviceType: before, after, around. * * @param {String} adviceType * @api public */ Pointcut.prototype.getAdviceType = function() { return this.adviceType; } /** * Pointcut set target pointcut expression. * * @param {String} target pointcut expression * @api public */ Pointcut.prototype.setTargetExpression = function(targetExpression) { this.targetExpression = new RegExp(targetExpression); } /** * Pointcut get target pointcut expression. * * @return {String} target pointcut expression * @api public */ Pointcut.prototype.getTargetExpression = function() { return this.targetExpression; } /** * Pointcut parse pointcut expression. * * @api public */ Pointcut.prototype.parse = function() { var expression = this.getExpression(); if (!expression) { return; } var r = expression.split(':'); if (Utils.checkArray(r) && r.length === 2) { this.setAdviceType(r[0]); this.setTargetExpression(r[1]); } } /** * Pointcut check whether pointcut match targetMethod. * * @param {String} targetMethod target method name * @api public */ Pointcut.prototype.match = function(targetMethod) { var targetExpression = this.getTargetExpression(); return targetMethod.match(targetExpression); } module.exports = Pointcut; },{"../util/utils":44}],10:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat TargetSource * Copyright(c) 2015 fantasyni * MIT Licensed */ /** * TargetSource constructor function. * * @param {String} beanName * @param {Object} target target object * @api public */ var TargetSource = function(beanName, target) { this.beanName = beanName; this.target = target; } /** * TargetSource set beanName. * * @param {String} beanName * @api public */ TargetSource.prototype.setBeanName = function(beanName) { this.beanName = beanName; } /** * TargetSource get beanName. * * @return {String} beanName * @api public */ TargetSource.prototype.getBeanName = function() { return this.beanName; } /** * TargetSource set target. * * @param {Object} target target object * @api public */ TargetSource.prototype.setTarget = function(target) { this.target = target; } /** * TargetSource get target. * * @return {Object} target object * @api public */ TargetSource.prototype.getTarget = function() { return this.target; } TargetSource.prototype.releaseTarget = function() { } module.exports = TargetSource; },{}],11:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat BeanFactory * Copyright(c) 2015 fantasyni * MIT Licensed */ var logger = require('pomelo-logger').getLogger('bearcat', 'BeanFactory'); var DynamicMetaProxy = require('../aop/framework/dynamicMetaProxy'); var SingletonBeanFactory = require('./singletonBeanFactory'); var ModelConstraint = require('../model/modelConstraint'); var ModelDefinition = require('../model/modelDefinition'); var BeanDefinition = require('./support/beanDefinition'); var ValidatorUtil = require('../util/validatorUtil'); var ModelFilter = require('../model/modelFilter'); var ModelProxy = require('../model/modelProxy'); var ModelUtil = require('../util/modelUtil'); var Constant = require('../util/constant'); var BeanUtil = require('../util/beanUtil'); var AopUtil = require('../util/aopUtil'); var Aspect = require('../aop/aspect'); var Utils = require('../util/utils'); /** * BeanFactory constructor function. * * @api public */ var BeanFactory = function() { this.aspects = []; this.modelMap = {}; this.initCbMap = {}; this.beanCurMap = {}; this.constraints = {}; this.tableModelMap = {}; this.beanFunctions = {}; this.beanDefinitions = {}; this.beanPostProcessors = []; this.singletonBeanFactory = new SingletonBeanFactory(this); } /** * BeanFactory get bean instance through BeanFactory IoC container. * * @param {String} beanName * @return {Object} bean object * @api public */ BeanFactory.prototype.getBean = function(beanName) { if (this.beanCurMap[beanName]) { logger.error("circle reference beanName " + beanName + " is in creating"); return; } this.beanCurMap[beanName] = true; var beanObject = this.doGetBean.apply(this, arguments); delete this.beanCurMap[beanName]; return beanObject; } /** * BeanFactory get bean proxy through BeanFactory IoC container for lazy init bean. * when invoke bean proxy, proxy will invoke getBean to get the target bean * * @param {String} beanName * @return {Object} bean proxy object * @api public */ BeanFactory.prototype.getBeanProxy = function(beanName) { return this.doGetBeanProxy.apply(this, arguments); } /** * BeanFactory get model through BeanFactory IoC container. * * @param {String} modelId * @return {Object} model proxy object * @api public */ BeanFactory.prototype.getModelProxy = function(modelId) { return this.doGetModelProxy(modelId); } /** * BeanFactory get constraint through BeanFactory IoC container. * * @param {String} cid * @return {Object} constraint bean object * @api public */ BeanFactory.prototype.getConstraint = function(cid) { return this.doGetConstraint(cid); } /** * BeanFactory do get bean instance through BeanFactory IoC container. * * @param {String} beanName * @return {Object} bean object * @api private */ BeanFactory.prototype.doGetBean = function(beanName) { var beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { logger.error('BeanFactory beanDefinition null for %j', beanName); return null; } if (beanDefinition.isAbstract()) { logger.warn('abstract bean can not get bean instance, you can use bearcat.getFunction to get constructor function of the bean'); return this.getBeanFunction(beanName); } if (beanDefinition.hasParentBean()) { beanDefinition = this.setParentBean(beanName); } // if (beanDefinition.isLazyInit()) { // return this.getBeanProxy.apply(this, arguments); // } if (beanDefinition.isSingleton()) { return this.singletonBeanFactory.getSingleton.apply(this.singletonBeanFactory, arguments); } else if (beanDefinition.isPrototype()) { return this.createBean.apply(this, arguments); } } /** * BeanFactory do get bean proxy through BeanFactory IoC container. * * @param {String} beanName * @return {Object} bean proxy object * @api private */ BeanFactory.prototype.doGetBeanProxy = function(beanName) { var beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { logger.error('BeanFactory beanDefinition null for %j', beanName); return null; } var dynamicMetaProxy = new DynamicMetaProxy(); dynamicMetaProxy['beanDefinition'] = beanDefinition; dynamicMetaProxy['beanFactory'] = this; dynamicMetaProxy['args'] = arguments; dynamicMetaProxy._dyInit(); return dynamicMetaProxy; } /** * BeanFactory do get model through BeanFactory IoC container. * * @param {String} modelId * @return {Object} model proxy * @api private */ BeanFactory.prototype.doGetModelProxy = function(modelId) { var modelDefinition = this.getModelDefinition(modelId); if (!modelDefinition) { logger.error('BeanFactory modelDefinition null for %j', modelId); return null; } var beanName = modelDefinition.getId(); var beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { logger.error('BeanFactory beanDefinition null for %j', modelId); return null; } var modelFilter = new ModelFilter(); modelFilter.setModelDefinition(modelDefinition); var modelProxy = new ModelProxy(); var modelBean = this.getBean(beanName); var modelFields = modelDefinition.getFields(); for (var key in modelFields) { var modelField = modelFields[key]; var modelDefault = modelField.getDefault(); var modelFieldType = modelField.getType(); if (Utils.isNotNull(modelDefault)) { if (modelFieldType === Constant.TYPE_NUMBER) { modelDefault = parseInt(modelDefault); } modelBean[key] = modelDefault; } } modelFilter.setModel(modelBean); modelProxy['model'] = modelBean; modelProxy['beanFactory'] = this; modelProxy['modelFilter'] = modelFilter; modelProxy['beanDefinition'] = beanDefinition; modelProxy['modelDefinition'] = modelDefinition; modelProxy._modelInit(); return modelProxy; } /** * BeanFactory do get constraint through BeanFactory IoC container. * * @param {String} cid * @return {Object} constraint bean object * @api private */ BeanFactory.prototype.doGetConstraint = function(cid) { var constraintDefinition = this.getConstraintDefinition(cid); if (!constraintDefinition) { logger.error('BeanFactory constraintDefinition null for %j', cid); return null; } var beanName = constraintDefinition.getId(); return this.getBean(beanName); } /** * BeanFactory create bean instance through BeanFactory IoC container. * * @param {String} beanName * @return {Object} bean object * @api private */ BeanFactory.prototype.createBean = function(beanName) { var beanObject = this.doCreateBean.apply(this, arguments); beanObject = this.initBean(beanObject, beanName, this.getInitCb(beanName)); return beanObject; } /** * BeanFactory do create bean instance through BeanFactory IoC container. * * @param {String} beanName * @return {Object} bean object * @api private */ BeanFactory.prototype.doCreateBean = function(beanName) { var beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { return null; } if (beanDefinition.hasFactoryBean()) { return this.getBeanFromFactoryBean.apply(this, arguments); } var argsOn = beanDefinition.getArgsOn(); var propsOn = beanDefinition.getPropsOn(); var func = this.getBeanFunction(beanName); if (!func) { return null; } var dependsBeans = this.getDependsBeanValues(argsOn, arguments); var dependsApplyArgs = this.getDependsApplyArgs(dependsBeans); var beanObject = Object.create(func.prototype); func.apply(beanObject, dependsApplyArgs); dependsBeans = this.getDependsBeanValues(propsOn); if (Utils.checkArray(dependsBeans)) { for (var i = 0; i < dependsBeans.length; i++) { var wbean = dependsBeans[i]; var name = wbean.getName(); if (wbean.getDependType() === Constant.DEPEND_TYPE_BEAN) { beanObject[name] = wbean.getBean(); } else if (wbean.getDependType() === Constant.DEPEND_TYPE_VALUE) { beanObject[name] = wbean.getValue(); } // no this case // else if (wbean.getDependType() === Constant.DEPEND_TYPE_VAR) { // beanObject[name] = wbean.getValueOnce(); // } else { // Constant.DEPEND_TYPE_ERROR } } } return beanObject; } /** * BeanFactory init bean with init method. * * @param {Object} beanObject * @param {String} beanName * @param {Function} cb async init callback function * @api private */ BeanFactory.prototype.initBean = function(beanObject, beanName, cb) { var beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { return; } beanObject = this.applyBeanPostProcessorsBeforeInitialization(beanObject, beanName); this.invokeInitMethods(beanObject, beanName, cb); beanObject = this.applyBeanPostProcessorsAfterInitialization(beanObject, beanName); return beanObject; } /** * BeanFactory invoke init method. * * @param {Object} beanObject * @param {String} beanName * @param {Function} cb async init callback function * @api private */ BeanFactory.prototype.invokeInitMethods = function(beanObject, beanName, cb) { var beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { return; } if (beanDefinition.hasInitMethod()) { var initMethodName = beanDefinition.getInitMethodName(); // run init method var initMethod = beanObject[initMethodName]; if (Utils.checkFunction(initMethod)) { initMethod.call(beanObject, cb); } } } /** * BeanFactory get bean instance from factoryBean's factory method. * * @param {String} beanName * @return {Object} bean object * @api private */ BeanFactory.prototype.getBeanFromFactoryBean = function(beanName) { var beanDefinition = this.getBeanDefinition(beanName); var factoryBeanName = beanDefinition.getFactoryBeanName(); var factoryMethodName = beanDefinition.getFactoryMethodName(); var factoryArgsOn = beanDefinition.getFactoryArgsOn(); var factoryBean = this.getBean(factoryBeanName); if (!factoryBean) { return null; } var factoryMethod = factoryBean[factoryMethodName]; var dependsBeans = this.getDependsBeanValues(factoryArgsOn, arguments); var dependsApplyArgs = this.getDependsApplyArgs(dependsBeans); var beanObject = factoryMethod.apply(factoryBean, dependsApplyArgs); return beanObject; } /** * BeanFactory get denpended beans or values. * * @param {Array} dependsOn * @param {Array} args arguments * @return {Array} depended bean value list * @api private */ BeanFactory.prototype.getDependsBeanValues = function(dependsOn, args) { var r = []; if (!Utils.checkArray(dependsOn)) { return r; } var s = 1; for (var i = 0; i < dependsOn.length; i++) { var wbean = dependsOn[i]; var beanName = wbean.getRef(); if (wbean.getDependType() === Constant.DEPEND_TYPE_BEAN) { var bean = this.getBean(beanName); if (bean) { wbean.setBean(bean); } } if (wbean.getDependType() === Constant.DEPEND_TYPE_VAR) { var value = args[s++]; wbean.setValue(value); } r.push(wbean); } return r; } /** * BeanFactory get depended apply arguments. * * @param {Array} dependsOn * @return {Array} depended bean apply list * @api private */ BeanFactory.prototype.getDependsApplyArgs = function(dependsOn) { var r = []; if (!Utils.checkArray(dependsOn)) { return r; } for (var i = 0; i < dependsOn.length; i++) { var wbean = dependsOn[i]; if (wbean.getDependType() === Constant.DEPEND_TYPE_BEAN) { r.push(wbean.getBean()); } else if (wbean.getDependType() === Constant.DEPEND_TYPE_VALUE) { r.push(wbean.getValue()); } else if (wbean.getDependType() === Constant.DEPEND_TYPE_VAR) { r.push(wbean.getValueOnce()); } else { // DEPEND_TYPE_ERROR logger.error("getDependsApplyArgs depends args type error %j", wbean); } } return r; } /** * BeanFactory set parent bean. * * @param {String} beanName * @return {Object} beanDefinition * @api public */ BeanFactory.prototype.setParentBean = function(beanName) { var beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { return null; } var parentName = beanDefinition.getParentName(); var parentBeanDefintion = this.getBeanDefinition(parentName); var func = this.getBeanFunction(beanName); var parentFunc = this.getBeanFunction(parentName); if (parentFunc) { var proto = parentFunc.prototype; for (var key in proto) { if (!func.prototype[key]) { func.prototype[key] = proto[key]; } } } if (parentBeanDefintion) { beanDefinition.setParentBean(parentBeanDefintion); beanDefinition.setArgsOn(parentBeanDefintion.getArgs()); beanDefinition.setPropsOn(parentBeanDefintion.getProps()); beanDefinition.setFactoryArgsOn(parentBeanDefintion.getFactoryArgs()); } return beanDefinition; } /** * BeanFactory register beans through metaObjects into BeanFactory. * * @param {Object} metaObjects * @api public */ BeanFactory.prototype.registerBeans = function(metaObjects) { for (var beanName in metaObjects) { this.registerBean(beanName, metaObjects[beanName]); } } /** * BeanFactory register bean through metaObject into BeanFactory. * * @param {String} beanName * @param {Object} metaObjects * @api public */ BeanFactory.prototype.registerBean = function(beanName, metaObject) { var func = metaObject.func; var validateResult = ValidatorUtil.metaValidator(metaObject); if (validateResult !== true) { logger.error("registryBean %j metaObject %j validate error %s", beanName, metaObject, validateResult.stack); return; } var mid = metaObject.mid; if (mid) { // register bearcat model this.registerModel(beanName, mid, metaObject); } var cid = metaObject.cid; if (cid) { // register bearcat constraint this.registerConstraint(beanName, cid, metaObject); } if (func && Utils.checkFunction(func) && !this.getBeanFunction(beanName)) { this.setBeanFunction(beanName, func); } var order = metaObject.order; var parentName = metaObject.parent; var initMethodName = metaObject.init; var destroyMethodName = metaObject.destroy; var factoryBeanName = metaObject.factoryBean; var factoryMethodName = metaObject.factoryMethod; var scope = metaObject.scope || Constant.SCOPE_DEFAULT; var args = metaObject.args || Constant.ARGS_DEFAULT; var props = metaObject.props || Constant.PROPS_DEFAULT; var factoryArgsOn = metaObject.factoryArgs || Constant.ARGS_DEFAULT; var asyncInit = metaObject.async || Constant.ASYNC_INIT_DEFAULT; var lazyInit = metaObject.lazy || Constant.LAZY_INIT_DEFAULT; var abstract = metaObject.abstract || Constant.ABSTRACT_DEFAULT; var proxy = metaObject.proxy; if (!Utils.isNotNull(proxy)) { proxy = Constant.PROXY_DEFAULT; } var aop = metaObject.aop; var beanDefinition = null; beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { beanDefinition = new BeanDefinition(); } // model scope should be prototype if (mid) { scope = Constant.SCOPE_PROTOTYPE; } beanDefinition.setFunc(func); beanDefinition.setOrder(order); beanDefinition.setScope(scope); beanDefinition.setProxy(proxy); beanDefinition.setBeanName(beanName); beanDefinition.setLazyInit(lazyInit); beanDefinition.setAbstract(abstract); beanDefinition.setAsyncInit(asyncInit); beanDefinition.setParentName(parentName); beanDefinition.setInitMethodName(initMethodName); beanDefinition.setFactoryBeanName(factoryBeanName); beanDefinition.setFactoryMethodName(factoryMethodName); beanDefinition.setDestroyMethodName(destroyMethodName); beanDefinition.setArgsOn(BeanUtil.buildBeanWrapper(args)); beanDefinition.setPropsOn(BeanUtil.buildBeanWrapper(props)); beanDefinition.setFactoryArgsOn(BeanUtil.buildBeanWrapper(factoryArgsOn)); if (aop && Utils.checkArray(aop)) { var aspect = AopUtil.buildAspect(aop, beanDefinition); this.aspects.push(aspect); beanDefinition.setAspect(true); } this.beanDefinitions[beanName] = beanDefinition; } /** * BeanFactory register model through metaObject into BeanFactory. * * @param {String} beanName bean id * @param {String} modelId model id * @param {Object} metaObject * @api public */ BeanFactory.prototype.registerModel = function(beanName, modelId, metaObject) { var modelDefinition = null; modelDefinition = this.getModelDefinition(modelId); if (!modelDefinition) { modelDefinition = new ModelDefinition(); } var table = metaObject.table; var prefix = metaObject.prefix; var attributes = metaObject.attributes; var resolvedAttributes = ModelUtil.buildModelAttribute(attributes, this); modelDefinition.setId(beanName); modelDefinition.setMid(modelId); modelDefinition.setTable(table); modelDefinition.setPrefix(prefix); modelDefinition.setFields(resolvedAttributes['fields']); modelDefinition.setBalance(resolvedAttributes['balance']); modelDefinition.setRefFields(resolvedAttributes['refFields']); modelDefinition.setOneToMany(resolvedAttributes['oneToMany']); if (Utils.isNotNull(table)) { this.setTableModelMap(table, modelDefinition); } this.modelMap[modelId] = modelDefinition; } /** * BeanFactory register constraint through metaObject into BeanFactory. * * @param {String} beanName bean id * @param {String} cid constraint id * @param {Object} metaObject * @api public */ BeanFactory.prototype.registerConstraint = function(beanName, cid, metaObject) { var constraintDefinition = null; constraintDefinition = this.getConstraintDefinition(cid); if (!constraintDefinition) { constraintDefinition = new ModelConstraint(); } var message = metaObject.message; var constraint = metaObject.constraint; constraintDefinition.setId(beanName); constraintDefinition.setCid(cid); constraintDefinition.setConstraint(constraint); this.constraints[cid] = constraintDefinition; } /** * BeanFactory instantiating singletion beans in advance. * * @param {Function} cb callback function * @api public */ BeanFactory.prototype.preInstantiateSingletons = function(cb) { var beanDefinitionOrderList = BeanUtil.sortBeanDefinitions(this.beanDefinitions, this); var self = this; var index = 0; var next = function(err) { if (err || index >= beanDefinitionOrderList.length) { return cb(err); } var beanDefinition = beanDefinitionOrderList[index++]; var beanName = beanDefinition.getBeanName(); if (beanDefinition.isAsyncInit()) { if (!self.singletonBeanFactory.containsSingleton(beanName)) { var initCb = function() { next(); } self.setInitCb(beanName, initCb); self.getBean(beanName); } else { self.getBean(beanName); next() } } else { var initCb = function() {} self.setInitCb(beanName, initCb); self.getBean(beanName); next(); } } next(); } /** * BeanFactory add beanPostProcessor to BeanFactory. * @param {Object} beanPostProcessor * @api public */ BeanFactory.prototype.addBeanPostProcessor = function(beanPostProcessor) { this.beanPostProcessors.push(beanPostProcessor); } /** * BeanFactory get beanPostProcessors. * @return {Object} beanPostProcessors * @api public */ BeanFactory.prototype.getBeanPostProcessors = function() { return this.beanPostProcessors; } /** * BeanFactory apply beanPostBeforeProcessors. * @param {Object} beanObject * @param {String} beanName * @return {Object} beanObject * @api private */ BeanFactory.prototype.applyBeanPostProcessorsBeforeInitialization = function(beanObject, beanName) { var result = beanObject; var beanPostProcessors = this.getBeanPostProcessors(); for (var i = 0; i < beanPostProcessors.length; i++) { var beanProcessor = beanPostProcessors[i]; result = beanProcessor.before(result, beanName); if (!result) { return result; } } return result; } /** * BeanFactory apply beanPostAfterProcessors. * @param {Object} beanObject * @param {String} beanName * @return {Object} beanObject * @api private */ BeanFactory.prototype.applyBeanPostProcessorsAfterInitialization = function(beanObject, beanName) { var result = beanObject; var beanPostProcessors = this.getBeanPostProcessors(); for (var i = 0; i < beanPostProcessors.length; i++) { var beanProcessor = beanPostProcessors[i]; result = beanProcessor.after(result, beanName); if (!result) { return result; } } return result; } /** * BeanFactory destroy singletons. * * @api public */ BeanFactory.prototype.destroySingletons = function() { var singletonNames = this.singletonBeanFactory.getSingletonNames(); for (var i = 0; i < singletonNames.length; i++) { this.destroySingleton(singletonNames[i]); } } /** * BeanFactory destroy BeanFactory. * * @api public */ BeanFactory.prototype.destroyBeanFactory = function() { this.initCbMap = null; this.beanCurMap = null; this.beanFunctions = null; this.beanDefinitions = null; this.singletonBeanFactory = null; } /** * BeanFactory destroy singleton. * * @param {String} beanName * @api public */ BeanFactory.prototype.destroySingleton = function(beanName) { var beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { return; } var beanObject = this.getBean(beanName); this.destroyBean(beanName, beanObject); this.singletonBeanFactory.removeSingleton(beanName); } /** * BeanFactory destroy bean. * * @param {String} beanName * @param {Object} beanObject * @api public */ BeanFactory.prototype.destroyBean = function(beanName, beanObject) { var beanDefinition = this.getBeanDefinition(beanName); if (!beanDefinition) { return; } var destroyMethodName = beanDefinition.getDestroyMethodName(); var destroyMethod = beanObject[destroyMethodName]; if (Utils.checkFunction(destroyMethod)) { destroyMethod.call(beanObject); } this.removeFunction(beanName); this.removeBeanDefinition(beanName); } /** * BeanFactory check bean is a singleton or not. * * @param {String} beanName * @return {Boolean} * @api public */ BeanFactory.prototype.isSingleton = function(beanName) { var beanDefinition = this.getBeanDefinition(beanName); if (beanDefinition) { return beanDefinition.isSingleton(); } else { return false; } } /** * BeanFactory check bean is a prototype or not. * * @param {String} beanName * @return {Boolean} * @api public */ BeanFactory.prototype.isPrototype = function(beanName) { var beanDefinition = this.getBeanDefinition(beanName); if (beanDefinition) { return beanDefinition.isPrototype(); } else { return false; } } /** * BeanFactory check BeanFactory contains bean or not. * * @param {String} beanName * @return {Boolean} * @api public */ BeanFactory.prototype.containsBean = function(beanName) { return !!this.getBeanFunction(beanName) && !!this.getBeanDefinition(beanName); } /** * BeanFactory get bean contructor function. * * @param {String} beanName * @return {Function} bean constructor function * @api public */ BeanFactory.prototype.getBeanFunction = function(beanName) { return this.beanFunctions[beanName]; } /** * BeanFactory set bean contructor function. * * @param {String} beanName * @param {Function} func bean constructor function * @api public */ BeanFactory.prototype.setBeanFunction = function(beanName, func) { this.beanFunctions[beanName] = func; } /** * BeanFactory remove bean contructor function from BeanFactory. * * @param {String} beanName * @api public */ BeanFactory.prototype.removeFunction = function(beanName) { delete this.beanFunctions[beanName]; } /** * BeanFactory get init method. * * @param {String} beanName * @return {Function} bean init method * @api public */ BeanFactory.prototype.getInitCb = function(beanName) { if (!this.initCbMap[beanName]) { this.initCbMap[beanName] = Constant.INIT_CB_DEFAULT; } return this.initCbMap[beanName]; } /** * BeanFactory set init method. * * @param {String} beanName * @param {Function} initCb bean init method * @api public */ BeanFactory.prototype.setInitCb = function(beanName, initCb) { this.initCbMap[beanName] = initCb; } /** * BeanFactory get beanDefinition. * * @param {String} beanName * @return {Object} beanDefinition * @api public */ BeanFactory.prototype.getBeanDefinition = function(beanName) { return this.beanDefinitions[beanName]; } /** * BeanFactory get beanDefinitions. * * @return {Object} beanDefinitions * @api public */ BeanFactory.prototype.getBeanDefinitions = function() { return this.beanDefinitions; } /** * BeanFactory remove beanDefinition from BeanFactory. * * @param {String} beanName * @api public */ BeanFactory.prototype.removeBeanDefinition = function(beanName) { delete this.beanDefinitions[beanName]; } /** * BeanFactory check BeanFactory contains beanName beanDefinition or not. * * @param {String} beanName * @return {Boolean} * @api public */ BeanFactory.prototype.containsBeanDefinition = function(beanName) { return !!this.getBeanDefinition(beanName); } /** * BeanFactory get aspects. * * @return {Array} aspects * @api public */ BeanFactory.prototype.getAspects = function() { return this.aspects; } /** * BeanFactory get modelDefinition. * * @param {String} modelId * @return {Object} modelDefinition * @api public */ BeanFactory.prototype.getModelDefinition = function(modelId) { return this.modelMap[modelId]; } /** * BeanFactory get modelDefinitions. * * @return {Object} modelDefinition map * @api public */ BeanFactory.prototype.getModelDefinitions = function() { return this.modelMap; } /** * BeanFactory get getConstraintDefinition. * * @param {String} cid * @return {Object} getConstraintDefinition * @api public */ BeanFactory.prototype.getConstraintDefinition = function(cid) { return this.constraints[cid]; } /** * BeanFactory set table model map. * * @param {String} table name * @param {Object} modelDefinition * @api public */ BeanFactory.prototype.setTableModelMap = function(table, modelDefinition) { this.tableModelMap[table] = modelDefinition; } /** * BeanFactory get modelDefinition by table. * * @param {String} table name * @return {Object} modelDefinition * @api public */ BeanFactory.prototype.getModelDefinitionByTable = function(table) { return this.tableModelMap[table]; } module.exports = BeanFactory; },{"../aop/aspect":3,"../aop/framework/dynamicMetaProxy":7,"../model/modelConstraint":24,"../model/modelDefinition":25,"../model/modelFilter":26,"../model/modelProxy":28,"../util/aopUtil":35,"../util/beanUtil":36,"../util/constant":37,"../util/modelUtil":40,"../util/utils":44,"../util/validatorUtil":45,"./singletonBeanFactory":13,"./support/beanDefinition":14,"pomelo-logger":57}],12:[function(require,module,exports){ var logger = require('pomelo-logger').getLogger('bearcat', 'ModuleFactory'); var ModuleFactory = function() { this.factoryMap = {}; this.moduleMap = {}; } ModuleFactory.prototype.define = function(id, factory) { if (this.factoryMap[id]) { logger.warn('module %s has been registered ...', id); return; } this.factoryMap[id] = factory; } ModuleFactory.prototype.require = function(id) { if (!this.moduleMap[id]) { var exports = {}; var factory = this.factoryMap[id]; if (!factory) { logger.warn('require file %s not exists ...', id); return; } var module = { exports: {} } factory(module.exports, module); this.moduleMap[id] = module.exports; } return this.moduleMap[id]; } module.exports = ModuleFactory; },{"pomelo-logger":57}],13:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat SingletonBeanFactory * Copyright(c) 2015 fantasyni * MIT Licensed */ var logger = require('pomelo-logger').getLogger('bearcat', 'SingletonBeanFactory'); /** * SingletonBeanFactory constructor function. * * @api public */ var SingletonBeanFactory = function(beanFactory) { this.beanFactory = beanFactory; this.singletonObjects = {}; } /** * SingletonBeanFactory add singleton to SingletonBeanFactory. * * @param {String} beanName * @param {Object} beanObject * @api public */ SingletonBeanFactory.prototype.addSingleton = function(beanName, beanObject) { this.singletonObjects[beanName] = beanObject; } /** * SingletonBeanFactory check SingletonBeanFactory contains singleton or not. * * @param {String} beanName * @return {Boolean} * @api public */ SingletonBeanFactory.prototype.containsSingleton = function(beanName) { return !!this.singletonObjects[beanName]; } /** * SingletonBeanFactory get singleton from SingletonBeanFactory. * * @param {String} beanName * @return {Object} singletonObject * @api public */ SingletonBeanFactory.prototype.getSingleton = function(beanName) { var beanFactory = this.beanFactory; var bean = this.singletonObjects[beanName]; if (bean) { return bean; } else { bean = beanFactory.createBean.apply(beanFactory, arguments); } this.addSingleton(beanName, bean); return bean; } /** * SingletonBeanFactory get all singleton names from SingletonBeanFactory. * * @api public */ SingletonBeanFactory.prototype.getSingletonNames = function() { var r = []; for (var name in this.singletonObjects) { r.push(name); } return r; } /** * SingletonBeanFactory remove singleton from SingletonBeanFactory. * * @param {String} beanName * @api public */ SingletonBeanFactory.prototype.removeSingleton = function(beanName) { delete this.singletonObjects[beanName]; } module.exports = SingletonBeanFactory; },{"pomelo-logger":57}],14:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat BeanDefinition * Copyright(c) 2015 fantasyni * MIT Licensed */ var Constant = require('../../util/constant'); var BeanUtils = require('../../util/beanUtil'); var Utils = require('../../util/utils'); /** * BeanDefinition constructor function. * * @api public */ var BeanDefinition = function() { this.argsOn = []; this.propsOn = []; this.func = null; this.order = null; this.proxy = true; this.aspect = false; this.abstract = false; this.lazyInit = false; this.asyncInit = false; this.parentName = null; this.parentBean = null; this.beanName = null; this.factoryArgsOn = {}; this.factoryBeanName = null; this.factoryMethodName = null; this.initMethodName = null; this.destroyMethodName = null; this.scope = Constant.SCOPE_DEFAULT; } /** * BeanDefinition get parentName. * * @return {String} parentName * @api public */ BeanDefinition.prototype.getParentName = function() { return this.parentName; } /** * BeanDefinition set parentName. * * @param {String} parentName * @api public */ BeanDefinition.prototype.setParentName = function(parentName) { if (!parentName) { return; } this.parentName = parentName; } /** * BeanDefinition check whether has parent bean. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.hasParentBean = function() { return this.getParentName() && !this.getParentBean(); } /** * BeanDefinition get parent bean. * * @return {Object} parent bean * @api public */ BeanDefinition.prototype.getParentBean = function() { return this.parentBean; } /** * BeanDefinition set parent bean. * * @param {Object} parentBean parent bean * @api public */ BeanDefinition.prototype.setParentBean = function(parentBean) { if (!parentBean) { return; } this.parentBean = parentBean; } /** * BeanDefinition get beanName. * * @return {String} beanName * @api public */ BeanDefinition.prototype.getBeanName = function() { return this.beanName; } /** * BeanDefinition set beanName. * * @param {String} beanName * @api public */ BeanDefinition.prototype.setBeanName = function(beanName) { if (!beanName) { return; } return this.beanName = beanName; } /** * BeanDefinition get factoryBeanName. * * @return {String} factoryBeanName * @api public */ BeanDefinition.prototype.getFactoryBeanName = function() { if (this.factoryBeanName) { return this.factoryBeanName; } else { if (this.parentBean) { return this.parentBean.factoryBeanName; } } } /** * BeanDefinition set factoryBeanName. * * @param {String} factoryBeanName * @api public */ BeanDefinition.prototype.setFactoryBeanName = function(factoryBeanName) { if (!factoryBeanName) { return; } this.factoryBeanName = factoryBeanName; } /** * BeanDefinition get factoryMethodName. * * @return {String} factoryMethodName * @api public */ BeanDefinition.prototype.getFactoryMethodName = function() { if (this.factoryMethodName) { return this.factoryMethodName; } else { if (this.parentBean) { return this.parentBean.factoryMethodName; } } } /** * BeanDefinition set factoryMethodName. * * @param {String} factoryMethodName * @api public */ BeanDefinition.prototype.setFactoryMethodName = function(factoryMethodName) { if (!factoryMethodName) { return; } this.factoryMethodName = factoryMethodName; } /** * BeanDefinition get bean scope: singleton(default), prototype. * * @return {String} scope * @api public */ BeanDefinition.prototype.getScope = function() { return this.scope; } /** * BeanDefinition set bean scope: singleton(default), prototype. * * @param {String} scope * @api public */ BeanDefinition.prototype.setScope = function(scope) { if (!scope) { return; } this.scope = scope; } /** * BeanDefinition check whether is abstract. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.isAbstract = function() { return this.abstract; } /** * BeanDefinition set abstract. * * @param {Boolean} lazyInit true|false * @api public */ BeanDefinition.prototype.setAbstract = function(abstract) { if (Utils.isNotNull(abstract)) { this.abstract = abstract; } } /** * BeanDefinition check whether is lazyInit. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.isLazyInit = function() { if (this.lazyInit) { return this.lazyInit; } else { if (this.parentBean) { return this.parentBean.lazyInit; } } } /** * BeanDefinition set lazyInit. * * @param {Boolean} lazyInit true|false * @api public */ BeanDefinition.prototype.setLazyInit = function(lazyInit) { if (Utils.isNotNull(lazyInit)) { this.lazyInit = lazyInit; } } /** * BeanDefinition check whether need to be proxied or not. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.needProxy = function() { return this.proxy; } /** * BeanDefinition set bean need proxy or not. * * @param {Boolean} proxy true|false * @api public */ BeanDefinition.prototype.setProxy = function(proxy) { if (Utils.isNotNull(proxy)) { this.proxy = proxy; } } /** * BeanDefinition check whether is asyncInit. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.isAsyncInit = function() { if (this.asyncInit) { return this.asyncInit; } else { if (this.parentBean) { return this.parentBean.asyncInit; } } } /** * BeanDefinition set bean asyncInit or not. * * @param {Boolean} asyncInit true|false * @api public */ BeanDefinition.prototype.setAsyncInit = function(asyncInit) { if (Utils.isNotNull(asyncInit)) { this.asyncInit = asyncInit; } } /** * BeanDefinition set bean an aspect or not. * * @param {Boolean} aspect true|false * @api public */ BeanDefinition.prototype.setAspect = function(aspect) { if (Utils.isNotNull(aspect)) { this.aspect = aspect; } } /** * BeanDefinition check whether is a aspect. * an aspect do not need to be proxied * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.isAspect = function() { if (this.aspect) { return this.aspect; } else { if (this.parentBean) { return this.parentBean.aspect; } } } /** * BeanDefinition get bean props settings. * * @return {Array} props settings * @api public */ BeanDefinition.prototype.getProps = function() { return this.propsOn; } /** * BeanDefinition get bean props settings. * * @return {Array} props settings * @api public */ BeanDefinition.prototype.getPropsOn = function() { return this.propsOn; } /** * BeanDefinition set bean props settings. * * @param {Array} propsOn props settings * @api public */ BeanDefinition.prototype.setPropsOn = function(propsOn) { if (!propsOn || !Utils.checkArray(propsOn) || !propsOn.length) { return; } this.updateSettingsOn(this, Constant.SETTINGS_PROPS_ON, propsOn); } /** * BeanDefinition get bean args settings. * * @return {Array} args settings * @api public */ BeanDefinition.prototype.getArgs = function() { return this.argsOn; } /** * BeanDefinition get bean args settings. * * @return {Array} args settings * @api public */ BeanDefinition.prototype.getArgsOn = function() { return this.argsOn; } /** * BeanDefinition set bean args settings. * * @param {Array} argsOn args settings * @api public */ BeanDefinition.prototype.setArgsOn = function(argsOn) { if (!argsOn || !Utils.checkArray(argsOn) || !argsOn.length) { return; } this.updateSettingsOn(this, Constant.SETTINGS_ARGS_ON, argsOn); } /** * BeanDefinition get bean factory args settings. * * @return {Array} factory args settings * @api public */ BeanDefinition.prototype.getFactoryArgs = function() { return this.factoryArgsOn; } /** * BeanDefinition get bean factory args settings. * * @return {Array} factory args settings * @api public */ BeanDefinition.prototype.getFactoryArgsOn = function() { return this.factoryArgsOn; } /** * BeanDefinition set factory args settings. * * @param {Array} factoryArgsOn factory args settings * @api public */ BeanDefinition.prototype.setFactoryArgsOn = function(factoryArgsOn) { if (!factoryArgsOn || !Utils.checkArray(factoryArgsOn) || !factoryArgsOn.length) { return; } this.updateSettingsOn(this, Constant.SETTINGS_FACTORY_ARGS_ON, factoryArgsOn); } /** * BeanDefinition get bean init method name. * * @return {String} bean init method name * @api public */ BeanDefinition.prototype.getInitMethodName = function() { if (this.initMethodName) { return this.initMethodName; } else { if (this.parentBean) { return this.parentBean.initMethodName; } } } /** * BeanDefinition set bean init method name. * * @param {String} initMethodName bean init method name * @api public */ BeanDefinition.prototype.setInitMethodName = function(initMethodName) { if (!initMethodName) { return; } this.initMethodName = initMethodName; } /** * BeanDefinition get bean destroy method name. * * @return {String} bean destroy method name * @api public */ BeanDefinition.prototype.getDestroyMethodName = function() { if (this.destroyMethodName) { return this.destroyMethodName; } else { if (this.parentBean) { return this.parentBean.destroyMethodName; } } } /** * BeanDefinition set bean destroy method name. * * @param {String} destroyMethodName bean destroy method name * @api public */ BeanDefinition.prototype.setDestroyMethodName = function(destroyMethodName) { if (!destroyMethodName) { return; } this.destroyMethodName = destroyMethodName; } /** * BeanDefinition get bean constructor function. * * @return {Function} bean constructor function * @api public */ BeanDefinition.prototype.getFunc = function() { return this.func; } /** * BeanDefinition set bean constructor function. * * @param {Function} func bean constructor function * @api public */ BeanDefinition.prototype.setFunc = function(func) { if (!this.func) { this.func = func; } } /** * BeanDefinition get bean order. * * @return {Number} bean order * @api public */ BeanDefinition.prototype.getOrder = function() { if (this.order || this.order == 0) { return this.order; } else { if (this.parentBean) { return this.parentBean.order; } } } /** * BeanDefinition set bean order. * * @param {Number} order bean order * @api public */ BeanDefinition.prototype.setOrder = function(order) { if (Utils.isNotNull(order)) { this.order = order; } } /** * BeanDefinition check bean whether is singleton or not. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.isSingleton = function() { return this.scope === Constant.SCOPE_SINGLETON; } /** * BeanDefinition check bean whether is prototype or not. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.isPrototype = function() { return this.scope === Constant.SCOPE_PROTOTYPE; } /** * BeanDefinition check bean whether has factoryBean or not. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.hasFactoryBean = function() { return Utils.isNotNull(this.factoryBeanName) && Utils.isNotNull(this.factoryMethodName); } /** * BeanDefinition check bean whether has initMethod or not. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.hasInitMethod = function() { return Utils.isNotNull(this.initMethodName); } /** * BeanDefinition check bean whether has parent or not. * * @return {Boolean} true|false * @api public */ BeanDefinition.prototype.hasParent = function() { return Utils.isNotNull(this.parentName); } /** * BeanDefinition update settings. * * @param {Object} beanDefinition * @param {String} key key: propsOn, argsOn, factoryArgsOn * @param {Array} settingsOn settings * @api private */ BeanDefinition.prototype.updateSettingsOn = function(BeanDefinition, key, settingsOn) { var settings = BeanDefinition[key]; var settingsMap = BeanUtils.getBeanSettingsMap(settings); var settingsOnMap = BeanUtils.getBeanSettingsMap(settingsOn); for (var name in settingsOnMap) { if (!settingsMap[name]) { settingsMap[name] = settingsOnMap[name]; } } BeanDefinition[key] = BeanUtils.getBeanSettingsArray(settingsMap); } module.exports = BeanDefinition; },{"../../util/beanUtil":36,"../../util/constant":37,"../../util/utils":44}],15:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat BeanDefinitionVisitor * Copyright(c) 2015 fantasyni * MIT Licensed */ var logger = require('pomelo-logger').getLogger('bearcat', 'BeanDefinitionVisitor'); var Constant = require('../../util/constant'); var Utils = require('../../util/utils'); /** * BeanDefinitionVisitor constructor function. * * @api public */ var BeanDefinitionVisitor = function(valueResolver) { this.valueResolver = valueResolver; } /** * BeanDefinitionVisitor set valueResolver. * * @param {Object} valueResolver * @api public */ BeanDefinitionVisitor.prototype.setValueResolver = function(valueResolver) { this.valueResolver = valueResolver; } /** * BeanDefinitionVisitor get valueResolver. * * @return {Object} valueResolver * @api public */ BeanDefinitionVisitor.prototype.getValueResolver = function() { return this.valueResolver; } /** * BeanDefinitionVisitor resolve string value. * * @param {String} strVal string value * @api public */ BeanDefinitionVisitor.prototype.resolveStringValue = function(strVal) { if (!this.valueResolver) { logger.error('No StringValueResolver specified'); return; } var resolvedValue = this.getValueResolver().resolveStringValue(strVal); return resolvedValue; } /** * BeanDefinitionVisitor visit beanDefinition. * * @param {Object} beanDefinition * @api public */ BeanDefinitionVisitor.prototype.visitBeanDefinition = function(beanDefinition) { this.visitParentName(beanDefinition); this.visitPropertyValues(beanDefinition); this.visitArgumentsValues(beanDefinition); } /** * BeanDefinitionVisitor visit parentName in beanDefinition. * * @param {Object} beanDefinition * @api private */ BeanDefinitionVisitor.prototype.visitParentName = function(beanDefinition) { var parentName = beanDefinition.getParentName(); if (Utils.isNotNull(parentName)) { var resolvedName = this.resolveStringValue(parentName); if (parentName !== resolvedName && Utils.isNotNull(resolvedName)) { beanDefinition.setParentName(resolvedName); } } } /** * BeanDefinitionVisitor visit properties values in beanDefinition. * * @param {Object} beanDefinition * @api private */ BeanDefinitionVisitor.prototype.visitPropertyValues = function(beanDefinition) { var props = beanDefinition.getProps(); for (var i = 0; i < props.length; i++) { var wbean = props[i]; if (wbean.getDependType() === Constant.DEPEND_TYPE_VALUE) { var value = wbean.getValue(); var resolvedValue = this.resolveStringValue(value); if (value !== resolvedValue && Utils.isNotNull(resolvedValue)) { wbean.setValue(resolvedValue); } } } } /** * BeanDefinitionVisitor visit argument values in beanDefinition. * * @param {Object} beanDefinition * @api private */ BeanDefinitionVisitor.prototype.visitArgumentsValues = function(beanDefinition) { var args = beanDefinition.getArgs(); for (var i = 0; i < args.length; i++) { var wbean = args[i]; if (wbean.getDependType() === Constant.DEPEND_TYPE_VALUE) { var value = wbean.getValue(); var resolvedValue = this.resolveStringValue(value); if (value !== resolvedValue && Utils.isNotNull(resolvedValue)) { wbean.setValue(resolvedValue); } } } } module.exports = BeanDefinitionVisitor; },{"../../util/constant":37,"../../util/utils":44,"pomelo-logger":57}],16:[function(require,module,exports){ /*! * .______ _______ ___ .______ ______ ___ .__________. * ( _ ) ( ____) / \ ( _ ) ( ) / \ ( ) * | |_) ) | |__ / ^ \ | |_) ) | ,----' / ^ \ `---| |---` * | _ < | __) / /_\ \ | ) | | / /_\ \ | | * | |_) ) | |____ / _____ \ | |) ----.| `----./ _____ \ | | * (______) (_______/__/ \__\ ( _| `.____) (______)__/ \__\ |__| * * Bearcat BeanModule * modified from seajs module.js * Copyright(c) 2015 fantasyni , http://seajs.org * MIT Licensed */ var RequestUtil = require('../../util/requestUtil'); var Utils = require('../../util/utils'); var anonymousMeta; var fetchingList = {}; var fetchedList = {}; var callbackList = {}; var STATUS = { // 0 - init INIT: 0, // 1 - The `module.uri` is being fetched FETCHING: 1, // 2 - The meta data has been saved to cachedMods SAVED: 2, // 3 - The `module.dependencies` are being loaded LOADING: 3, // 4 - The module are ready to execute LOADED: 4, // 5 - 404 ERROR: 5 } /** * BeanModule constructor function. * * @param {String} uri * @param {Array} dependencies * @param {Object} loader reference * @api public */ var BeanModule = function(uri, deps, loader) { this.uri = uri; this.dependencies = deps || []; this.deps = {}; this.remain = 0; this.entries = []; this.history = {}; this.loader = loader; this.callback = null; this.status = STATUS.INIT; } /** * BeanModule resolve dependencies uri. * * @api private */ BeanModule.prototype.resolve = function() { var mod = this var ids = mod.dependencies var uris = [] var loader = this.getLoader(); var len = ids.length; for (var i = 0; i < len; i++) { uris[i] = loader.resolve(ids[i], mod.uri); } return uris } /** * BeanModule pass entry node into dependencies. * * @api private */ BeanModule.prototype.pass = function() { var mod = this var len = mod.dependencies.length // mod.entries changes dynamiclly for (var i = 0; i < mod.entries.length; i++) { var entry = mod.entries[i]; var count = 0 for (var j = 0; j < len; j++) { var m = mod.deps[mod.dependencies[j]] // If the module is unload and unused in the entry, pass entry to it if (m.status < STATUS.LOADED && !entry.history.hasOwnProperty(m.uri)) { entry.history[m.uri] = true count++ m.entries.push(entry) if (m.status === STATUS.LOADING) { m.pass() } } } // If has passed the entry to it's dependencies, modify the entry's count and del it in the module if (count > 0) { entry.remain += count - 1 mod.entries.shift() i-- } } } /** * BeanModule load script files. * * @api private */ BeanModule.prototype.load = function() { var mod = this; if (this.status >= STATUS.LOADING) { return; } var loader = this.getLoader(); mod.status = STATUS.LOADING; var uris = mod.resolve(); for (var i = 0, len = uris.length; i < len; i++) { mod.deps[mod.dependencies[i]] = loader.get(uris[i]) } // Pass entry to it's dependencies mod.pass(); // If module has entries not be passed, call onload if (mod.entries.length) { mod.onload() return } // Begin parallel loading var requestCache = {}; var m; for (i = 0; i < len; i++) { m = loader.get(uris[i]); if (m.status < STATUS.FETCHING) { m.fetch(requestCache) } else if (m.status === STATUS.SAVED) { m.load() } } // Send all requests at last to avoid cache bug in IE6-9. Issues#808 for (var requestUri in requestCache) { if (requestCache.hasOwnProperty(requestUri)) { requestCache[requestUri]() } } } /** * BeanModule onload script file event callback. * * @api private */ BeanModule.prototype.onload = function() { var mod = this mod.status = STATUS.LOADED // When sometimes cached in IE, exec will occur before onload, make sure len is an number var len = (mod.entries || []).length; for (var i = 0; i < len; i++) { var entry = mod.entries[i] if (--entry.remain === 0) { entry.callback() } } delete mod.entries } /** * BeanModule error callback. * * @api private */ BeanModule.prototype.error = function() { var mod = this mod.onload() mod.status = STATUS.ERROR } /** * BeanModule fetch script files using async