Skip to content

Commit

Permalink
Add support for RawPropertyValueToObjectConverter.foreignDescriptor t…
Browse files Browse the repository at this point in the history
…o be descriptor or reference
  • Loading branch information
tejaede committed Nov 15, 2017
1 parent 521605a commit 6a201b2
Show file tree
Hide file tree
Showing 8 changed files with 178 additions and 53 deletions.
1 change: 0 additions & 1 deletion .jshintrc
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@
"Map": true,
"Set": true,
"URL": true,
"console": true,
"Promise": true,
"Event": true,
"CustomEvent": true,
Expand Down
11 changes: 8 additions & 3 deletions data/converter/raw-property-value-to-object-converter.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,10 @@ exports.RawPropertyValueToObjectConverter = Converter.specialize( /** @lends Raw
}

value = deserializer.getProperty("foreignDescriptor");
if (value) {
if (value instanceof ObjectDescriptorReference) {
this._foreignDescriptorReference = value;
} else if (value) {
this.foreignDescriptor = value;
}

value = deserializer.getProperty("service");
Expand Down Expand Up @@ -188,10 +190,13 @@ exports.RawPropertyValueToObjectConverter = Converter.specialize( /** @lends Raw
foreignDescriptor: {
serializable: false,
get: function () {
return this._foreignDescriptorReference && this._foreignDescriptorReference.promise(require);
var isReference = this._foreignDescriptor instanceof ObjectDescriptorReference;
return isReference ? this._foreignDescriptor :
this._foreignDescriptor ? Promise.resolve(this._foreignDescriptor) :
this._foreignDescriptorReference && this._foreignDescriptorReference.promise(require);
},
set: function (descriptor) {
this._foreignDescriptorReference = new ObjectDescriptorReference().initWithValue(descriptor);
this._foreignDescriptor = descriptor;
}
},

Expand Down
4 changes: 1 addition & 3 deletions data/service/data-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -1464,9 +1464,7 @@ exports.DataService = Montage.specialize(/** @lends DataService.prototype */ {
},

_dataIdentifierByObject: {
get: function() {
return this.__objectsByDataIdentifier || (this.__objectsByDataIdentifier = new WeakMap());
}
value: new WeakMap()
},

/**
Expand Down
12 changes: 1 addition & 11 deletions data/service/expression-data-mapping.js
Original file line number Diff line number Diff line change
Expand Up @@ -432,10 +432,6 @@ exports.ExpressionDataMapping = DataMapping.specialize(/** @lends ExpressionData
requiredObjectProperties = rule ? rule.requirements : [],
promise;

if (property === "position" || property === "childPosition") {
console.log(object, rule);
debugger;
}

if (prefetchRequirements) {
promise = this.service.rootService.getObjectPropertyExpressions(object, requiredObjectProperties);
Expand Down Expand Up @@ -541,7 +537,7 @@ exports.ExpressionDataMapping = DataMapping.specialize(/** @lends ExpressionData
value = value.then(function (data) {
self._assignDataToObjectProperty(object, propertyDescriptor, data);
if (inverse) {
self._assignObjectAsInverseProperty(object, propertyDescriptor, data, inverse)
self._assignObjectAsInverseProperty(object, descriptor, data, inverse)
}
return null;
});
Expand Down Expand Up @@ -754,9 +750,6 @@ exports.ExpressionDataMapping = DataMapping.specialize(/** @lends ExpressionData
rawRule = rawRules[propertyName];
if (this._shouldMapRule(rawRule, true)) {
rule = this._makeRuleFromRawRule(rawRule, propertyName, true, true);
if (!rule.targetPath) {
debugger;
}
this._ownObjectMappingRules.set(rule.targetPath, rule);
}

Expand Down Expand Up @@ -789,9 +782,6 @@ exports.ExpressionDataMapping = DataMapping.specialize(/** @lends ExpressionData
rawRule = rawRules[propertyName];
if (this._shouldMapRule(rawRule, false)) {
rule = this._makeRuleFromRawRule(rawRule, propertyName, false, false);
if (!rule.targetPath) {
debugger;
}
this._ownObjectMappingRules.set(rule.targetPath, rule);
}
if (this._shouldMapRule(rawRule, true)) {
Expand Down
47 changes: 38 additions & 9 deletions data/service/http-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -317,8 +317,7 @@ var HttpService = exports.HttpService = RawDataService.specialize(/** @lends Htt
error = HttpError.withRequestAndURL(request, parsed.url);
reject(error);
};
method = self.methodForParsedArguments(parsed);
request.open(method, parsed.url, true);
request.open(parsed.body ? "POST" : "GET", parsed.url, true);

self.setHeadersForQuery(parsed.headers, parsed.query, parsed.url);

Expand Down Expand Up @@ -371,26 +370,26 @@ var HttpService = exports.HttpService = RawDataService.specialize(/** @lends Htt
}
},

methodForParsedArguments: {
value: function (parsed) {
return parsed.body ? "POST" : "GET";
}
},



/**
* @private
* @method
*/
_parseFetchHttpRawDataArguments: {
value: function (/* url [, headers [, body [, types]]][, sendCredentials] */) {
value: function (/* url [, headers [, body [, types [, query [, method]]]]][, sendCredentials] */) {
var parsed, last, i, n;
// Parse the url argument, setting the "last" argument index to -1
// if the URL is invalid.

parsed = {url: arguments[0]};
last = typeof parsed.url === "string" ? arguments.length - 1 : -1;
if (last < 0) {
console.warn(new Error("Invalid URL for fetchHttpRawData()"));
}


// Parse the sendCredentials argument, which must be the last
// argument if it is provided, and set the "last" argument index to
// point just past the last non-sendCredentials argument.
Expand Down Expand Up @@ -439,17 +438,47 @@ var HttpService = exports.HttpService = RawDataService.specialize(/** @lends Htt
}
}


if (last === 5 && arguments[4] instanceof DataQuery) {
parsed.query = arguments[4];
} else if (last === 5 && typeof arguments[4] === "string") {
parsed.method = arguments[4];
} else if (last === 4 && arguments[3] instanceof DataQuery) {
parsed.query = arguments[3];
} else if (last === 4 && typeof arguments[3] === "string") {
parsed.method = arguments[3];
} else if (last === 3 && typeof arguments[2] === "string") {
parsed.method = arguments[2];
}

// Return the parsed arguments.
return last >= 0 ? parsed : undefined;
}
},

createHttpRawData: {
value: function () {

}
},

deleteHttpRawData: {
value: function () {

}
},

readHttpRawData: {
value: function () {
return this.fetchHttpRawData.apply(this, arguments);
}
},

updateHttpRawData: {
value: function () {

}
},

/**
* @private
* @method
Expand Down
38 changes: 35 additions & 3 deletions data/service/raw-data-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,27 @@ exports.RawDataService = DataService.specialize(/** @lends RawDataService.protot
}
},

createRawData: {
value: function (object) {
return this.nullPromise;
}
},

//deleteRawData already exists..

readRawData: {
value: function (stream) {
return this.fetchRawData(stream);
}
},

updateRawData: {
value: function (stream) {
return this.fetchRawData(stream);
}
},


/**
* Called through MainService when consumer has indicated that he has lost interest in the passed DataStream.
* This will allow the RawDataService feeding the stream to take appropriate measures.
Expand Down Expand Up @@ -262,9 +283,20 @@ exports.RawDataService = DataService.specialize(/** @lends RawDataService.protot
*/
deleteDataObject: {
value: function (object) {
var record = {};
this._mapObjectToRawData(object, record);
return this.deleteRawData(record, object);
var self = this,
record = {},
mapResult = this._mapObjectToRawData(object, record),
result;

if (mapResult instanceof Promise) {
result = mapResult.then(function () {
return self.deleteRawData(record, object);
});
} else {
result = this.deleteRawData(record, object);
}

return result;
}
},

Expand Down
4 changes: 2 additions & 2 deletions test/all.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,9 @@ module.exports = require("montage-testing").run(require, [
// {name: "spec/data/data-selector"},
// {name: "spec/data/data-service"},
// {name: "spec/data/data-stream"},
{name: "spec/data/expression-data-mapping"},
// {name: "spec/data/expression-data-mapping"},
// {name: "spec/data/enumeration"},
// {name: "spec/data/http-service"},
{name: "spec/data/http-service"},
// {name: "spec/data/object-descriptor"},
// {name: "spec/data/property-descriptor"},
// {name: "spec/data/raw-data-service"},
Expand Down
114 changes: 93 additions & 21 deletions test/spec/data/http-service.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
var DataService = require("montage/data/service/data-service").DataService,
HttpService = require("montage/data/service/http-service").HttpService,
DataQuery = require("montage/data/model/data-query").DataQuery,
DataSelector = require("montage/data/service/data-selector").DataSelector,
Criteria = require("montage/core/criteria").Criteria,
WeatherReport = require("./logic/model/weather-report").WeatherReport,
Expand All @@ -8,26 +9,97 @@ var DataService = require("montage/data/service/data-service").DataService,

describe("An HttpService", function() {

it("needs to be tested", function (done) {

var dataExpression = "city = $city && unit = $unit && country = $country";
var dataParameters = {
city: 'San-Francisco',
country: 'us',
unit: 'imperial'
};
var dataCriteria = new Criteria().initWithExpression(dataExpression, dataParameters);
var dataType = WeatherReport.TYPE;
var dataQuery = DataSelector.withTypeAndCriteria(dataType, dataCriteria);

var mainService = new DataService();
//TODO: Test with addChildService in addition to registerChildService
mainService.registerChildService(new WeatherService()).then(function () {
mainService.fetchData(dataQuery).then(function (weatherReports) {
expect(typeof weatherReports[0].temp).toBe('number');
done();
});
})
});
// it("needs to be tested", function (done) {

// var dataExpression = "city = $city && unit = $unit && country = $country";
// var dataParameters = {
// city: 'San-Francisco',
// country: 'us',
// unit: 'imperial'
// };
// var dataCriteria = new Criteria().initWithExpression(dataExpression, dataParameters);
// var dataType = WeatherReport.TYPE;
// var dataQuery = DataSelector.withTypeAndCriteria(dataType, dataCriteria);

// var mainService = new DataService();
// //TODO: Test with addChildService in addition to registerChildService
// mainService.registerChildService(new WeatherService()).then(function () {
// mainService.fetchData(dataQuery).then(function (weatherReports) {
// expect(typeof weatherReports[0].temp).toBe('number');
// done();
// });
// })
// });

describe("fetch http arguments", function () {
it("can be parsed with query", function () {
var service = new HttpService(),
url = "http://montagestudio.com",
headers = service.FORM_URL_ENCODED,
body = null,
types = [],
query = new DataQuery(),
sendCredentials = false,
parsed;

parsed = service._parseFetchHttpRawDataArguments(url, headers, body, types, query, sendCredentials);

expect(parsed.url).toEqual(url);
expect(parsed.headers["Content-Type"]).toBe("application/x-www-form-urlencoded");
expect(parsed.body).toBe(undefined);
expect(parsed.types).toBeDefined();
expect(parsed.types.length).toEqual(1);
expect(parsed.types[0]).toBe(HttpService.DataType.JSON);
expect(parsed.query).toBe(query);
expect(parsed.credentials).toEqual(sendCredentials);

parsed = service._parseFetchHttpRawDataArguments(url, headers, body, query, sendCredentials);

expect(parsed.url).toEqual(url);
expect(parsed.headers["Content-Type"]).toBe("application/x-www-form-urlencoded");
expect(parsed.body).toBe(undefined);
expect(parsed.types).toBeDefined();
expect(parsed.types.length).toEqual(1);
expect(parsed.types[0]).toBe(HttpService.DataType.JSON);
expect(parsed.query).toBe(query);
expect(parsed.credentials).toEqual(sendCredentials);
});


it("can be parsed with method", function () {
var service = new HttpService(),
url = "http://montagestudio.com",
headers = service.FORM_URL_ENCODED,
body = null,
types = [],
method = "GET",
sendCredentials = false,
parsed;

parsed = service._parseFetchHttpRawDataArguments(url, headers, body, types, method, sendCredentials);

expect(parsed.url).toEqual(url);
expect(parsed.headers["Content-Type"]).toBe("application/x-www-form-urlencoded");
expect(parsed.body).toBe(undefined);
expect(parsed.types).toBeDefined();
expect(parsed.types.length).toEqual(1);
expect(parsed.types[0]).toBe(HttpService.DataType.JSON);
expect(parsed.method).toEqual(method);
expect(parsed.credentials).toEqual(sendCredentials);

parsed = service._parseFetchHttpRawDataArguments(url, headers, body, method, sendCredentials);

expect(parsed.url).toEqual(url);
expect(parsed.headers["Content-Type"]).toBe("application/x-www-form-urlencoded");
expect(parsed.body).toBe(undefined);
expect(parsed.types).toBeDefined();
expect(parsed.types.length).toEqual(1);
expect(parsed.types[0]).toBe(HttpService.DataType.JSON);
expect(parsed.method).toEqual(method);
expect(parsed.credentials).toEqual(sendCredentials);
});
})



});

0 comments on commit 6a201b2

Please sign in to comment.