From 27188157d64b54a9c6296d8941aef8bcf586d870 Mon Sep 17 00:00:00 2001 From: Ted Pearson Date: Mon, 1 May 2017 01:30:50 -0400 Subject: [PATCH] add isDirectory to VirtualFileReference Only FileReference actually implements it, other implementations always return false Purpose: to allow my hackathon project, a browser-based mesh browser, to know if it should list or download a file. --- .../addthis/meshy/LocalFileHandlerMux.java | 4 ++ .../com/addthis/meshy/LocalFileSystem.java | 5 ++ .../addthis/meshy/VirtualFileReference.java | 2 + .../meshy/service/file/FileReference.java | 17 +++-- .../meshy/service/file/FileTarget.java | 6 +- .../meshy/service/message/MessageFile.java | 4 ++ src/test/files/d/dir/file | 0 .../meshy/service/file/TestFileService.java | 68 ++++++++++--------- .../addthis/meshy/service/file/TestVFS.java | 6 +- 9 files changed, 70 insertions(+), 42 deletions(-) create mode 100644 src/test/files/d/dir/file diff --git a/src/main/java/com/addthis/meshy/LocalFileHandlerMux.java b/src/main/java/com/addthis/meshy/LocalFileHandlerMux.java index 89abbc2..adecc14 100644 --- a/src/main/java/com/addthis/meshy/LocalFileHandlerMux.java +++ b/src/main/java/com/addthis/meshy/LocalFileHandlerMux.java @@ -118,6 +118,10 @@ public VirtualFileReference getFile(String name) { return null; } + @Override public boolean isDirectory() { + return false; + } + @Override public VirtualFileInput getInput(Map options) { try { diff --git a/src/main/java/com/addthis/meshy/LocalFileSystem.java b/src/main/java/com/addthis/meshy/LocalFileSystem.java index 808c377..e713ad8 100644 --- a/src/main/java/com/addthis/meshy/LocalFileSystem.java +++ b/src/main/java/com/addthis/meshy/LocalFileSystem.java @@ -119,6 +119,11 @@ public long getLength() { return ptr.length(); } + @Override + public boolean isDirectory() { + return ptr.isDirectory(); + } + @Nullable @Override public Iterator listFiles(@Nonnull final PathMatcher filter) { try { diff --git a/src/main/java/com/addthis/meshy/VirtualFileReference.java b/src/main/java/com/addthis/meshy/VirtualFileReference.java index 079a6d4..e247831 100644 --- a/src/main/java/com/addthis/meshy/VirtualFileReference.java +++ b/src/main/java/com/addthis/meshy/VirtualFileReference.java @@ -29,6 +29,8 @@ public interface VirtualFileReference { public long getLength(); + public boolean isDirectory(); + public Iterator listFiles(@Nonnull PathMatcher filter); public VirtualFileReference getFile(String name); diff --git a/src/main/java/com/addthis/meshy/service/file/FileReference.java b/src/main/java/com/addthis/meshy/service/file/FileReference.java index 1c9d163..d71930e 100644 --- a/src/main/java/com/addthis/meshy/service/file/FileReference.java +++ b/src/main/java/com/addthis/meshy/service/file/FileReference.java @@ -28,17 +28,19 @@ public class FileReference { public final String name; public final long lastModified; public final long size; + public final boolean isDirectory; private String hostUUID; - public FileReference(final String name, final long last, final long size) { + public FileReference(final String name, final long last, final long size, final boolean isDirectory) { this.name = name; this.lastModified = last; this.size = size; + this.isDirectory = isDirectory; } public FileReference(final String prefix, final VirtualFileReference ref) { - this(prefix + '/' + ref.getName(), ref.getLastModified(), ref.getLength()); + this(prefix + '/' + ref.getName(), ref.getLastModified(), ref.getLength(), ref.isDirectory()); } public FileReference(final byte[] data) throws IOException { @@ -47,6 +49,7 @@ public FileReference(final byte[] data) throws IOException { lastModified = LessBytes.readLength(in); size = LessBytes.readLength(in); hostUUID = LessBytes.readString(in); + isDirectory = in.read() == 1; } /** @@ -63,11 +66,12 @@ public String getHostUUID() { byte[] encode(String uuid) { try { - ByteArrayOutputStream out = new ByteArrayOutputStream(name.length() * 2 + 12); + ByteArrayOutputStream out = new ByteArrayOutputStream(name.length() * 2 + 13); LessBytes.writeString(name, out); LessBytes.writeLength(lastModified, out); LessBytes.writeLength(size, out); LessBytes.writeString(uuid != null ? uuid : hostUUID, out); + out.write(isDirectory ? 1 : 0); return out.toByteArray(); } catch (IOException ie) { //using ByteArrayOutputStream. Cant actually throw these @@ -77,7 +81,7 @@ byte[] encode(String uuid) { @Override public String toString() { - return "[nm=" + name + ",lm=" + lastModified + ",sz=" + size + ",uu=" + hostUUID + ']'; + return "[nm=" + name + ",lm=" + lastModified + ",sz=" + size + ",dir=" + isDirectory + ",uu=" + hostUUID + ']'; } @Override @@ -98,6 +102,9 @@ public boolean equals(Object other) { if (size != otherReference.size) { return false; } + if (isDirectory != otherReference.isDirectory) { + return false; + } if (!Objects.equal(hostUUID, otherReference.hostUUID)) { return false; } @@ -106,6 +113,6 @@ public boolean equals(Object other) { @Override public int hashCode() { - return Objects.hashCode(name, lastModified, size, hostUUID); + return Objects.hashCode(name, lastModified, size, isDirectory, hostUUID); } } diff --git a/src/main/java/com/addthis/meshy/service/file/FileTarget.java b/src/main/java/com/addthis/meshy/service/file/FileTarget.java index d6a7242..8e5e909 100644 --- a/src/main/java/com/addthis/meshy/service/file/FileTarget.java +++ b/src/main/java/com/addthis/meshy/service/file/FileTarget.java @@ -257,7 +257,7 @@ public void doFind() throws IOException { localFindTimer.update(localRunTime, TimeUnit.MILLISECONDS); } finally { if (forwardMetaData) { - FileReference flagRef = new FileReference("localfind", 0, 0); + FileReference flagRef = new FileReference("localfind", 0, 0, false); FileTarget.this.send(flagRef.encode(null)); } //Expected conditions under which we should cleanup: If we do not expect a response from the mesh @@ -362,7 +362,7 @@ private boolean sendLocalFileRef(FileReference fileReference) { private void forwardPeerList(Collection peerList) { int peerCount = peerList.size(); - FileReference flagRef = new FileReference("peers", 0, peerCount); + FileReference flagRef = new FileReference("peers", 0, peerCount, false); send(flagRef.encode(FileTarget.peersToString(peerList))); } @@ -550,7 +550,7 @@ public void receiveComplete(ChannelState state, int completedSession) throws Exc super.receiveComplete(state, completedSession); if (forwardMetaData) { int peerCount = getPeerCount(); - FileReference flagRef = new FileReference("response", 0, peerCount); + FileReference flagRef = new FileReference("response", 0, peerCount, false); FileTarget.this.send(flagRef.encode(state.getChannelRemoteAddress().getHostName())); } if (doComplete.compareAndSet(true, false) && !firstDone.compareAndSet(false, true)) { diff --git a/src/main/java/com/addthis/meshy/service/message/MessageFile.java b/src/main/java/com/addthis/meshy/service/message/MessageFile.java index 6d9ff57..4744a09 100644 --- a/src/main/java/com/addthis/meshy/service/message/MessageFile.java +++ b/src/main/java/com/addthis/meshy/service/message/MessageFile.java @@ -87,6 +87,10 @@ public long getLength() { return length; } + @Override public boolean isDirectory() { + return false; + } + @Override public Iterator listFiles(PathMatcher filter) { synchronized (files) { diff --git a/src/test/files/d/dir/file b/src/test/files/d/dir/file new file mode 100644 index 0000000..e69de29 diff --git a/src/test/java/com/addthis/meshy/service/file/TestFileService.java b/src/test/java/com/addthis/meshy/service/file/TestFileService.java index 49cb533..8a173b4 100644 --- a/src/test/java/com/addthis/meshy/service/file/TestFileService.java +++ b/src/test/java/com/addthis/meshy/service/file/TestFileService.java @@ -36,32 +36,34 @@ public void singlePeer() throws Exception { final MeshyServer server = getServer("src/test/files"); final MeshyClient client = getClient(server); FileSource files = new FileSource(client, new String[]{ - "*/*.xml", - "*/hosts", + "*/*", + "*/hosts" }); files.waitComplete(); log.info("file.list --> {}", files.getFileList()); Map map = files.getFileMap(); - checkFile(map, new FileReference("/a/abc.xml", 0, 4).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/a/def.xml", 0, 7).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/b/ghi.xml", 0, 4).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/b/jkl.xml", 0, 7).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/c/hosts", 0, 593366).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/mux/hosts", 0, 593366).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/a/abc.xml", 0, 4, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/a/def.xml", 0, 7, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/b/ghi.xml", 0, 4, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/b/jkl.xml", 0, 7, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/c/hosts", 0, 593366, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/mux/hosts", 0, 593366, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/d/dir", 0, 102, true).setHostUUID(server.getUUID())); /** second test exercises the cache */ files = new FileSource(client, new String[]{ - "*/*.xml", + "*/*", "*/hosts", }); files.waitComplete(); log.info("file.list --> {}", files.getFileList()); map = files.getFileMap(); - checkFile(map, new FileReference("/a/abc.xml", 0, 4).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/a/def.xml", 0, 7).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/b/ghi.xml", 0, 4).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/b/jkl.xml", 0, 7).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/c/hosts", 0, 593366).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/mux/hosts", 0, 593366).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/a/abc.xml", 0, 4, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/a/def.xml", 0, 7, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/b/ghi.xml", 0, 4, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/b/jkl.xml", 0, 7, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/c/hosts", 0, 593366, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/mux/hosts", 0, 593366, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/d/dir", 0, 102, true).setHostUUID(server.getUUID())); } @Test @@ -75,12 +77,12 @@ public void globSyntax() throws Exception { files.waitComplete(); log.info("file.list --> {}", files.getFileList()); Map map = files.getFileMap(); - checkFile(map, new FileReference("/a/abc.xml", 0, 4).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/a/def.xml", 0, 7).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/a/abc.xml", 0, 4, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/a/def.xml", 0, 7, false).setHostUUID(server.getUUID())); assertFalse(map.containsKey("/b/ghi.xml")); assertFalse(map.containsKey("/b/jkl.xml")); - checkFile(map, new FileReference("/c/hosts", 0, 593366).setHostUUID(server.getUUID())); - checkFile(map, new FileReference("/mux/hosts", 0, 593366).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/c/hosts", 0, 593366, false).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/mux/hosts", 0, 593366, false).setHostUUID(server.getUUID())); } @Test @@ -98,26 +100,26 @@ public void multiPeer() throws Exception { log.info("file.list --> {}", files.getFileList()); Map map = files.getFileMap(); log.info("file map --> {}", map); - checkFile(map, new FileReference("/abc.xml", 0, 4).setHostUUID(server1.getUUID())); - checkFile(map, new FileReference("/def.xml", 0, 7).setHostUUID(server1.getUUID())); - checkFile(map, new FileReference("/ghi.xml", 0, 4).setHostUUID(server2.getUUID())); - checkFile(map, new FileReference("/jkl.xml", 0, 7).setHostUUID(server2.getUUID())); - checkFile(map, new FileReference("/xyz.xml", 0, 10).setHostUUID(server3.getUUID())); + checkFile(map, new FileReference("/abc.xml", 0, 4, false).setHostUUID(server1.getUUID())); + checkFile(map, new FileReference("/def.xml", 0, 7, false).setHostUUID(server1.getUUID())); + checkFile(map, new FileReference("/ghi.xml", 0, 4, false).setHostUUID(server2.getUUID())); + checkFile(map, new FileReference("/jkl.xml", 0, 7, false).setHostUUID(server2.getUUID())); + checkFile(map, new FileReference("/xyz.xml", 0, 10, false).setHostUUID(server3.getUUID())); } @Test public void testEquals() throws Exception { FileReference[] refs = new FileReference[5]; - refs[0] = new FileReference("/a/abc.xml", 0, 4); - refs[1] = new FileReference("/a/def.xml", 0, 7); - refs[2] = new FileReference(null, 0, 4); + refs[0] = new FileReference("/a/abc.xml", 0, 4, false); + refs[1] = new FileReference("/a/def.xml", 0, 7, false); + refs[2] = new FileReference(null, 0, 4, false); // refs[0] and refs[3] are equal - refs[3] = new FileReference("/a/abc.xml", 0, 4); + refs[3] = new FileReference("/a/abc.xml", 0, 4, false); // refs[2] and refs[4] are equal - refs[4] = new FileReference(null, 0, 4); + refs[4] = new FileReference(null, 0, 4, false); refs[0].setHostUUID("a"); refs[1].setHostUUID("b"); @@ -151,10 +153,10 @@ public void testEquals() throws Exception { public void testHashCode() throws Exception { FileReference[] refs = new FileReference[4]; - refs[0] = new FileReference("/a/abc.xml", 0, 4); - refs[1] = new FileReference("/a/abc.xml", 0, 4); - refs[2] = new FileReference(null, 0, 4); - refs[3] = new FileReference(null, 0, 4); + refs[0] = new FileReference("/a/abc.xml", 0, 4, false); + refs[1] = new FileReference("/a/abc.xml", 0, 4, false); + refs[2] = new FileReference(null, 0, 4, false); + refs[3] = new FileReference(null, 0, 4, false); refs[0].setHostUUID("a"); refs[1].setHostUUID("a"); diff --git a/src/test/java/com/addthis/meshy/service/file/TestVFS.java b/src/test/java/com/addthis/meshy/service/file/TestVFS.java index 6c04886..f4c527b 100644 --- a/src/test/java/com/addthis/meshy/service/file/TestVFS.java +++ b/src/test/java/com/addthis/meshy/service/file/TestVFS.java @@ -59,7 +59,7 @@ public void testVFS() throws Exception { files.waitComplete(); Map map = files.getFileMap(); log.info("map={}", map); - checkFile(map, new FileReference("/dummy", 0, 0).setHostUUID(server.getUUID())); + checkFile(map, new FileReference("/dummy", 0, 0, false).setHostUUID(server.getUUID())); } public static class DummyHandler implements LocalFileHandler { @@ -104,6 +104,10 @@ public long getLength() { return 0; } + @Override public boolean isDirectory() { + return false; + } + @Override public Iterator listFiles(PathMatcher filter) { return null;