From f77c31d703c99883849c3a9b66dd321378b6749c Mon Sep 17 00:00:00 2001 From: danielshaya Date: Wed, 22 Apr 2015 19:36:12 +0100 Subject: [PATCH] Initial commit for FilePerMap implementation. --- .../openhft/chronicle/map/FilePerKeyMap.java | 62 ++++++++++++++++++- .../chronicle/map/FilePerMapKeyTest.java | 31 ++++++---- 2 files changed, 80 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/map/FilePerKeyMap.java b/src/main/java/net/openhft/chronicle/map/FilePerKeyMap.java index 21039e287..87f74cb44 100644 --- a/src/main/java/net/openhft/chronicle/map/FilePerKeyMap.java +++ b/src/main/java/net/openhft/chronicle/map/FilePerKeyMap.java @@ -1,5 +1,6 @@ package net.openhft.chronicle.map; +import com.sun.nio.file.SensitivityWatchEventModifier; import net.openhft.chronicle.hash.function.SerializableFunction; import org.jetbrains.annotations.NotNull; @@ -21,12 +22,71 @@ public class FilePerKeyMap implements ChronicleMap { public FilePerKeyMap(String dir) { try { + this.dir = dir; dirPath = Paths.get(dir); Files.createDirectories(dirPath); + + new Thread("WatcherThread") { + public void run() { + try { + WatchService watcher = FileSystems.getDefault().newWatchService(); + dirPath.register(watcher, new WatchEvent.Kind[]{ + StandardWatchEventKinds.ENTRY_CREATE, + StandardWatchEventKinds.ENTRY_DELETE, + StandardWatchEventKinds.ENTRY_MODIFY}, + SensitivityWatchEventModifier.HIGH + ); + + while(true){ + WatchKey key = null; + try { + key = watcher.take(); + System.out.println("Event Taken"); + for (WatchEvent event : key.pollEvents()) { + // get event type + WatchEvent.Kind kind = event.kind(); + + // get file name + @SuppressWarnings("unchecked") + WatchEvent ev = (WatchEvent) event; + Path fileName = ev.context(); + + String mapKey = fileName.toString(); + + + if (kind == StandardWatchEventKinds.OVERFLOW) { + System.out.println("OVERFLOW"); + continue; + } else if (kind == StandardWatchEventKinds.ENTRY_CREATE) { + Path p = dirPath.resolve(fileName); + String mapVal = getFileContents(p); + System.out.println("created " + mapKey + " : " + mapVal); + } else if (kind == StandardWatchEventKinds.ENTRY_DELETE) { + System.out.println("deleted " + mapKey); + } else if (kind == StandardWatchEventKinds.ENTRY_MODIFY) { + Path p = dirPath.resolve(fileName); + String mapVal = getFileContents(p); + System.out.println("modified " + mapKey + " : " + mapVal); + } + } + + } catch (InterruptedException e) { + System.out.println("Watcher service exiting"); + return; + }finally{ + key.reset(); + } + } + } catch (IOException e) { + throw new AssertionError(e); + } + } + }.start(); + + } catch (IOException e) { throw new AssertionError(e); } - this.dir = dir; } @Override diff --git a/src/test/java/net/openhft/chronicle/map/FilePerMapKeyTest.java b/src/test/java/net/openhft/chronicle/map/FilePerMapKeyTest.java index 7f0500255..f141d8dde 100644 --- a/src/test/java/net/openhft/chronicle/map/FilePerMapKeyTest.java +++ b/src/test/java/net/openhft/chronicle/map/FilePerMapKeyTest.java @@ -23,12 +23,13 @@ public class FilePerMapKeyTest { } /** - * Testing the put + * Testing all the methods of the map with simple tests. */ @Test - public void testPut(){ + public void testMapMethods() { //There are no entries in the map so null should be returned FilePerKeyMap map = new FilePerKeyMap<>("/tmp/filepermaptests"); + //just in case it hasn't been cleared up last time map.clear(); @@ -90,26 +91,32 @@ public class FilePerMapKeyTest { assertTrue(set.contains("six")); assertTrue(set.contains("seven")); - set = (Set)map.values(); + set = (Set) map.values(); assertEquals(3, set.size()); assertTrue(set.contains("test5")); assertTrue(set.contains("test6")); assertTrue(set.contains("test7")); - Set entryset = (Set)map.entrySet(); + Set entryset = (Set) map.entrySet(); assertEquals(3, entryset.size()); - for(Iterator it = entryset.iterator(); it.hasNext();){ + for (Iterator it = entryset.iterator(); it.hasNext(); ) { Map.Entry entry = it.next(); - if(entry.getKey().equals("five")){ - assertEquals(entry.getValue(),"test5"); - }else if(entry.getKey().equals("six")){ - assertEquals(entry.getValue(),"test6"); - }else if(entry.getKey().equals("seven")){ - assertEquals(entry.getValue(),"test7"); - }else{ + if (entry.getKey().equals("five")) { + assertEquals(entry.getValue(), "test5"); + } else if (entry.getKey().equals("six")) { + assertEquals(entry.getValue(), "test6"); + } else if (entry.getKey().equals("seven")) { + assertEquals(entry.getValue(), "test7"); + } else { //should never get here!! assertTrue(false); } } + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } } + }