package org.peerbox.share; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import javafx.application.Application; import javafx.stage.Stage; import net.engio.mbassy.listener.Handler; import org.apache.commons.lang3.RandomStringUtils; import org.hive2hive.core.api.interfaces.IH2HNode; import org.hive2hive.core.events.framework.interfaces.IFileEventListener; import org.hive2hive.core.events.framework.interfaces.file.IFileAddEvent; import org.hive2hive.core.events.framework.interfaces.file.IFileDeleteEvent; import org.hive2hive.core.events.framework.interfaces.file.IFileMoveEvent; import org.hive2hive.core.events.framework.interfaces.file.IFileShareEvent; import org.hive2hive.core.events.framework.interfaces.file.IFileUpdateEvent; import org.hive2hive.core.processes.files.list.FileNode; import org.hive2hive.core.security.UserCredentials; import org.hive2hive.core.utils.FileTestUtil; import org.hive2hive.core.utils.NetworkTestUtil; import org.hive2hive.core.utils.TestFileConfiguration; import org.hive2hive.core.utils.helper.TestFileAgent; import org.mockito.Mockito; import org.peerbox.app.config.UserConfig; import org.peerbox.app.manager.file.FileManager; import org.peerbox.app.manager.file.IFileManager; import org.peerbox.app.manager.node.INodeManager; import org.peerbox.app.manager.user.IUserManager; import org.peerbox.app.manager.user.UserManager; import org.peerbox.events.MessageBus; public class ShareFolderStarter extends Application { private static final int NETWORK_SIZE = 5; private static List<IH2HNode> network; // clientA private IH2HNode[] clientsA = new IH2HNode[2]; // clientB private IH2HNode[] clientsB = new IH2HNode[2]; private Path basePath; private Path rootA; private Path rootB; private String sharedFolderName = "SharedFolder"; private ShareFolderController controller; static { TestFileConfiguration.CHUNK_SIZE = 1024*1024; } public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { initNetwork(); initFiles(); initDownloadSharedFolder(); initGui(); } private void initNetwork() throws Exception { network = NetworkTestUtil.createH2HNetwork(NETWORK_SIZE); UserCredentials credentialsA = new UserCredentials("UserA", "PasswordA", "PinA"); UserCredentials credentialsB = new UserCredentials("UserB", "PasswordB", "PinB"); clientsA[0] = network.get(0); clientsB[0] = network.get(1); clientsA[1] = network.get(2); clientsB[1] = network.get(3); basePath = FileTestUtil.getTempDirectory().toPath(); // register 2 users and login rootA = basePath.resolve("ClientA"); Files.createDirectory(rootA); clientsA[0].getUserManager().createRegisterProcess(credentialsA).execute(); clientsA[0].getUserManager().createLoginProcess(credentialsA, new TestFileAgent(rootA.toFile())).execute(); rootB = basePath.resolve("ClientB"); Files.createDirectory(rootB); clientsB[0].getUserManager().createRegisterProcess(credentialsB).execute(); clientsB[0].getUserManager().createLoginProcess(credentialsB, new TestFileAgent(rootB.toFile())).execute(); } private void initFiles() throws Exception { Path toShare = rootA.resolve(sharedFolderName); Files.createDirectory(toShare); Path f = toShare.resolve("testfile.txt"); String content = RandomStringUtils.randomAscii(512*1024); Files.write(f, content.getBytes()); clientsA[0].getFileManager().createAddProcess(toShare.toFile()).execute(); clientsA[0].getFileManager().createAddProcess(f.toFile()).execute(); } private void initGui() { MessageBus messageBus = Mockito.mock(MessageBus.class); INodeManager nodeManager = Mockito.mock(INodeManager.class); Mockito.stub(nodeManager.getNode()).toReturn(clientsA[0]); UserConfig userConfig = Mockito.mock(UserConfig.class); Mockito.stub(userConfig.getRootPath()).toReturn(rootA); IFileManager fileManager = new FileManager(nodeManager, userConfig); IUserManager userManager = new UserManager(nodeManager, messageBus); controller = new ShareFolderController(fileManager, userManager, messageBus); ShareFolderUILoader uiLoader = new ShareFolderUILoader(controller); uiLoader.setFolderToShare(rootA.resolve(sharedFolderName)); uiLoader.loadUi(); } private void initDownloadSharedFolder() throws IOException { // download folder as notification is received. clientsB[0].getFileManager().subscribeFileEvents(new IFileEventListener() { @Handler @Override public void onFileUpdate(IFileUpdateEvent fileEvent) { } @Handler @Override public void onFileShare(IFileShareEvent fileEvent) { System.out.println("Invited by '" + fileEvent.getInvitedBy() + "', shared folder: " + fileEvent.getFile().toString()); try { FileNode root = clientsB[0].getFileManager().createFileListProcess().execute(); for (FileNode n : FileNode.getNodeList(root, true, true)) { if (n.getFile().toPath().startsWith(fileEvent.getFile().toPath())) { clientsB[0].getFileManager().createDownloadProcess(n.getFile()).execute(); } } } catch (Exception e) { e.printStackTrace(); } } @Handler @Override public void onFileMove(IFileMoveEvent fileEvent) { } @Handler @Override public void onFileDelete(IFileDeleteEvent fileEvent) { } @Handler @Override public void onFileAdd(IFileAddEvent fileEvent) { } }); } }