| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:convert'; |
| import 'dart:io'; |
| |
| import 'package:path/path.dart' as path; |
| import 'package:tiler/tiler.dart'; |
| |
| import '../tile_model/module_info.dart'; |
| import '../tile_model/tile_model_serializer.dart' show fromJson, toJson; |
| |
| /// Persistent storage for layouts |
| class LayoutStore { |
| /// Directory path where the data will be persisted. |
| final String directory; |
| |
| /// Maximum amount of files to store. |
| final int size; |
| |
| /// Constructor for layout storage. |
| LayoutStore({this.directory = '/pkg/data/layouts', this.size = 100}); |
| |
| /// Clears the storage. |
| /// |
| /// Synchronously deletes all the [File]s in the layout storage. |
| void deleteSync() { |
| try { |
| print('LayoutStore deleting $directory'); |
| File(directory).deleteSync(recursive: true); |
| } on FileSystemException catch (e) { |
| print('LayoutStore Failed to delete $directory: $e'); |
| } |
| } |
| |
| /// Get a list of file names in the storage containg [TilerModel]s. |
| /// |
| /// Returns a List containing [File] objects. |
| List<File> listSync() { |
| try { |
| final result = Directory(directory) |
| .listSync() |
| .whereType<File>() |
| .cast<File>() |
| .toList(); |
| print('listSync: ${result.length} ${result.map((f) => f.path)}'); |
| return result; |
| } on FileSystemException catch (_) { |
| // No such file or directory |
| return []; |
| } |
| } |
| |
| /// Write the [TilerModel] to persistent storage. |
| void write(TilerModel<ModuleInfo> a) { |
| if (a.root != null) { |
| String now = DateTime.now().toIso8601String(); |
| File(path.join(directory, now)) |
| ..createSync(recursive: true) |
| ..writeAsString(json.encode(toJson(a))); |
| _prune(); |
| } |
| } |
| |
| /// Read the [TilerModel] from persistent storage. |
| TilerModel<ModuleInfo> read(File f) { |
| String s = f.readAsStringSync(); |
| return fromJson(jsonDecode(s)); |
| } |
| |
| // Prune old files from the storage. |
| void _prune() { |
| int _compare(File a, File b) => |
| a.lastModifiedSync().compareTo(b.lastModifiedSync()); |
| |
| final files = listSync(); |
| print('Pruning file(s): $files'); |
| files.sort(_compare); |
| for (final file in files.skip(size)) { |
| file.deleteSync(); |
| } |
| } |
| } |