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) { | |
scheglov
2015/02/24 17:44:54
Should we add new tests for this method?
danrubel
2015/02/25 19:43:05
Good point. I thought this class was test code, bu
| |
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 resouce: $child'; | |
scheglov
2015/02/24 17:44:54
resource
danrubel
2015/02/25 19:43:05
Done.
| |
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 |