Skip to content
Snippets Groups Projects
Commit 4ba6fddf authored by Sandro Weber's avatar Sandro Weber
Browse files

async file sync be tricky, WIP split of file maps

parent 2c46b4fc
Branches
No related tags found
No related merge requests found
...@@ -93,6 +93,19 @@ ...@@ -93,6 +93,19 @@
.selected-file-info { .selected-file-info {
grid-area: selected-file-info; grid-area: selected-file-info;
padding: 10px; padding: 10px;
overflow: auto;
}
.fileinfo-group {
padding-bottom: 5px;
}
.fileinfo-entry {
padding-left: 5px;
}
.fileinfo-name {
font-weight: bold;
} }
.treeview { .treeview {
...@@ -116,3 +129,7 @@ ...@@ -116,3 +129,7 @@
.file-local-only { .file-local-only {
color: green; color: green;
} }
.file-server-only {
color: lightgray;
}
\ No newline at end of file
import React from 'react'; import React from 'react';
import { FaDownload, FaUpload, FaFolderOpen } from 'react-icons/fa'; import { FaDownload, FaUpload, FaFolderOpen, FaTrash } from 'react-icons/fa';
import { IoSyncCircleOutline, IoSyncCircleSharp } from 'react-icons/io5'; import { IoSyncCircleOutline, IoSyncCircleSharp } from 'react-icons/io5';
import TreeView from '@material-ui/lab/TreeView'; import TreeView from '@material-ui/lab/TreeView';
import TreeItem from '@material-ui/lab/TreeItem'; import TreeItem from '@material-ui/lab/TreeItem';
...@@ -18,7 +18,7 @@ export default class ExperimentFilesViewer extends React.Component { ...@@ -18,7 +18,7 @@ export default class ExperimentFilesViewer extends React.Component {
this.state = { this.state = {
selectedExperiment: undefined, selectedExperiment: undefined,
selectedFilepaths: undefined, selectedFilepaths: undefined,
selectedFile: undefined autoSync: RemoteExperimentFilesService.instance.autoSync
}; };
} }
...@@ -29,13 +29,6 @@ export default class ExperimentFilesViewer extends React.Component { ...@@ -29,13 +29,6 @@ export default class ExperimentFilesViewer extends React.Component {
*/ */
handleFileTreeSelect(event, nodeIds) { handleFileTreeSelect(event, nodeIds) {
this.setState({selectedFilepaths: nodeIds}); this.setState({selectedFilepaths: nodeIds});
if (nodeIds.length === 1) {
let file = RemoteExperimentFilesService.instance.localFiles.get(nodeIds[0]);
this.setState({selectedFile: file});
}
else {
this.setState({selectedFile: undefined});
}
} }
/** /**
...@@ -54,10 +47,13 @@ export default class ExperimentFilesViewer extends React.Component { ...@@ -54,10 +47,13 @@ export default class ExperimentFilesViewer extends React.Component {
if (file.localOnly) { if (file.localOnly) {
className += ' file-local-only'; className += ' file-local-only';
} }
if (!file.fileSystemHandle) {
className += ' file-server-only';
}
className = className.trim(); className = className.trim();
return ( return (
<TreeItem key={file.relativePath} nodeId={file.relativePath} label={file.fileSystemHandle.name} <TreeItem key={file.relativePath} nodeId={file.relativePath} label={file.name}
className={className}> className={className}>
{Array.isArray(file.children) ? file.children.map((subfile) => this.renderFileTree(subfile)) : null} {Array.isArray(file.children) ? file.children.map((subfile) => this.renderFileTree(subfile)) : null}
</TreeItem>); </TreeItem>);
...@@ -75,6 +71,31 @@ export default class ExperimentFilesViewer extends React.Component { ...@@ -75,6 +71,31 @@ export default class ExperimentFilesViewer extends React.Component {
return className.trim(); return className.trim();
} }
getInfoText() {
return (<div>
{this.state.selectedFilepaths && this.state.selectedFilepaths.map(filePath => {
let file = RemoteExperimentFilesService.instance.localFiles.get(filePath);
if (file) {
return (<div key={file.relativePath} className="fileinfo-group">
<div className="fileinfo-name">{file.name}</div>
{file.msgWarning && <div className="fileinfo-entry">{'Warning: ' + file.msgWarning}</div>}
{file.msgError && <div className="fileinfo-entry">{'Error: ' + file.msgError}</div>}
{file.localOnly && <div className="fileinfo-entry">{'File exists only locally.'}</div>}
{file.hasLocalChanges &&
<div className="fileinfo-entry">{'File has local changes not synced with server.'}</div>}
{file.isOutOfSync &&
<div className="fileinfo-entry">{'File on server has newer changes.'}</div>}
{!file.fileSystemHandle &&
<div className="fileinfo-entry">{'File exists on server but not locally.'}</div>}
</div>);
}
else {
return null;
}
})}
</div>);
}
render() { render() {
let selectedExperimentFiles = this.state.selectedExperiment ? let selectedExperimentFiles = this.state.selectedExperiment ?
RemoteExperimentFilesService.instance.localFiles.get(this.state.selectedExperiment.id) : undefined; RemoteExperimentFilesService.instance.localFiles.get(this.state.selectedExperiment.id) : undefined;
...@@ -123,8 +144,9 @@ export default class ExperimentFilesViewer extends React.Component { ...@@ -123,8 +144,9 @@ export default class ExperimentFilesViewer extends React.Component {
<button className='nrp-btn' <button className='nrp-btn'
onClick={() => { onClick={() => {
RemoteExperimentFilesService.instance.toggleAutoSync(); RemoteExperimentFilesService.instance.toggleAutoSync();
this.setState({autoSync: RemoteExperimentFilesService.instance.autoSync});
}} }}
title={RemoteExperimentFilesService.instance.autoSync ? 'Auto sync: ON' : 'Auto sync: OFF'} title={this.state.autoSync ? 'Auto sync: ON' : 'Auto sync: OFF'}
> >
{RemoteExperimentFilesService.instance.autoSync ? {RemoteExperimentFilesService.instance.autoSync ?
<IoSyncCircleSharp /> : <IoSyncCircleOutline />} <IoSyncCircleSharp /> : <IoSyncCircleOutline />}
...@@ -145,7 +167,6 @@ export default class ExperimentFilesViewer extends React.Component { ...@@ -145,7 +167,6 @@ export default class ExperimentFilesViewer extends React.Component {
if (experimentLocalFiles) { if (experimentLocalFiles) {
this.setState({ this.setState({
selectedExperiment: experiment, selectedExperiment: experiment,
selectedFile: undefined,
selectedFilepaths: undefined selectedFilepaths: undefined
}); });
} }
...@@ -195,6 +216,12 @@ export default class ExperimentFilesViewer extends React.Component { ...@@ -195,6 +216,12 @@ export default class ExperimentFilesViewer extends React.Component {
RemoteExperimentFilesService.instance.uploadExperimentFileList(this.state.selectedFilepaths)}> RemoteExperimentFilesService.instance.uploadExperimentFileList(this.state.selectedFilepaths)}>
<FaUpload /> <FaUpload />
</button> </button>
<button className='nrp-btn' title='Delete selected'
disabled={!this.state.selectedFilepaths || this.state.selectedFilepaths.length === 0}
onClick={() =>
RemoteExperimentFilesService.instance.uploadExperimentFileList(this.state.selectedFilepaths)}>
<FaTrash />
</button>
</div> </div>
</div> </div>
...@@ -219,33 +246,7 @@ export default class ExperimentFilesViewer extends React.Component { ...@@ -219,33 +246,7 @@ export default class ExperimentFilesViewer extends React.Component {
{/* info for selected file */} {/* info for selected file */}
<div className='grid-element selected-file-info'> <div className='grid-element selected-file-info'>
{this.state.selectedFile ? {this.getInfoText()}
<div>
{/*(this.state.selectedFile.type === 'folder' ? 'Folder: ' : 'File: ') + this.state.selectedFile.uuid
<br />*/}
{this.state.selectedFile.msgWarning ?
'Warning: ' + this.state.selectedFile.msgWarning
: null
}
{this.state.selectedFile.msgError ?
'Error: ' + this.state.selectedFile.msgError
: null
}
{this.state.selectedFile.localOnly ?
'File exists only locally.'
: null
}
{this.state.selectedFile.hasLocalChanges ?
'File has local changes not synced with server.'
: null
}
{this.state.selectedFile.isOutOfSync ?
'File is out of sync - file on server has newer changes.'
: null
}
</div>
: null
}
</div> </div>
</div> </div>
......
...@@ -20,9 +20,10 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -20,9 +20,10 @@ class RemoteExperimentFilesService extends HttpService {
} }
this.localSyncDirectoryHandle = undefined; this.localSyncDirectoryHandle = undefined;
this.localFiles = new Map(); this.mapLocalFiles = new Map();
this.serverFiles = new Map(); this.mapServerFiles = new Map();
this.localFileInfo = new Map(); this.mapFileInfos = new Map();
//this.localFileInfo = undefined;
this.autoSync = false; this.autoSync = false;
} }
...@@ -60,18 +61,20 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -60,18 +61,20 @@ class RemoteExperimentFilesService extends HttpService {
await this.updateLocalFiles(); await this.updateLocalFiles();
await this.updateFileInfos();
this.saveLocalFileInfoToLocalStorage(); this.saveLocalFileInfoToLocalStorage();
} }
async updateLocalFiles() { async updateLocalFiles() {
//let fileMap = new Map(); let updatedFilepaths = [];
//let currentFileList = [];
await this.traverseLocalFiles(this.localSyncDirectoryHandle, await this.traverseFilesystem(this.localSyncDirectoryHandle,
async (fileSystemHandle) => { async (fileSystemHandle) => {
let fileRelativePath = await this.getLocalFileRelativePath(fileSystemHandle); let fileRelativePath = await this.getRelativePathFromFSHandle(fileSystemHandle);
let file = this.localFiles.get(fileRelativePath) updatedFilepaths.push(fileRelativePath);
|| await this.addLocalFile(fileRelativePath, fileSystemHandle.kind, fileSystemHandle, this.localFiles);
let file = await this.getOrCreateLocalFile(fileRelativePath, fileSystemHandle.kind, fileSystemHandle);
if (file && file.fileSystemHandle && file.fileSystemHandle.kind === FS_TYPE_FILE) { if (file && file.fileSystemHandle && file.fileSystemHandle.kind === FS_TYPE_FILE) {
file.hasLocalChanges = await this.hasLocalChanges(file); file.hasLocalChanges = await this.hasLocalChanges(file);
...@@ -80,27 +83,50 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -80,27 +83,50 @@ class RemoteExperimentFilesService extends HttpService {
if (this.autoSync) { if (this.autoSync) {
if (file.hasLocalChanges || file.localOnly) { if (file.hasLocalChanges || file.localOnly) {
this.uploadExperimentFile(file); await this.uploadExperimentFile(file);
} }
if (file.isOutOfSync) { if (file.isOutOfSync) {
this.downloadExperimentFile(file.relativePath); console.info('updateLocalFiles - downloadExperimentFile():');
console.info(file);
await this.downloadExperimentFile(file.relativePath);
} }
} }
} }
} }
); );
//this.localFiles = fileMap; for (let keyValueEntry of this.mapLocalFiles) {
let file = keyValueEntry[1];
if (!updatedFilepaths.includes(file.relativePath)) {
if (!this.mapServerFiles.has(file.relativePath)) {
// local file has been deleted and is not present on server, remove from list
this.removeFileInfo(file.relativePath);
}
else {
// local file has been deleted, but is part of the experiment files on server
//delete file.fileSystemHandle;
if (this.autoSync && file.type === FS_TYPE_FILE) {
await this.downloadExperimentFile(file.relativePath);
}
}
}
}
} }
async updateServerFiles(forceUpdate = false) { async updateServerFiles(forceUpdate = false) {
let newServerFilesMap = new Map(); let newServerFilesMap = new Map();
let getServerDirectoryFiles = async (parentDirectory) => { let getServerDirectoryFiles = async (parentDirectory) => {
let serverFileList = await ExperimentStorageService.instance.getExperimentFiles(parentDirectory.uuid); let serverFileList = await ExperimentStorageService.instance.getExperimentFiles(parentDirectory.uuid);
parentDirectory.children = serverFileList; parentDirectory.children = serverFileList;
serverFileList.forEach(async (serverFile) => {
for (let serverFile of serverFileList) {
newServerFilesMap.set(serverFile.uuid, serverFile); newServerFilesMap.set(serverFile.uuid, serverFile);
if (!this.mapLocalFiles.has(serverFile.uuid)) {
this.addOrCreateFileInfo(serverFile.uuid, serverFile.type);
}
try { try {
serverFile.parent = parentDirectory; serverFile.parent = parentDirectory;
if (serverFile.type === FS_TYPE_FOLDER) { if (serverFile.type === FS_TYPE_FOLDER) {
...@@ -110,31 +136,34 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -110,31 +136,34 @@ class RemoteExperimentFilesService extends HttpService {
catch (error) { catch (error) {
console.error(error); console.error(error);
} }
}); }
}; };
let experiments = await ExperimentStorageService.instance.getExperiments(forceUpdate); let experiments = await ExperimentStorageService.instance.getExperiments(forceUpdate);
experiments.forEach(async (experiment) => { for (let experiment of experiments) {
let serverExperiment = { let serverExperiment = {
uuid: experiment.uuid, uuid: experiment.uuid,
name: experiment.configuration.name name: experiment.configuration.name
}; };
await getServerDirectoryFiles(serverExperiment); await getServerDirectoryFiles(serverExperiment);
this.serverFiles.set(experiment.id, serverExperiment); newServerFilesMap.set(experiment.uuid, serverExperiment);
}); }
this.mapServerFiles = newServerFilesMap;
}
async updateFileInfos() {
this.serverFiles = newServerFilesMap;
} }
/** /**
* *
* @param {*} directoryHandle * @param {*} directoryHandle
* @param {*} callbackFile - callback function called with (fileRelativePath, fileSystemHandle) * @param {*} callbackFile - callback function called with (fileRelativePath, fileSystemHandle)
* @param {*} fileMap
* @returns * @returns
*/ */
async traverseLocalFiles(directoryHandle, callbackFile) { async traverseFilesystem(directoryHandle, callbackFile) {
if (!directoryHandle) { if (!directoryHandle) {
return; return;
} }
...@@ -157,55 +186,100 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -157,55 +186,100 @@ class RemoteExperimentFilesService extends HttpService {
await traverseFolder(directoryHandle); await traverseFolder(directoryHandle);
} }
async getLocalFileRelativePath(fileSystemHandle) { async getRelativePathFromFSHandle(fileSystemHandle) {
let filePathArray = await this.localSyncDirectoryHandle.resolve(fileSystemHandle); let filePathArray = await this.localSyncDirectoryHandle.resolve(fileSystemHandle);
let fileRelativePath = filePathArray.join('/'); let fileRelativePath = filePathArray.join('/');
return fileRelativePath; return fileRelativePath;
} }
async addLocalFile(relativePath, type, fileSystemHandle = undefined, fileMap = undefined) { addOrCreateFileInfo(relativePath, type) {
let mapForFiles = fileMap ? fileMap : this.localFiles; let fileName = relativePath.substring(relativePath.lastIndexOf('/') + 1);
if (mapForFiles.has(relativePath)) { if (fileName.charAt(0) === '.' || fileName.includes('.crswap')) {
//console.warn('RemoteExperimentFilesService.addLocalFile() - file ' + relativePath + ' already exists.'); return;
}
//console.info('addFile: ' + relativePath + ' - ' + type); // not the problem
let fileInfo = this.mapFileInfos.get(relativePath);
if (!fileInfo) {
fileInfo = {
name: fileName,
type: type,
relativePath: relativePath
};
this.mapLocalFiles.set(relativePath, fileInfo);
}
let parentDirectoryPath = relativePath.substring(0, relativePath.lastIndexOf('/'));
let parentDirectory = this.mapFileInfos.get(parentDirectoryPath);
if (!parentDirectory && parentDirectoryPath.length > 0) {
parentDirectory = this.addOrCreateFileInfo(parentDirectoryPath, FS_TYPE_FOLDER);
}
if (parentDirectory) {
fileInfo.parent = parentDirectory;
parentDirectory.children = parentDirectory.children || [];
if (!parentDirectory.children.includes(fileInfo)) {
parentDirectory.children.push(fileInfo);
}
}
return fileInfo;
}
removeFileInfo(relativePath) {
let file = this.mapFileInfos.get(relativePath);
if (!file) {
return; return;
} }
if (file.parent) {
file.parent.children = file.parent.children.filter(child => child.relativePath !== relativePath);
}
this.mapFileInfos.delete(relativePath);
}
async getOrCreateLocalFile(relativePath, type, fileSystemHandle = undefined) {
if (!relativePath || relativePath.length === 0) {
return;
}
let fileName = relativePath.substring(relativePath.lastIndexOf('/') + 1); let fileName = relativePath.substring(relativePath.lastIndexOf('/') + 1);
if (fileName.includes('.crswap')) { if (fileName.charAt(0) === '.' || fileName.includes('.crswap')) {
return; return;
} }
let fileInfo = this.addOrCreateFileInfo(relativePath, type);
let localFile = this.mapLocalFiles.get(relativePath);
localFile.fileSystemHandle = fileInfo.fileSystemHandle || fileSystemHandle;
if (!fileInfo.fileSystemHandle) {
let parentDirectory = undefined;
let lastIndexSlash = relativePath.lastIndexOf('/');
if (lastIndexSlash && lastIndexSlash !== -1) {
let parentDirectoryPath = relativePath.substring(0, relativePath.lastIndexOf('/')); let parentDirectoryPath = relativePath.substring(0, relativePath.lastIndexOf('/'));
let parentDirectory = mapForFiles.get(parentDirectoryPath); parentDirectory = await this.getOrCreateLocalFile(parentDirectoryPath, FS_TYPE_FOLDER);
}
let parentDirectoryHandle = parentDirectory ? parentDirectory.fileSystemHandle : this.localSyncDirectoryHandle; let parentDirectoryHandle = parentDirectory ? parentDirectory.fileSystemHandle : this.localSyncDirectoryHandle;
if (!fileSystemHandle) { //console.info('getOrCreateLocalFile: ' + relativePath + ' - ' + type + ', parentDirectoryHandle:');
//console.info(parentDirectoryHandle);
if (type === FS_TYPE_FILE) { if (type === FS_TYPE_FILE) {
fileSystemHandle = await parentDirectoryHandle.getFileHandle(fileName, {create: true}); fileInfo.fileSystemHandle = await parentDirectoryHandle.getFileHandle(fileName, {create: true});
} }
else if (type === FS_TYPE_FOLDER) { else if (type === FS_TYPE_FOLDER) {
fileSystemHandle = await parentDirectoryHandle.getDirectoryHandle(fileName, {create: true}); fileInfo.fileSystemHandle = await parentDirectoryHandle.getDirectoryHandle(fileName, {create: true});
} }
} }
let localFile = { return fileInfo;
fileSystemHandle: fileSystemHandle,
relativePath: relativePath,
parent: parentDirectory
};
mapForFiles.set(relativePath, localFile);
if (parentDirectory) {
parentDirectory.children = parentDirectory.children || [];
parentDirectory.children.push(localFile);
}
return localFile;
} }
toggleAutoSync() { toggleAutoSync() {
this.autoSync = !this.autoSync; this.autoSync = !this.autoSync;
} }
traverseServerFiles(serverDirectory, callbackFile) { /*traverseServerFiles(serverDirectory, callbackFile) {
let traverseFolder = (serverFolder) => { let traverseFolder = (serverFolder) => {
serverFolder.children.forEach(child => { serverFolder.children.forEach(child => {
if (child.type === FS_TYPE_FILE) { if (child.type === FS_TYPE_FILE) {
...@@ -217,62 +291,36 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -217,62 +291,36 @@ class RemoteExperimentFilesService extends HttpService {
}); });
}; };
traverseFolder(serverDirectory); traverseFolder(serverDirectory);
} }*/
initLocalFileInfoFromLocalStorage() { initLocalFileInfoFromLocalStorage() {
this.localFileInfo = new Map(JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY_FILE_INFO))); this.mapFileInfos = new Map(JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY_FILE_INFO)));
//let fileMap = new Map(); //let fileMap = new Map();
this.traverseLocalFiles( /*this.traverseFilesystem(
this.localSyncDirectoryHandle, this.localSyncDirectoryHandle,
async (fileSystemHandle) => { async (fileSystemHandle) => {
let fileRelativePath = await this.getLocalFileRelativePath(fileSystemHandle); let fileRelativePath = await this.getRelativePathFromFSHandle(fileSystemHandle);
let file = this.localFiles.get(fileRelativePath) let file = await this.getOrCreateLocalFile(fileRelativePath, fileSystemHandle.kind, fileSystemHandle);
|| await this.addLocalFile(fileRelativePath, fileSystemHandle.kind, fileSystemHandle, this.localFiles);
let fileInfo = this.localFileInfo.get(file.relativePath); let fileInfo = file && this.localFileInfo.get(file.relativePath);
if (fileInfo) { if (fileInfo) {
Object.assign(file, fileInfo); Object.assign(file, fileInfo);
} }
} }
); );*/
//this.localFiles = fileMap;
} }
saveLocalFileInfoToLocalStorage() { saveLocalFileInfoToLocalStorage() {
/*let mapFileInfo = new Map(); /*for (let keyValuePair of this.mapLocalFiles) {
this.localFiles.forEach((value, key) => { let relativePath = keyValuePair[0];
mapFileInfo.set(key, { let file = keyValuePair[1];
dateSync: value.dateSync this.localFileInfo.set(relativePath, {
dateSync: file.dateSync
}); });
});*/ }*/
localStorage.setItem(LOCALSTORAGE_KEY_FILE_INFO, JSON.stringify(Array.from(this.localFileInfo.entries())));
}
getServerFileByRelativePath(filepath) {
let splitPath = filepath.split('/');
let experimentID = splitPath[0];
splitPath.splice(0, 1);
let serverExperiment = this.serverFiles.get(experimentID);
if (!serverExperiment) {
return;
}
if (splitPath.length === 0) {
return serverExperiment;
}
let currentFilesInFolder = serverExperiment.children; localStorage.setItem(LOCALSTORAGE_KEY_FILE_INFO, JSON.stringify(Array.from(this.mapFileInfos.entries())));
let file = undefined;
while (currentFilesInFolder && splitPath.length > 0) {
file = currentFilesInFolder.find(element => element.name === splitPath[0]);
currentFilesInFolder = file && file.children;
splitPath.splice(0, 1);
}
return file;
} }
async hasLocalChanges(localFile) { async hasLocalChanges(localFile) {
...@@ -285,19 +333,21 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -285,19 +333,21 @@ class RemoteExperimentFilesService extends HttpService {
hasServerFile(relativeFilepath) { hasServerFile(relativeFilepath) {
let splitPath = relativeFilepath.split('/'); let splitPath = relativeFilepath.split('/');
let experimentID = splitPath[0]; let experimentID = splitPath[0];
let hasExperiment = this.serverFiles.has(experimentID); let hasExperiment = this.mapServerFiles.has(experimentID);
let hasFile = this.serverFiles.get(relativeFilepath) !== undefined; let hasFile = this.mapServerFiles.get(relativeFilepath) !== undefined;
return (hasExperiment && hasFile); return (hasExperiment && hasFile);
} }
isOutOfSync(localFile) { isOutOfSync(localFile) {
let serverFile = this.serverFiles.get(localFile.relativePath); let serverFile = this.mapServerFiles.get(localFile.relativePath);
return serverFile && localFile.dateSync && Date.parse(serverFile.modifiedOn) > localFile.dateSync; return serverFile && localFile.dateSync && Date.parse(serverFile.modifiedOn) > localFile.dateSync;
} }
async downloadExperimentFile(relativeFilepath) { async downloadExperimentFile(relativeFilepath) {
let localFile = this.localFiles.get(relativeFilepath) || await this.addLocalFile(relativeFilepath, FS_TYPE_FILE); console.info('downloadExperimentFile: ' + relativeFilepath);
let localFile = await this.getOrCreateLocalFile(relativeFilepath, FS_TYPE_FILE);
console.info(localFile);
let parentDirectoryPath = relativeFilepath.substring(0, relativeFilepath.lastIndexOf('/')); let parentDirectoryPath = relativeFilepath.substring(0, relativeFilepath.lastIndexOf('/'));
let fileContent = await ExperimentStorageService.instance.getBlob(parentDirectoryPath, relativeFilepath, false); let fileContent = await ExperimentStorageService.instance.getBlob(parentDirectoryPath, relativeFilepath, false);
...@@ -318,8 +368,7 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -318,8 +368,7 @@ class RemoteExperimentFilesService extends HttpService {
return; return;
} }
let experimentRootDirectory = this.localFiles.get(experiment.uuid) let experimentRootDirectory = await this.getOrCreateLocalFile(experiment.id, FS_TYPE_FOLDER);
|| await this.addLocalFile(experiment.id, FS_TYPE_FOLDER);
if (!experimentRootDirectory) { if (!experimentRootDirectory) {
return; return;
} }
...@@ -328,30 +377,27 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -328,30 +377,27 @@ class RemoteExperimentFilesService extends HttpService {
let serverFileList = await ExperimentStorageService.instance.getExperimentFiles(parentDirectory.uuid); let serverFileList = await ExperimentStorageService.instance.getExperimentFiles(parentDirectory.uuid);
parentDirectory.children = serverFileList; parentDirectory.children = serverFileList;
serverFileList.forEach(async (serverFile) => { for (let serverFile of serverFileList) {
try {
serverFile.parent = parentDirectory; serverFile.parent = parentDirectory;
if (serverFile.type === FS_TYPE_FILE) { if (serverFile.type === FS_TYPE_FILE) {
console.info('before downloadExperimentFile: ' + serverFile.name);
console.info(serverFile);
await this.downloadExperimentFile(serverFile.uuid); await this.downloadExperimentFile(serverFile.uuid);
} }
else if (serverFile.type === FS_TYPE_FOLDER) { else if (serverFile.type === FS_TYPE_FOLDER) {
await this.addLocalFile(serverFile.uuid, serverFile.type); await this.getOrCreateLocalFile(serverFile.uuid, serverFile.type);
downloadFiles(serverFile); await downloadFiles(serverFile);
} }
} }
catch (error) {
console.error(error);
}
});
}; };
let serverExperiment = { let serverExperiment = {
uuid: experiment.uuid, uuid: experiment.uuid,
name: experiment.configuration.name name: experiment.configuration.name
}; };
downloadFiles(serverExperiment); await downloadFiles(serverExperiment);
this.serverFiles.set(experiment.id, serverExperiment); this.mapServerFiles.set(experiment.id, serverExperiment);
} }
async uploadExperimentFile(localFile) { async uploadExperimentFile(localFile) {
...@@ -359,7 +405,7 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -359,7 +405,7 @@ class RemoteExperimentFilesService extends HttpService {
//TODO: error GUI //TODO: error GUI
console.warn('WARNING! ' + localFile.name + ' has a newer version on the server, won\'t upload'); console.warn('WARNING! ' + localFile.name + ' has a newer version on the server, won\'t upload');
localFile.dirtyOnServer = true; localFile.dirtyOnServer = true;
localFile.msgError = 'File version on server is newer! Will not upload.'; localFile.msgError = 'Won\'t upload - file version on server is newer!';
} }
else { else {
let fileHandle = localFile.fileSystemHandle; let fileHandle = localFile.fileSystemHandle;
...@@ -383,24 +429,24 @@ class RemoteExperimentFilesService extends HttpService { ...@@ -383,24 +429,24 @@ class RemoteExperimentFilesService extends HttpService {
async uploadExperimentFileList(fileList) { async uploadExperimentFileList(fileList) {
for (const filepath of fileList) { for (const filepath of fileList) {
let localFile = this.localFiles.get(filepath); let localFile = this.mapLocalFiles.get(filepath);
localFile && await this.uploadExperimentFile(localFile); localFile && await this.uploadExperimentFile(localFile);
} }
} }
uploadExperimentFromLocalFS(experiment) { uploadExperimentFromLocalFS(experiment) {
let uploadFolder = async (folder) => { let uploadFolder = async (folder) => {
folder.children.forEach(async file => { for (let file of folder.children) {
if (file.fileSystemHandle.kind === FS_TYPE_FILE) { if (file.fileSystemHandle.kind === FS_TYPE_FILE) {
await this.uploadExperimentFile(file); await this.uploadExperimentFile(file);
} }
else if (file.type === FS_TYPE_FOLDER) { else if (file.type === FS_TYPE_FOLDER) {
uploadFolder(file); uploadFolder(file);
} }
}); }
}; };
let localExperimentFiles = this.localFiles.get(experiment.uuid); let localExperimentFiles = this.mapLocalFiles.get(experiment.uuid);
uploadFolder(localExperimentFiles); uploadFolder(localExperimentFiles);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment