| OLD | NEW | 
|---|
| 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 library memory_file_system; | 5 library memory_file_system; | 
| 6 | 6 | 
| 7 import 'dart:async'; | 7 import 'dart:async'; | 
| 8 import 'dart:collection'; | 8 import 'dart:collection'; | 
| 9 | 9 | 
| 10 import 'package:analyzer/src/generated/engine.dart' show TimestampedData; | 10 import 'package:analyzer/src/generated/engine.dart' show TimestampedData; | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 24       new HashMap<String, _MemoryResource>(); | 24       new HashMap<String, _MemoryResource>(); | 
| 25   final Map<String, String> _pathToContent = new HashMap<String, String>(); | 25   final Map<String, String> _pathToContent = new HashMap<String, String>(); | 
| 26   final Map<String, int> _pathToTimestamp = new HashMap<String, int>(); | 26   final Map<String, int> _pathToTimestamp = new HashMap<String, int>(); | 
| 27   final Map<String, List<StreamController<WatchEvent>>> _pathToWatchers = | 27   final Map<String, List<StreamController<WatchEvent>>> _pathToWatchers = | 
| 28       new HashMap<String, List<StreamController<WatchEvent>>>(); | 28       new HashMap<String, List<StreamController<WatchEvent>>>(); | 
| 29   int nextStamp = 0; | 29   int nextStamp = 0; | 
| 30 | 30 | 
| 31   @override | 31   @override | 
| 32   Context get pathContext => posix; | 32   Context get pathContext => posix; | 
| 33 | 33 | 
|  | 34   /** | 
|  | 35    * Delete the file with the given path. | 
|  | 36    */ | 
| 34   void deleteFile(String path) { | 37   void deleteFile(String path) { | 
| 35     _checkFileAtPath(path); | 38     _checkFileAtPath(path); | 
| 36     _pathToResource.remove(path); | 39     _pathToResource.remove(path); | 
| 37     _pathToContent.remove(path); | 40     _pathToContent.remove(path); | 
| 38     _pathToTimestamp.remove(path); | 41     _pathToTimestamp.remove(path); | 
| 39     _notifyWatchers(path, ChangeType.REMOVE); | 42     _notifyWatchers(path, ChangeType.REMOVE); | 
| 40   } | 43   } | 
| 41 | 44 | 
|  | 45   /** | 
|  | 46    * Delete the folder with the given path | 
|  | 47    * and recurively delete nested files and folders. | 
|  | 48    */ | 
|  | 49   void deleteFolder(String path) { | 
|  | 50     _checkFolderAtPath(path); | 
|  | 51     _MemoryFolder folder = _pathToResource[path]; | 
|  | 52     for (Resource child in folder.getChildren()) { | 
|  | 53       if (child is File) { | 
|  | 54         deleteFile(child.path); | 
|  | 55       } else if (child is Folder) { | 
|  | 56         deleteFolder(child.path); | 
|  | 57       } else { | 
|  | 58         throw 'failed to delete resource: $child'; | 
|  | 59       } | 
|  | 60     } | 
|  | 61     _pathToResource.remove(path); | 
|  | 62     _pathToContent.remove(path); | 
|  | 63     _pathToTimestamp.remove(path); | 
|  | 64     _notifyWatchers(path, ChangeType.REMOVE); | 
|  | 65   } | 
|  | 66 | 
| 42   @override | 67   @override | 
| 43   Resource getResource(String path) { | 68   Resource getResource(String path) { | 
| 44     path = posix.normalize(path); | 69     path = posix.normalize(path); | 
| 45     Resource resource = _pathToResource[path]; | 70     Resource resource = _pathToResource[path]; | 
| 46     if (resource == null) { | 71     if (resource == null) { | 
| 47       resource = new _MemoryFile(this, path); | 72       resource = new _MemoryFile(this, path); | 
| 48     } | 73     } | 
| 49     return resource; | 74     return resource; | 
| 50   } | 75   } | 
| 51 | 76 | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 68   File newDummyLink(String path) { | 93   File newDummyLink(String path) { | 
| 69     path = posix.normalize(path); | 94     path = posix.normalize(path); | 
| 70     newFolder(posix.dirname(path)); | 95     newFolder(posix.dirname(path)); | 
| 71     _MemoryDummyLink link = new _MemoryDummyLink(this, path); | 96     _MemoryDummyLink link = new _MemoryDummyLink(this, path); | 
| 72     _pathToResource[path] = link; | 97     _pathToResource[path] = link; | 
| 73     _pathToTimestamp[path] = nextStamp++; | 98     _pathToTimestamp[path] = nextStamp++; | 
| 74     _notifyWatchers(path, ChangeType.ADD); | 99     _notifyWatchers(path, ChangeType.ADD); | 
| 75     return link; | 100     return link; | 
| 76   } | 101   } | 
| 77 | 102 | 
| 78   File newFile(String path, String content) { | 103   File newFile(String path, String content, [int stamp]) { | 
| 79     path = posix.normalize(path); | 104     path = posix.normalize(path); | 
| 80     newFolder(posix.dirname(path)); | 105     newFolder(posix.dirname(path)); | 
| 81     _MemoryFile file = new _MemoryFile(this, path); | 106     _MemoryFile file = new _MemoryFile(this, path); | 
| 82     _pathToResource[path] = file; | 107     _pathToResource[path] = file; | 
| 83     _pathToContent[path] = content; | 108     _pathToContent[path] = content; | 
| 84     _pathToTimestamp[path] = nextStamp++; | 109     _pathToTimestamp[path] = stamp != null ? stamp : nextStamp++; | 
| 85     _notifyWatchers(path, ChangeType.ADD); | 110     _notifyWatchers(path, ChangeType.ADD); | 
| 86     return file; | 111     return file; | 
| 87   } | 112   } | 
| 88 | 113 | 
| 89   Folder newFolder(String path) { | 114   Folder newFolder(String path) { | 
| 90     path = posix.normalize(path); | 115     path = posix.normalize(path); | 
| 91     if (!path.startsWith('/')) { | 116     if (!path.startsWith('/')) { | 
| 92       throw new ArgumentError("Path must start with '/'"); | 117       throw new ArgumentError("Path must start with '/'"); | 
| 93     } | 118     } | 
| 94     _MemoryResource resource = _pathToResource[path]; | 119     _MemoryResource resource = _pathToResource[path]; | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 111   } | 136   } | 
| 112 | 137 | 
| 113   void _checkFileAtPath(String path) { | 138   void _checkFileAtPath(String path) { | 
| 114     _MemoryResource resource = _pathToResource[path]; | 139     _MemoryResource resource = _pathToResource[path]; | 
| 115     if (resource is! _MemoryFile) { | 140     if (resource is! _MemoryFile) { | 
| 116       throw new ArgumentError( | 141       throw new ArgumentError( | 
| 117           'File expected at "$path" but ${resource.runtimeType} found'); | 142           'File expected at "$path" but ${resource.runtimeType} found'); | 
| 118     } | 143     } | 
| 119   } | 144   } | 
| 120 | 145 | 
|  | 146   void _checkFolderAtPath(String path) { | 
|  | 147     _MemoryResource resource = _pathToResource[path]; | 
|  | 148     if (resource is! _MemoryFolder) { | 
|  | 149       throw new ArgumentError( | 
|  | 150           'Folder expected at "$path" but ${resource.runtimeType} found'); | 
|  | 151     } | 
|  | 152   } | 
|  | 153 | 
| 121   void _notifyWatchers(String path, ChangeType changeType) { | 154   void _notifyWatchers(String path, ChangeType changeType) { | 
| 122     _pathToWatchers.forEach( | 155     _pathToWatchers.forEach( | 
| 123         (String watcherPath, List<StreamController<WatchEvent>> streamController
     s) { | 156         (String watcherPath, List<StreamController<WatchEvent>> streamController
     s) { | 
| 124       if (posix.isWithin(watcherPath, path)) { | 157       if (posix.isWithin(watcherPath, path)) { | 
| 125         for (StreamController<WatchEvent> streamController in streamControllers) | 158         for (StreamController<WatchEvent> streamController in streamControllers) | 
| 126             { | 159             { | 
| 127           streamController.add(new WatchEvent(changeType, path)); | 160           streamController.add(new WatchEvent(changeType, path)); | 
| 128         } | 161         } | 
| 129       } | 162       } | 
| 130     }); | 163     }); | 
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 378   bool operator ==(other) { | 411   bool operator ==(other) { | 
| 379     if (runtimeType != other.runtimeType) { | 412     if (runtimeType != other.runtimeType) { | 
| 380       return false; | 413       return false; | 
| 381     } | 414     } | 
| 382     return path == other.path; | 415     return path == other.path; | 
| 383   } | 416   } | 
| 384 | 417 | 
| 385   @override | 418   @override | 
| 386   String toString() => path; | 419   String toString() => path; | 
| 387 } | 420 } | 
| OLD | NEW | 
|---|