Skip to content
Snippets Groups Projects
Commit a4e3a7b8 authored by vkovtun's avatar vkovtun
Browse files

SSDM-13253 In progress of writing JavaScript facade.

parent d466dee2
No related branches found
No related tags found
1 merge request!40SSDM-13578 : 2PT : Database and V3 Implementation - include the new AFS "free"...
define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria', 'as/dto/datastore/fetchoptions/DataStoreFetchOptions', 'as/dto/common/search/SearchResult' ], function(jquery, define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria', 'as/dto/datastore/fetchoptions/DataStoreFetchOptions',
'as/dto/common/search/SearchResult'], function(jquery,
stjsUtil, DataStoreSearchCriteria, DataStoreFetchOptions, SearchResult) { stjsUtil, DataStoreSearchCriteria, DataStoreFetchOptions, SearchResult) {
jquery.noConflict(); jquery.noConflict();
...@@ -128,11 +129,11 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria ...@@ -128,11 +129,11 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria
} }
} }
this._createUrlWithParameters = function(dataStore, servlet, parameters) { function createUrlWithParameters(dataStore, servlet, parameters) {
return dataStore.downloadUrl + "/datastore_server/" + servlet + parameters; return dataStore.downloadUrl + "/datastore_server/" + servlet + parameters;
} }
this._createUrl = function(dataStore) { function createUrl(dataStore) {
return dataStore.downloadUrl + "/datastore_server/rmi-data-store-server-v3.json"; return dataStore.downloadUrl + "/datastore_server/rmi-data-store-server-v3.json";
} }
...@@ -141,7 +142,7 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria ...@@ -141,7 +142,7 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria
return this._getDataStores().then(function(dataStores) { return this._getDataStores().then(function(dataStores) {
var promises = dataStores.map(function(dataStore) { var promises = dataStores.map(function(dataStore) {
return facade._private.ajaxRequest({ return facade._private.ajaxRequest({
url : thisFacade._createUrl(dataStore), url : createUrl(dataStore),
data : { data : {
"method" : "searchFiles", "method" : "searchFiles",
"params" : [ facade._private.sessionToken, criteria, fetchOptions ] "params" : [ facade._private.sessionToken, criteria, fetchOptions ]
...@@ -192,7 +193,7 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria ...@@ -192,7 +193,7 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria
var dsCode = dataStore.getCode(); var dsCode = dataStore.getCode();
if (dsCode in creationsByStore) { if (dsCode in creationsByStore) {
promises.push(facade._private.ajaxRequest({ promises.push(facade._private.ajaxRequest({
url : thisFacade._createUrl(dataStore), url : createUrl(dataStore),
data : { data : {
"method" : "createDataSets", "method" : "createDataSets",
"params" : [ facade._private.sessionToken, creationsByStore[dsCode] ] "params" : [ facade._private.sessionToken, creationsByStore[dsCode] ]
...@@ -269,16 +270,15 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria ...@@ -269,16 +270,15 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria
} }
this.createUploadedDataSet = function(creation) { this.createUploadedDataSet = function(creation) {
var thisFacade = this; var dfd = jquery.Deferred();
return this._getDataStores().then(function(dataStores) { this._getDataStores().then(function(dataStores) {
if (dataStores.length > 1) { if (dataStores.length > 1) {
var dfd = jquery.Deferred();
dfd.reject("Please specify exactly one data store"); dfd.reject("Please specify exactly one data store");
return dfd.promise(); return;
} }
return facade._private.ajaxRequest({ facade._private.ajaxRequest({
url : thisFacade._createUrl(dataStores[0]), url : createUrl(dataStores[0]),
data : { data : {
"method" : "createUploadedDataSet", "method" : "createUploadedDataSet",
"params" : [ facade._private.sessionToken, creation ] "params" : [ facade._private.sessionToken, creation ]
...@@ -286,43 +286,187 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria ...@@ -286,43 +286,187 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria
returnType : { returnType : {
name : "DataSetPermId" name : "DataSetPermId"
} }
}).then(function(response) {
dfd.resolve(response);
}).catch(function(error) {
dfd.reject(error);
});
});
return dfd.promise();
}
function getUUID() {
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
}
this.uploadFileWorkspaceDSS = function(files) {
var thisFacade = this;
var uploadId = getUUID();
var dfd = jquery.Deferred();
this._uploadFileWorkspaceDSSEmptyDir(uploadId).then(function() {
thisFacade._uploadFileWorkspaceDSS(files, 0, uploadId, new Set()).then(function() {
dfd.resolve();
}).catch(function(error) {
dfd.reject(error);
});
}).catch(function(error) {
dfd.reject(error);
});
return dfd.promise();
}
this._uploadFileWorkspaceDSS = function(files, index, parentId, createdDirectories) {
var thisFacade = this;
var dfd = jquery.Deferred();
if (index < files.length) {
var file = files[index];
var relativePath = file.webkitRelativePath;
var directoryRelativePath = relativePath.substring(0, relativePath.lastIndexOf("/") + 1);
if (directoryRelativePath && !createdDirectories.has(directoryRelativePath)) {
this._uploadFileWorkspaceDSSEmptyDir(parentId + "/" + directoryRelativePath)
.then(function() {
createdDirectories.add(directoryRelativePath);
thisFacade._uploadFileWorkspaceDSSFile(file, parentId)
.then(function() {
thisFacade._uploadFileWorkspaceDSS(files, index + 1, createdDirectories);
dfd.resolve();
})
.catch(function(error) {
dfd.reject(error);
});
})
.catch(function(error) {
dfd.reject(error);
});
} else {
this._uploadFileWorkspaceDSSFile(file, parentId)
.then(function() {
thisFacade._uploadFileWorkspaceDSS(files, index + 1, createdDirectories);
dfd.resolve();
})
.catch(function(error) {
dfd.reject(error);
});
}
} else {
dfd.resolve();
}
return dfd.promise();
}
this._uploadFileWorkspaceDSSEmptyDir = function(pathToDir) {
var sessionID = facade._private.sessionToken;
var filename = encodeURIComponent(pathToDir);
var dfd = jquery.Deferred();
this._getDataStores().then(function(dataStores) {
if (dataStores.length !== 1) {
dfd.reject("Please specify exactly one data store");
return;
}
var parameters = "?sessionID=" + sessionID + "&filename=" + filename +
"&id=1&startByte=0&endByte=0&size=0&emptyFolder=true";
fetch(createUrlWithParameters(dataStores[0], "session_workspace_file_upload", parameters), {
method: "POST",
headers: {
"Content-Type": "multipart/form-data"
}
}).then(function(response) {
dfd.resolve(response);
}).catch(function(error) {
dfd.reject(error);
}); });
}).catch(function(error) {
dfd.reject(error);
});
return dfd.promise();
}
this._uploadFileWorkspaceDSSFile = function(file, parentId) {
var dfd = jquery.Deferred();
this._getDataStores().then(function(dataStores) {
var filename = encodeURIComponent(parentId + "/" + file.webkitRelativePath);
var sessionID = facade._private.sessionToken;
var fileSize = file.size;
var chunkSize = 1048576; // 1 MiB
var startByte = 0;
var iterator = streamFile(file, chunkSize);
uploadBlob(dataStores[0], iterator, sessionID, filename, startByte, chunkSize, fileSize)
.then(function() {
dfd.resolve();
}).catch(function(error) {
dfd.reject(error);
});
}).catch(function(error) {
dfd.reject(error);
}); });
return dfd.promise();
} }
this.uploadFileWorkspaceDSS = function(file) { function uploadBlob(dataStore, iterator, sessionID, filename, startByte, chunkSize, fileSize) {
var thisFacade = this; var dfd = jquery.Deferred();
var blob = iterator.next();
var getUUID = function() { if (blob) {
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => var parameters = "?sessionID=" + sessionID + "&filename=" + filename +
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) "&id=1&startByte=" + startByte + "&endByte=" + (startByte + chunkSize) +
); "&size=" + fileSize + "&emptyFolder=false";
}; try {
var responsePromise = fetch(createUrlWithParameters(dataStore, "session_workspace_file_upload", parameters), {
//File method: "POST",
var sessionID = facade._private.sessionToken headers: {
var id = 0; "Content-Type": "multipart/form-data"
var filename = file.name; },
var startByte = 0; body: blob
var endByte = file.size; });
return this._getDataStores().then(function(dataStores) { return responsePromise.then(function () {
if (dataStores.length > 1) { uploadBlob(dataStore, iterator, sessionID, filename, startByte + chunkSize, chunkSize,
var dfd = jquery.Deferred(); fileSize);
dfd.reject("Please specify exactly one data store"); dfd.resolve();
return dfd.promise(); }).catch(function (error) {
} console.error("Error:", error);
dfd.reject(error);
var parameters = "?sessionID=" + sessionID + "&filename=" + encodeURIComponent(filename) + "&id=" + id + "&startByte=" + startByte + "&endByte=" + endByte; });
return facade._private.ajaxRequest({ } catch (error) {
url : thisFacade._createUrlWithParameters(dataStores[0], "session_workspace_file_upload", parameters), console.error("Error:", error);
contentType: "multipart/form-data", dfd.reject(error);
data: file }
}); } else {
}); dfd.resolve();
} }
return dfd.promise();
} }
function streamFile(file, chunkSize) {
var start = 0;
var value;
return {
next() {
value = makeChunk(file, start, Math.min(start + chunkSize, file.size));
if (value && value.size > 0) {
start += chunkSize;
return value;
} else {
return null;
}
}
}
}
function makeChunk(file, startByte, endByte) {
var blob = undefined;
if (file.slice) {
blob = file.slice(startByte, endByte);
} else if (file.webkitSlice) {
blob = file.webkitSlice(startByte, endByte);
} else if (file.mozSlice) {
blob = file.mozSlice(startByte, endByte);
}
return blob;
}
}
var facade = function(openbisUrl) { var facade = function(openbisUrl) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment