daoBuilder function
- Usual additions
- ConnectionManager class
- daoBuilder function
- User class
- getUser function
- getLocale function
The function will provide the data access objects for the business object instances. It has the following signature:
- daoBuilder( dataSource, modelPath, modelName )
dataSource |
The name of the data source. Required string. |
modelPath |
The model definition path of the business object model instance that the data access object belongs to. Required string. |
modelName |
The name of the business object model. Required string. |
returns |
The data access object of the business object model. It must inherit DaoBase. |
The function composes the full path of the data access object using the arguments, reads the constructor of it and creates an instance of the type. If the data access object cannot be instantiated the function returns a DaoError object that describes the issue.
If a model demands a special data access builder, it can be provided via extensions.
The code hereunder demonstrates a daoBuilder()
function. It searches the file of data access
object in a subdirectory compared to the model file. The name of the subdirectory should match
the name of the data source:
'use strict';
var fs = require('fs');
var path = require('path');
var bo = require('business-objects');
var convert = require('../lib/convert.js');
var DaoBase = bo.dataAccess.DaoBase;
var DaoError = bo.dataAccess.DaoError;
var daoBuilder = function (dataSource, modelPath, modelName) {
if (typeof dataSource !== 'string' || dataSource.trim().length === 0)
throw new Error('The dataSource argument of daoBuilder function must be a non-empty string.');
if (typeof modelPath !== 'string' || modelPath.trim().length === 0)
throw new Error('The modelPath argument of daoBuilder function must be a non-empty string.');
var modelStats = fs.statSync(modelPath);
if (!modelStats.isFile())
throw new Error('The modelPath argument of daoBuilder function is not a valid file path: ' + modelPath);
var daoPath = path.join(
path.dirname(modelPath),
path.basename(modelPath, path.extname(modelPath)) + '.' + dataSource + path.extname(modelPath)
);
var daoStats = fs.statSync(daoPath);
if (!daoStats.isFile())
throw new Error('The required data access file does not exist: ' + daoPath);
var daoCtor = require(daoPath);
if (typeof daoCtor !== 'function')
throw new Error('The data access file must return a constructor: ' + daoPath);
var daoInstance = new daoConstructor();
if (!(daoInstance instanceof DaoBase) && daoInstance.super_ !== DaoBase)
throw new DaoError('daoType', daoPath);
return daoInstance;
};
module.exports = daoBuilder;
The dashize()
function converts modelName
to model-name
. If the model file always
contains one model, then the commented line can be used as well. This simpler solution,
however, cannot be used in all cases.