001/* 002 * Syncany, www.syncany.org 003 * Copyright (C) 2011-2016 Philipp C. Heckel <philipp.heckel@gmail.com> 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU General Public License as published by 007 * the Free Software Foundation, either version 3 of the License, or 008 * (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU General Public License for more details. 014 * 015 * You should have received a copy of the GNU General Public License 016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 017 */ 018package org.syncany.operations.daemon.messages; 019 020import java.io.File; 021import java.util.HashSet; 022import java.util.Map; 023import java.util.logging.Level; 024 025import org.syncany.config.Config; 026import org.syncany.config.LocalEventBus; 027import org.syncany.database.FileContent; 028import org.syncany.database.FileVersion; 029import org.syncany.database.ObjectId; 030import org.syncany.database.ChunkEntry.ChunkChecksum; 031import org.syncany.database.MultiChunkEntry.MultiChunkId; 032import org.syncany.database.PartialFileHistory.FileHistoryId; 033import org.syncany.database.SqlDatabase; 034import org.syncany.operations.Assembler; 035import org.syncany.operations.Downloader; 036import org.syncany.operations.daemon.messages.api.FolderRequest; 037import org.syncany.operations.daemon.messages.api.FolderRequestHandler; 038import org.syncany.operations.daemon.messages.api.Response; 039import org.syncany.plugins.transfer.TransferManager; 040import org.syncany.util.StringUtil; 041 042public class GetFileFolderRequestHandler extends FolderRequestHandler { 043 private SqlDatabase localDatabase; 044 private LocalEventBus eventBus; 045 046 public GetFileFolderRequestHandler(Config config) { 047 super(config); 048 049 this.localDatabase = new SqlDatabase(config); 050 this.eventBus = LocalEventBus.getInstance(); 051 } 052 053 @Override 054 public Response handleRequest(FolderRequest request) { 055 GetFileFolderRequest concreteRequest = (GetFileFolderRequest) request; 056 057 try { 058 FileHistoryId fileHistoryId = FileHistoryId.parseFileId(concreteRequest.getFileHistoryId()); 059 long version = concreteRequest.getVersion(); 060 061 FileVersion fileVersion = localDatabase.getFileVersion(fileHistoryId, version); 062 FileContent fileContent = localDatabase.getFileContent(fileVersion.getChecksum(), true); 063 Map<ChunkChecksum, MultiChunkId> multiChunks = localDatabase.getMultiChunkIdsByChecksums(fileContent.getChunks()); 064 065 TransferManager transferManager = config.getTransferPlugin().createTransferManager(config.getConnection(), config); 066 Downloader downloader = new Downloader(config, transferManager); 067 Assembler assembler = new Assembler(config, localDatabase); 068 069 downloader.downloadAndDecryptMultiChunks(new HashSet<MultiChunkId>(multiChunks.values())); 070 071 File tempFile = assembler.assembleToCache(fileVersion); 072 String tempFileToken = StringUtil.toHex(ObjectId.secureRandomBytes(40)); 073 074 GetFileFolderResponse fileResponse = new GetFileFolderResponse(concreteRequest.getId(), concreteRequest.getRoot(), tempFileToken); 075 GetFileFolderResponseInternal fileResponseInternal = new GetFileFolderResponseInternal(fileResponse, tempFile); 076 077 eventBus.post(fileResponseInternal); 078 return null; 079 } 080 catch (Exception e) { 081 logger.log(Level.WARNING, "Cannot reassemble file.", e); 082 return new BadRequestResponse(concreteRequest.getId(), "Cannot reassemble file."); 083 } 084 } 085}