package org.hive2hive.examples; import java.io.File; import java.io.IOException; import java.net.InetAddress; import net.engio.mbassy.listener.Handler; import net.engio.mbassy.listener.Listener; import net.engio.mbassy.listener.References; import org.apache.commons.io.FileUtils; import org.hive2hive.core.api.H2HNode; import org.hive2hive.core.api.configs.FileConfiguration; import org.hive2hive.core.api.configs.NetworkConfiguration; import org.hive2hive.core.api.interfaces.IFileConfiguration; import org.hive2hive.core.api.interfaces.IFileManager; 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.security.UserCredentials; /** * This example shows how to listen to events and take respective actions. * * @author Nico * */ public class EventsExample { public static void main(String[] args) throws Exception { IFileConfiguration fileConfiguration = FileConfiguration.createDefault(); // Create two nodes and open a new overlay network IH2HNode node1 = H2HNode.createNode(fileConfiguration); IH2HNode node2 = H2HNode.createNode(fileConfiguration); node1.connect(NetworkConfiguration.createInitial()); node2.connect(NetworkConfiguration.create(InetAddress.getLocalHost())); // These two file agents are used to configure the root directory of the logged in user ExampleFileAgent node1FileAgent = new ExampleFileAgent(); ExampleFileAgent node2FileAgent = new ExampleFileAgent(); // Register user 'Alice' and login her at node 1 and 2 UserCredentials alice = new UserCredentials("Alice", "password", "pin"); node1.getUserManager().createRegisterProcess(alice).execute(); node1.getUserManager().createLoginProcess(alice, node1FileAgent).execute(); node2.getUserManager().createLoginProcess(alice, node2FileAgent).execute(); // In this example, a file event listener is registered at node 2. Therefore, we will listen to events // that happen by actions taken by node 1. node2.getFileManager().subscribeFileEvents(new ExampleEventListener(node2.getFileManager())); // To demonstrate the 'add' event, we will add a new file with node 1 // Let's create a file and upload it at node 1 File fileAtNode1 = new File(node1FileAgent.getRoot(), "test-file-event.txt"); FileUtils.write(fileAtNode1, "Hello"); // add some content node1.getFileManager().createAddProcess(fileAtNode1).execute(); // Let's trigger a deletion event fileAtNode1.delete(); node1.getFileManager().createDeleteProcess(fileAtNode1).execute(); } // A Strong reference is necessary if this object is not held in any variable, otherwise GC would clean it // and events are not triggered anymore. So keep either a reference to this listener object or add the // strong reference annotation. @Listener(references = References.Strong) private static class ExampleEventListener implements IFileEventListener { private final IFileManager fileManager; public ExampleEventListener(IFileManager fileManager) { this.fileManager = fileManager; } @Override @Handler public void onFileAdd(IFileAddEvent fileEvent) { System.out.println("File was added: " + fileEvent.getFile().getName()); try { // download the new file fileManager.createDownloadProcess(fileEvent.getFile()).execute(); } catch (Exception e) { e.printStackTrace(); } } @Override @Handler public void onFileUpdate(IFileUpdateEvent fileEvent) { System.out.println("File was updated: " + fileEvent.getFile().getName()); try { // download the newest version fileManager.createDownloadProcess(fileEvent.getFile()).execute(); } catch (Exception e) { e.printStackTrace(); } } @Override @Handler public void onFileDelete(IFileDeleteEvent fileEvent) { System.out.println("File was deleted: " + fileEvent.getFile().getName()); // delete it at the event receiver as well fileEvent.getFile().delete(); } @Override @Handler public void onFileMove(IFileMoveEvent fileEvent) { try { // Move the file to the new destination if it exists if (fileEvent.isFile() && fileEvent.getSrcFile().exists()) { FileUtils.moveFile(fileEvent.getSrcFile(), fileEvent.getDstFile()); System.out.println("File was moved from " + fileEvent.getSrcFile() + " to " + fileEvent.getDstFile()); } else if (fileEvent.isFolder() && fileEvent.getSrcFile().exists()) { FileUtils.moveDirectory(fileEvent.getSrcFile(), fileEvent.getDstFile()); System.out.println("Folder was moved from " + fileEvent.getSrcFile() + " to " + fileEvent.getDstFile()); } } catch (IOException e) { e.printStackTrace(); } } @Override @Handler public void onFileShare(IFileShareEvent fileEvent) { System.out.println("File was shared by " + fileEvent.getInvitedBy()); // Currently, no further actions necessary. The invitation is accepted // automatically and 'onFileAdd' is called in an instant. } } }