Skip to content

Commit

Permalink
Fixate randomness for the same path
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucki authored and ifl0w committed Dec 14, 2022
1 parent 9cd20a7 commit 6bc7cdb
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 18 deletions.
31 changes: 26 additions & 5 deletions [email protected]/jsonpath/jsonpath.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,25 @@ var JSONPathParser = function () {
*
* @param inputObject the object to access
* @param inputString the json path expression
* @param randomElements the predefined random Elements
* @param newRandomness whether to ignore previously defined random Elements
* @returns {*}
*/
this.access = function (inputObject, inputString) {
this.access = function (inputObject, inputString, randomElements = null, newRandomness = true) {
if (inputObject === null || inputObject === undefined) {
return null;
}

if (inputString.length === 0) {
return inputObject;
return {
Object: inputObject,
RandomElements: randomElements,
};
}

if (randomElements === null) {
randomElements = [];
newRandomness = true;
}

let startDot = inputString.indexOf('.');
Expand All @@ -34,7 +44,7 @@ var JSONPathParser = function () {
return null;
}

return this.access(targetObject, inputStringTail)
return this.access(targetObject, inputStringTail, randomElements, newRandomness);

} else {

Expand All @@ -48,11 +58,22 @@ var JSONPathParser = function () {

switch (indexString) {
case "@random":
return this.access(this.randomElement(targetObject), inputStringTail);
let randomNumber = null;
if (!newRandomness && randomElements.length >= 1) {
// Take and remove first element
randomNumber = randomElements.shift();
} else if (!newRandomness && randomElements.length < 1) {
randomNumber = this.randomElement(targetObject);
} else {
randomNumber = this.randomElement(targetObject);
randomElements.push(randomNumber);
}

return this.access(randomNumber, inputStringTail, randomElements, newRandomness);
// add special keywords here
default:
// expecting integer
return this.access(targetObject[parseInt(indexString)], inputStringTail);
return this.access(targetObject[parseInt(indexString)], inputStringTail, randomElements, newRandomness);
}

}
Expand Down
39 changes: 26 additions & 13 deletions [email protected]/sourceAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -357,25 +357,30 @@ var GenericJsonAdapter = class extends BaseAdapter {
const response_body = JSON.parse(ByteArray.toString(response_body_bytes));

let identifier = this._settings.get("generic-json-id", "string");
let imageJSONPath = this._settings.get("generic-json-response-path", "string");
let linkJSONPath = this._settings.get("generic-json-link-path", "string");
let domainUrl = this._settings.get("generic-json-domain", "string");

if (identifier === null || identifier === "") {
identifier = 'Generic JSON Source';
}

let rObject = this._jsonPathParser.access(response_body, imageJSONPath);
let imageDownloadUrl = this._settings.get("generic-json-url-prefix", "string") + rObject.Object;

let imageJSONPath = this._settings.get("generic-json-response-path", "string");
let imageDownloadUrl = this._jsonPathParser.access(response_body, imageJSONPath);
imageDownloadUrl = this._settings.get("generic-json-url-prefix", "string") + imageDownloadUrl;

let linkUrl = null;
try {
let linkJSONPath = this._settings.get("generic-json-link-path", "string");
linkUrl = this._jsonPathParser.access(response_body, linkJSONPath);
linkUrl = this._settings.get("generic-json-link-prefix", "string") + linkUrl;
} catch (exception) { }

let domainUrl = this._settings.get("generic-json-domain", "string");
// '@random' would yield different results so lets make sure the values stay
// the same as long as the path is identical
let samePath = imageJSONPath.substring(0, this.findFirstDifference(imageJSONPath, linkJSONPath));

// count occurrences of '@random' to slice the array later
// https://stackoverflow.com/a/4009768
let occurrences = (samePath.match(/@random/g) || []).length;

let linkUrl = this._jsonPathParser.access(response_body, linkJSONPath, rObject.RandomElements.slice(0, occurrences), false).Object;
linkUrl = this._settings.get("generic-json-link-prefix", "string") + linkUrl;

if (callback) {
let historyEntry = new HistoryModule.HistoryEntry(null, identifier, imageDownloadUrl);
let historyEntry = new HistoryModule.HistoryEntry(null, identifier, rObject.Object);
historyEntry.source.sourceUrl = imageDownloadUrl;

if (linkUrl !== null && linkUrl !== "") {
Expand All @@ -395,4 +400,12 @@ var GenericJsonAdapter = class extends BaseAdapter {

}

// https://stackoverflow.com/a/32859917
findFirstDifference (jsonPath1, jsonPath2) {
let i = 0;
if (jsonPath1 === jsonPath2) return -1;
while (jsonPath1[i] === jsonPath2[i]) i++;
return i;
}

};

0 comments on commit 6bc7cdb

Please sign in to comment.