diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index 6235be85..014a19a5 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -173,7 +173,7 @@ public class Core { eventBus.register(SearchEvent.class, fileManager) log.info("initializing mesh manager") - MeshManager meshManager = new MeshManager(fileManager) + MeshManager meshManager = new MeshManager(fileManager, home) eventBus.register(SourceDiscoveredEvent.class, meshManager) log.info "initializing persistence service" diff --git a/core/src/main/groovy/com/muwire/core/mesh/MeshManager.groovy b/core/src/main/groovy/com/muwire/core/mesh/MeshManager.groovy index 67aadfdd..40dd4123 100644 --- a/core/src/main/groovy/com/muwire/core/mesh/MeshManager.groovy +++ b/core/src/main/groovy/com/muwire/core/mesh/MeshManager.groovy @@ -1,18 +1,29 @@ package com.muwire.core.mesh +import java.util.stream.Collectors + import com.muwire.core.Constants import com.muwire.core.InfoHash +import com.muwire.core.Persona +import com.muwire.core.Personas import com.muwire.core.download.Pieces import com.muwire.core.download.SourceDiscoveredEvent import com.muwire.core.files.FileManager +import groovy.json.JsonOutput +import groovy.json.JsonSlurper +import net.i2p.data.Base64 + class MeshManager { private final Map meshes = Collections.synchronizedMap(new HashMap<>()) private final FileManager fileManager + private final File home - MeshManager(FileManager fileManager) { + MeshManager(FileManager fileManager, File home) { this.fileManager = fileManager + this.home = home + load() } Mesh get(InfoHash infoHash) { @@ -40,4 +51,39 @@ class MeshManager { return mesh.sources.add(e.source) } + + private void save() { + File meshFile = new File(home, "mesh.json") + synchronized(meshes) { + meshFile.withPrintWriter { writer -> + meshes.values().each { mesh -> + def json = [:] + json.infoHash = Base64.encode(mesh.infoHash.getRoot()) + json.sources = mesh.sources.stream().map({it.toBase64()}).collect(Collectors.toList()) + json.nPieces = mesh.pieces.nPieces + writer.println(JsonOutput.toJson(json)) + } + } + } + } + + private void load() { + File meshFile = new File(home, "mesh.json") + if (!meshFile.exists()) + return + JsonSlurper slurper = new JsonSlurper() + meshFile.eachLine { + def json = slurper.parseText(it) + InfoHash infoHash = new InfoHash(Base64.decode(json.infoHash)) + Pieces pieces = new Pieces(json.nPieces, Constants.DOWNLOAD_SEQUENTIAL_RATIO) + + Mesh mesh = new Mesh(infoHash, pieces) + json.sources.split(",").each { source -> + Persona persona = new Persona(new ByteArrayInputStream(Base64.decode(source))) + mesh.sources.add(persona) + } + + meshes.put(infoHash, mesh) + } + } }