[WIP] Get rid of parameters sifting
Change-Id: Ie9185c1abfd4edcc0b9e4920fa674e75718b6222
This commit is contained in:
parent
5cbbc51b35
commit
b1df00f01a
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
},
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue