base-domain
Version:
simple module to help build Domain-Driven Design
462 lines (340 loc) • 13.1 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>src/lib/base-factory.coffee</title>
<link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
<link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
<link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
<link rel="icon" href="../assets/favicon.ico">
<script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
</head>
<body class="yui3-skin-sam">
<div id="doc">
<div id="hd" class="yui3-g header">
<div class="yui3-u-3-4">
<h1><img src="../assets/css/logo.png" title="" width="117" height="52"></h1>
</div>
<div class="yui3-u-1-4 version">
<em>API Docs for: </em>
</div>
</div>
<div id="bd" class="yui3-g">
<div class="yui3-u-1-4">
<div id="docs-sidebar" class="sidebar apidocs">
<div id="api-list">
<h2 class="off-left">APIs</h2>
<div id="api-tabview" class="tabview">
<ul class="tabs">
<li><a href="#api-classes">Classes</a></li>
<li><a href="#api-modules">Modules</a></li>
</ul>
<div id="api-tabview-filter">
<input type="search" id="api-filter" placeholder="Type to filter APIs">
</div>
<div id="api-tabview-panel">
<ul id="api-classes" class="apis classes">
<li><a href="../classes/Base.html">Base</a></li>
<li><a href="../classes/BaseDict.html">BaseDict</a></li>
<li><a href="../classes/BaseFactory.html">BaseFactory</a></li>
<li><a href="../classes/BaseList.html">BaseList</a></li>
<li><a href="../classes/BaseModel.html">BaseModel</a></li>
<li><a href="../classes/BaseRepository.html">BaseRepository</a></li>
<li><a href="../classes/DictFactory.html">DictFactory</a></li>
<li><a href="../classes/DomainError.html">DomainError</a></li>
<li><a href="../classes/Entity.html">Entity</a></li>
<li><a href="../classes/Facade.html">Facade</a></li>
<li><a href="../classes/Fixture.html">Fixture</a></li>
<li><a href="../classes/FixtureModel.html">FixtureModel</a></li>
<li><a href="../classes/Includer.html">Includer</a></li>
<li><a href="../classes/ListFactory.html">ListFactory</a></li>
<li><a href="../classes/MasterRepository.html">MasterRepository</a></li>
<li><a href="../classes/PropInfo.html">PropInfo</a></li>
<li><a href="../classes/ResourceClientInterface.html">ResourceClientInterface</a></li>
<li><a href="../classes/TypeInfo.html">TypeInfo</a></li>
<li><a href="../classes/Util.html">Util</a></li>
</ul>
<ul id="api-modules" class="apis modules">
<li><a href="../modules/base-domain.html">base-domain</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="yui3-u-3-4">
<div id="api-options">
Show:
<label for="api-show-inherited">
<input type="checkbox" id="api-show-inherited" checked>
Inherited
</label>
<label for="api-show-protected">
<input type="checkbox" id="api-show-protected">
Protected
</label>
<label for="api-show-private">
<input type="checkbox" id="api-show-private">
Private
</label>
<label for="api-show-deprecated">
<input type="checkbox" id="api-show-deprecated">
Deprecated
</label>
</div>
<div class="apidocs">
<div id="docs-main">
<div class="content">
<h1 class="file-heading">File: src/lib/base-factory.coffee</h1>
<div class="file">
<pre class="code prettyprint linenums">
Base = require './base'
###*
Base factory class of DDD pattern.
create instance of model
the parent "Base" class just simply gives a @getFacade() method.
@class BaseFactory
@extends Base
@module base-domain
###
class BaseFactory extends Base
###*
model name to handle
@property modelName
@static
@protected
@type String
###
@modelName: null
###*
name of dict model to create dict of @modelName
@property dictModelName
@static
@protected
@type String
###
@dictModelName: null
###*
get anonymous factory class
@method getAnonymousClass
@param {String} modelName
@return {Function}
###
@getAnonymousClass: (modelName) ->
class AnonymousFactory extends BaseFactory
@modelName : modelName
@isAnonymous: true
return AnonymousFactory
###*
constructor
@constructor
###
constructor: ->
###*
get model class this factory handles
@method getModelClass
@return {Function}
###
@_ModelClass: undefined
getModelClass: ->
@_ModelClass ?= @getFacade().getModel(@constructor.modelName)
###*
create empty model instance
@method createEmptyModel
@return {BaseModel}
###
createEmptyModel: ->
@createFromObject({})
createEmpty: -> @createFromObject({})
###*
create instance of model class by plain object
for each prop, values are set by Model#set(prop, value)
@method createFromObject
@public
@param {Object} obj
@param {BaseModel} baseModel fallback properties
@return {BaseModel} model
###
createFromObject: (obj) ->
ModelClass = @getModelClass()
return obj if obj instanceof ModelClass
obj = @beforeCreateFromObject obj
if not obj? or typeof obj isnt 'object'
return null
model = new ModelClass()
for own prop, value of obj
@setValueToModel model, prop, value
propInfo = ModelClass.getPropInfo()
for prop of propInfo.dic
continue if model[prop]?
@setEmptyValueToModel model, prop, propInfo
return @afterCreateModel model
###*
set value to model in creation
@method setValueToModel
@private
###
setValueToModel: (model, prop, value) ->
typeInfo = model.getTypeInfo(prop)
switch typeInfo?.name
when 'MODEL_LIST'
@setSubModelListToModel(model, prop, value)
when 'MODEL'
@setSubModelToModel(model, prop, value)
when 'MODEL_DICT'
@setSubModelDictToModel(model, prop, value)
else # set normal props
model.setNonEntityProp(prop, value)
###*
set empty values to model in creation
@method setEmptyValueToModel
@private
###
setEmptyValueToModel: (model, prop, propInfo) ->
typeInfo = propInfo.getTypeInfo(prop)
switch typeInfo.name
when 'MODEL'
if propInfo.isEntityProp(prop)
@fetchEntityProp(model, prop, typeInfo) # trying to get entity by id
else
@createEmptyNonEntityProp(model, prop, typeInfo)
when 'MODEL_LIST'
@setSubModelListToModel(model, prop, null)
when 'MODEL_DICT'
@setSubModelDictToModel(model, prop, null)
else
model[prop] = undefined
###*
creates list and set it to the model
@method setSubModelListToModel
@private
###
setSubModelListToModel: (model, prop, value) ->
typeInfo = model.getTypeInfo(prop)
subModelName = typeInfo.model
subModelFactory = @getFacade().createFactory(subModelName, on)
listModelName = typeInfo.listName
list = subModelFactory.createList(listModelName, value)
model.setNonEntityProp prop, list
return
###*
set submodel to the prop
@method setSubModelToModel
@private
###
setSubModelToModel: (model, prop, value) ->
subModelName = model.getTypeInfo(prop).model
useAnonymousFactory = on # if no factory is declared, altered one is used
subModelFactory = @getFacade().createFactory(subModelName, useAnonymousFactory)
SubModel = subModelFactory.getModelClass()
if value not instanceof SubModel
value = subModelFactory.createFromObject(value)
if SubModel.isEntity
model.setEntityProp(prop, value)
else
model.setNonEntityProp(prop, value)
return
###*
set submodel dict to the prop
@method setSubModelToModel
@private
###
setSubModelDictToModel: (model, prop, value) ->
typeInfo = model.getTypeInfo(prop)
subModelName = typeInfo.model
subModelFactory = @getFacade().createFactory(subModelName, on)
dictModelName = typeInfo.dictName
dict = subModelFactory.createDict(dictModelName, value)
model.setNonEntityProp prop, dict
return
###*
fetch submodel(s) by id
available only when repository of submodel implements 'getByIdSync'
(MasterRepository implements one)
@method fetchEntityProp
@private
###
fetchEntityProp: (model, prop, typeInfo) ->
idPropName = typeInfo.idPropName
try
Repository = @getFacade().getRepository typeInfo.model
return if not Repository.storeMasterTable
repository = new Repository()
return if not repository.getByIdSync
catch e
return
id = model[idPropName]
subModel = repository.getByIdSync(id)
model.setEntityProp(prop, subModel) if subModel
###*
create empty non-entity model and set to the prop
@method createEmptyNonEntityProp
@private
###
createEmptyNonEntityProp: (model, prop, typeInfo) ->
factory = @getFacade().createFactory typeInfo.model, true
submodel = factory.createEmpty()
model.setNonEntityProp(prop, submodel)
###*
modify plain object before @createFromObject(obj)
@method beforeCreateFromObject
@protected
@abstract
@param {Object} obj
@return {Object} obj
###
beforeCreateFromObject: (obj) ->
return obj
###*
modify model after createFromObject(obj), createEmptyModel()
@method afterCreateModel
@protected
@abstract
@param {BaseModel} model
@return {BaseModel} model
###
afterCreateModel: (model) ->
return model
###*
create model list
@method createList
@public
@param {String} listModelName model name of list
@param {any} obj
@return {BaseList} list
###
createList: (listModelName, obj) ->
ListFactory = @getFacade().constructor.ListFactory
listFactory = ListFactory.create(listModelName, @)
return listFactory.createFromObject obj
###*
create model dict
@method createDict
@public
@param {String} dictModelName model name of dict
@param {any} obj
@return {BaseDict} dict
###
createDict: (dictModelName, obj) ->
DictFactory = @getFacade().constructor.DictFactory
dictFactory = DictFactory.create(dictModelName, @)
return dictFactory.createFromObject obj
module.exports = BaseFactory
</pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="../assets/vendor/prettify/prettify-min.js"></script>
<script>prettyPrint();</script>
<script src="../assets/js/yui-prettify.js"></script>
<script src="../assets/../api.js"></script>
<script src="../assets/js/api-filter.js"></script>
<script src="../assets/js/api-list.js"></script>
<script src="../assets/js/api-search.js"></script>
<script src="../assets/js/apidocs.js"></script>
</body>
</html>