[WIP] Get rid of parameters sifting

Change-Id: Ie9185c1abfd4edcc0b9e4920fa674e75718b6222
This commit is contained in:
Timur Sufiev 2015-08-28 13:13:59 +03:00
parent 5cbbc51b35
commit b1df00f01a
3 changed files with 133 additions and 137 deletions

View File

@ -131,11 +131,12 @@
'@type': Object,
'base': {
'@class': fields.linkedcollection.extend({
create: function(json, parameters) {
parameters = Object.create(parameters);
parameters.toCls = models.StandardActions;
parameters.neededCls = models.Root;
parameters.substitutedEntryID = 'standardActions';
create: function(json) {
var parameters = {
toCls: models.StandardActions,
neededCls: models.Root,
substitutedEntryID: 'standardActions'
};
return fields.linkedcollection.create.call(this, json, parameters);
}
}, {
@ -360,11 +361,12 @@
return this.extend({}, {
'action': {
'@class': fields.linkedcollection.extend({
create: function(json, parameters) {
parameters = Object.create(parameters);
parameters.toCls = models.Actions;
parameters.neededCls = models.Workbook;
parameters.substitutedEntryID = 'actions';
create: function(json) {
var parameters = {
toCls: models.Actions,
neededCls: models.Workbook,
substitutedEntryID: 'actions'
};
return fields.linkedcollection.create.call(this, json, parameters);
}
}, {
@ -380,11 +382,12 @@
return this.extend({}, {
'workflow': {
'@class': fields.linkedcollection.extend({
create: function(json, parameters) {
parameters = Object.create(parameters);
parameters.toCls = models.Workflows;
parameters.neededCls = models.Workbook;
parameters.substitutedEntryID = 'workflows';
create: function(json) {
var parameters = {
toCls: models.Workflows,
neededCls: models.Workbook,
substitutedEntryID: 'workflows'
};
return fields.linkedcollection.create.call(this, json, parameters);
}
}, {
@ -403,12 +406,28 @@
'workflow': models.WorkflowTaskMixin
};
function TaskFactory(json, parameters) {
var type = json.type || 'action';
var baseClass = taskTypes[parameters.wfType];
var mixinClass = taskTypes[type];
var taskClass = mixinClass.call(baseClass);
return taskClass.create(json, parameters);
function TaskFactoryFactory(baseClass) {
return function TaskFactory(json, parameters) {
var type = json.type || 'action';
var mixinClass = taskTypes[type];
var taskClass = mixinClass.call(baseClass);
return taskClass.create(json, parameters);
}
}
function createTaskFactory(baseClass) {
return function(json, parameters) {
var self = Barricade.MutableObject.create.call(this, json, parameters);
self.on('childChange', function(child, op) {
if ( op === 'taskType' ) {
var taskId = child.getID();
var taskPos = self.getPosByID(taskId);
var taskData = child.toJSON();
self.set(taskPos, TaskFactoryFactory(baseClass)(taskData, {id: taskId}));
}
});
return self;
}
}
models.Workflow = Barricade.ImmutableObject.extend({
@ -450,23 +469,13 @@
'*': {
'@type': String
}
},
}
});
models.ReverseWorkflow = models.Workflow.extend({}, {
'tasks': {
'@class': Barricade.MutableObject.extend({
create: function(json, parameters) {
var self = Barricade.MutableObject.create.call(this, json, parameters);
self.on('childChange', function(child, op, arg) {
if ( op === 'taskType' ) {
var taskId = child.getID();
var params = child._parameters;
var taskPos = self.getPosByID(taskId);
var taskData = child.toJSON();
params.id = taskId;
self.set(taskPos, TaskFactory(taskData, params));
}
});
return self;
}
create: createTaskFactory(models.ReverseWFTask)
}, {
'@type': Object,
'@meta': {
@ -474,14 +483,11 @@
},
'?': {
'@class': models.Task,
'@factory': TaskFactory
'@factory': TaskFactoryFactory(models.ReverseWFTask)
}
})
}
});
models.ReverseWorkflow = models.Workflow.extend({});
models.DirectWorkflow = models.Workflow.extend({}, {
'task-defaults': {
'@type': Object,
@ -513,7 +519,20 @@
}
})
}
},
'tasks': {
'@class': Barricade.MutableObject.extend({
create: createTaskFactory(models.DirectWFTask)
}, {
'@type': Object,
'@meta': {
'index': 5
},
'?': {
'@class': models.Task,
'@factory': TaskFactoryFactory(models.DirectWFTask)
}
})
}
});
@ -524,7 +543,6 @@
function workflowFactory(json, parameters) {
var type = json.type || 'direct';
parameters.wfType = type;
return workflowTypes[type].create(json, parameters);
}
@ -546,11 +564,8 @@
if ( op === 'workflowType' ) {
var workflowId = child.getID();
var workflowPos = self.getPosByID(workflowId);
var params = child._parameters;
var workflowData = child.toJSON();
params.wfType = child.type;
params.id = workflowId;
self.set(workflowPos, workflowFactory(workflowData, params));
self.set(workflowPos, workflowFactory(workflowData, {id: workflowId}));
}
});
return self;

View File

@ -261,78 +261,55 @@ var Barricade = (function () {
* @mixin
* @memberof Barricade
*/
Deferrable = Blueprint.create(function () {
var existingCreate = this.create;
Deferrable = Blueprint.create(function (schema) {
var self = this,
needed,
deferred = schema.hasOwnProperty('@ref')
? Deferred.create(schema['@ref'].needs, getter, resolver)
: null;
this.create = function() {
var self = existingCreate.apply(this, arguments),
schema = self._schema,
needed,
deferred = schema.hasOwnProperty('@ref')
? Deferred.create(schema['@ref'].needs, getter, resolver)
: null;
if (schema.hasOwnProperty('@ref') && !schema['@ref'].processor) {
schema['@ref'].processor = function (o) { return o.val; };
}
if (schema.hasOwnProperty('@ref') && !schema['@ref'].processor) {
schema['@ref'].processor = function (o) { return o.val; };
function getter(neededVal) {
return schema['@ref'].getter({standIn: self, needed: neededVal});
}
function resolver(retrievedValue) {
self.emit('replace', schema['@ref'].processor({
val: retrievedValue,
standIn: self,
needed: needed
}));
}
this.resolveWith = function (obj) {
var allResolved = true;
if (deferred && !deferred.isResolved()) {
if (deferred.needs(obj)) {
needed = obj;
deferred.resolve(obj);
} else {
allResolved = false;
}
}
function getter(neededVal) {
return schema['@ref'].getter(
{standIn: self, needed: neededVal});
}
function resolver(retrievedValue) {
self.emit('replace', schema['@ref'].processor({
val: retrievedValue,
standIn: self,
needed: needed
}));
}
self.resolveWith = function (obj) {
var allResolved = true;
if (deferred && !deferred.isResolved()) {
if (deferred.needs(obj)) {
needed = obj;
deferred.resolve(obj);
} else {
if (this.instanceof(Container)) {
this.each(function (index, value) {
if (!value.resolveWith(obj)) {
allResolved = false;
}
}
});
}
if (this.instanceof(Container)) {
this.each(function (index, value) {
if (!value.resolveWith(obj)) {
allResolved = false;
}
});
}
return allResolved;
};
self.isPlaceholder = function () {
return !!deferred;
};
return self;
return allResolved;
};
this.isValidRef = function(instance) {
var clsRef = this._schema['@ref'];
if (!clsRef) {
return false;
}
if (typeof clsRef.to === 'function') {
return this._safeInstanceof(instance, clsRef.to());
} else if (typeof clsRef.to === 'object') {
return this._safeInstanceof(instance, clsRef.to);
}
throw new Error('Ref.to was ' + clsRef.to);
this.isPlaceholder = function () {
return !!deferred;
};
return this;
});
/**
@ -581,7 +558,7 @@ var Barricade = (function () {
* @mixes Barricade.Identifiable
* @extends Barricade.Identifiable
*/
Base = Deferrable.call(Extendable.call(InstanceofMixin.call({
Base = Extendable.call(InstanceofMixin.call({
/**
* Creates a `Base` instance
* @memberof Barricade.Base
@ -592,7 +569,7 @@ var Barricade = (function () {
create: function (json, parameters) {
var self = this.extend({}),
schema = self._schema,
isUsed, id;
isUsed;
self._parameters = parameters = parameters || {};
@ -608,16 +585,14 @@ var Barricade = (function () {
Observable.call(self);
Omittable.call(self, isUsed);
Deferrable.call(self, schema);
Validatable.call(self, schema);
if (schema.hasOwnProperty('@enum')) {
Enumerated.call(self, schema['@enum']);
}
if ( Object.hasOwnProperty.call(parameters, 'id') ) {
id = parameters.id;
}
Identifiable.call(self, id);
Identifiable.call(self, parameters.id);
return self;
},
@ -738,7 +713,7 @@ var Barricade = (function () {
? this._getPrettyJSON(options)
: this._getJSON(options);
}
})));
}));
/**
* @class
@ -757,15 +732,9 @@ var Barricade = (function () {
var self = Base.create.call(this, json, parameters);
return self.on('_addedElement', function (key) {
// every time a new element is added we need to set the
// listeners for it and try to resolve any references,
// passing the resolution upward if needed
self._attachListeners(key);
self._tryResolveOn(self.get(key));
}).each(function (index, value) {
// also we bind the handlers and do reference resolution
// for all the children that are already here (no upward
// resolution here)
self._attachListeners(index);
value.resolveWith(self);
});
@ -825,8 +794,21 @@ var Barricade = (function () {
* @private
*/
_isCorrectType: function (instance, class_) {
var self = this;
function isRefTo() {
if (typeof class_._schema['@ref'].to === 'function') {
return self._safeInstanceof(instance,
class_._schema['@ref'].to());
} else if (typeof class_._schema['@ref'].to === 'object') {
return self._safeInstanceof(instance,
class_._schema['@ref'].to);
}
throw new Error('Ref.to was ' + class_._schema['@ref'].to);
}
return this._safeInstanceof(instance, class_) ||
class_.isValidRef(instance);
(class_._schema.hasOwnProperty('@ref') && isRefTo());
},
/**
@ -911,10 +893,10 @@ var Barricade = (function () {
* @memberof Barricade.Arraylike
* @private
*/
_sift: function (json, parameters) {
_sift: function (json) {
return json.map(function (el) {
return this._keyClassCreate(
this._elSymbol, this._elementClass, el, parameters);
this._elSymbol, this._elementClass, el);
}, this);
},
@ -1070,11 +1052,11 @@ var Barricade = (function () {
* @memberof Barricade.ImmutableObject
* @private
*/
_sift: function (json, parameters) {
_sift: function (json) {
var self = this;
return this.getKeys().reduce(function (objOut, key) {
objOut[key] = self._keyClassCreate(
key, self._keyClasses[key], json[key], parameters);
objOut[key] =
self._keyClassCreate(key, self._keyClasses[key], json[key]);
return objOut;
}, {});
},
@ -1211,12 +1193,10 @@ var Barricade = (function () {
* @memberof Barricade.MutableObject
* @private
*/
_sift: function (json, parameters) {
_sift: function (json) {
return Object.keys(json).map(function (key) {
var params = Object.create(parameters);
params.id = key;
return this._keyClassCreate(
this._elSymbol, this._elementClass, json[key], params);
return this._keyClassCreate(this._elSymbol, this._elementClass,
json[key], {id: key});
}, this);
},

View File

@ -131,11 +131,12 @@ describe('merlin models:', function() {
},
'linkedField': {
'@class': fields.linkedcollection.extend({
create: function(json, parameters) {
parameters = Object.create(parameters);
parameters.toCls = collectionCls;
parameters.neededCls = linkedObjCls;
parameters.substitutedEntryID = 'realCollection';
create: function(json) {
var parameters = {
toCls: collectionCls,
neededCls: linkedObjCls,
substitutedEntryID: 'realCollection'
};
return fields.linkedcollection.create.call(this, json, parameters);
},
_dropDownLimit: 4