1 package org
.argeo
.jcr
.fs
;
3 import java
.io
.InputStream
;
4 import java
.io
.OutputStream
;
6 import java
.nio
.file
.DirectoryStream
;
7 import java
.nio
.file
.Files
;
8 import java
.nio
.file
.Path
;
9 import java
.nio
.file
.attribute
.BasicFileAttributes
;
10 import java
.nio
.file
.attribute
.FileTime
;
11 import java
.nio
.file
.spi
.FileSystemProvider
;
12 import java
.util
.Arrays
;
15 import javax
.jcr
.Property
;
16 import javax
.jcr
.RepositoryException
;
17 import javax
.jcr
.Session
;
18 import javax
.jcr
.nodetype
.NodeType
;
20 import org
.apache
.commons
.io
.IOUtils
;
21 import org
.apache
.commons
.logging
.Log
;
22 import org
.apache
.commons
.logging
.LogFactory
;
23 import org
.apache
.jackrabbit
.core
.RepositoryImpl
;
24 import org
.argeo
.jackrabbit
.fs
.JackrabbitMemoryFsProvider
;
26 import junit
.framework
.TestCase
;
28 public class JcrFileSystemTest
extends TestCase
{
29 private final static Log log
= LogFactory
.getLog(JcrFileSystemTest
.class);
31 public void testMounts() throws Exception
{
32 JackrabbitMemoryFsProvider fsProvider
= new JackrabbitMemoryFsProvider() {
35 protected void postRepositoryCreation(RepositoryImpl repositoryImpl
) throws RepositoryException
{
37 Session session
= login();
38 session
.getWorkspace().createWorkspace("test");
43 Path rootPath
= fsProvider
.getPath(new URI("jcr+memory:/"));
44 log
.debug("Got root " + rootPath
);
45 Path testDir
= rootPath
.resolve("testDir");
46 Files
.createDirectory(testDir
);
48 Path testMount
= fsProvider
.getPath(new URI("jcr+memory:/test"));
49 log
.debug("Test path");
50 assertEquals(rootPath
, testMount
.getParent());
51 assertEquals(testMount
.getFileName(), rootPath
.relativize(testMount
));
53 Path testPath
= testMount
.resolve("test.txt");
54 log
.debug("Create file " + testPath
);
55 Files
.createFile(testPath
);
56 BasicFileAttributes bfa
= Files
.readAttributes(testPath
, BasicFileAttributes
.class);
57 FileTime ft
= bfa
.creationTime();
59 assertTrue(bfa
.isRegularFile());
60 log
.debug("Created " + testPath
+ " (" + ft
+ ")");
61 Files
.delete(testPath
);
62 log
.debug("Deleted " + testPath
);
64 // Browse directories from root
65 DirectoryStream
<Path
> files
= Files
.newDirectoryStream(rootPath
);
66 int directoryCount
= 0;
67 for (Path file
: files
) {
68 if (Files
.isDirectory(file
)) {
72 assertEquals(2, directoryCount
);
74 // Browse directories from mount
75 Path mountSubDir
= testMount
.resolve("mountSubDir");
76 Files
.createDirectory(mountSubDir
);
77 Path otherSubDir
= testMount
.resolve("otherSubDir");
78 Files
.createDirectory(otherSubDir
);
79 testPath
= testMount
.resolve("test.txt");
80 Files
.createFile(testPath
);
81 files
= Files
.newDirectoryStream(testMount
);
83 for (Path file
: files
) {
86 assertEquals(3, fileCount
);
90 public void testSimple() throws Exception
{
91 FileSystemProvider fsProvider
= new JackrabbitMemoryFsProvider();
94 Path rootPath
= fsProvider
.getPath(new URI("jcr+memory:/"));
95 log
.debug("Got root " + rootPath
);
96 Path testPath
= fsProvider
.getPath(new URI("jcr+memory:/test.txt"));
97 log
.debug("Test path");
98 assertEquals("test.txt", testPath
.getFileName().toString());
99 assertEquals(rootPath
, testPath
.getParent());
100 assertEquals(testPath
.getFileName(), rootPath
.relativize(testPath
));
101 // relativize self should be empty path
102 Path selfRelative
= testPath
.relativize(testPath
);
103 assertEquals("", selfRelative
.toString());
105 log
.debug("Create file " + testPath
);
106 Files
.createFile(testPath
);
107 BasicFileAttributes bfa
= Files
.readAttributes(testPath
, BasicFileAttributes
.class);
108 FileTime ft
= bfa
.creationTime();
110 assertTrue(bfa
.isRegularFile());
111 log
.debug("Created " + testPath
+ " (" + ft
+ ")");
112 Files
.delete(testPath
);
113 log
.debug("Deleted " + testPath
);
114 String txt
= "TEST\nTEST2\n";
115 byte[] arr
= txt
.getBytes();
116 Files
.write(testPath
, arr
);
117 log
.debug("Wrote " + testPath
);
118 byte[] read
= Files
.readAllBytes(testPath
);
119 assertTrue(Arrays
.equals(arr
, read
));
120 assertEquals(txt
, new String(read
));
121 log
.debug("Read " + testPath
);
122 Path testDir
= rootPath
.resolve("testDir");
123 log
.debug("Resolved " + testDir
);
125 Files
.createDirectory(testDir
);
126 log
.debug("Created directory " + testDir
);
127 Path subsubdir
= Files
.createDirectories(testDir
.resolve("subdir/subsubdir"));
128 log
.debug("Created sub directories " + subsubdir
);
129 Path copiedFile
= testDir
.resolve("copiedFile.txt");
130 log
.debug("Resolved " + copiedFile
);
131 Path relativeCopiedFile
= testDir
.relativize(copiedFile
);
132 assertEquals(copiedFile
.getFileName().toString(), relativeCopiedFile
.toString());
133 log
.debug("Relative copied file " + relativeCopiedFile
);
134 try (OutputStream out
= Files
.newOutputStream(copiedFile
); InputStream in
= Files
.newInputStream(testPath
)) {
135 IOUtils
.copy(in
, out
);
137 log
.debug("Copied " + testPath
+ " to " + copiedFile
);
138 Files
.delete(testPath
);
139 log
.debug("Deleted " + testPath
);
140 byte[] copiedRead
= Files
.readAllBytes(copiedFile
);
141 assertTrue(Arrays
.equals(copiedRead
, read
));
142 log
.debug("Read " + copiedFile
);
143 // Browse directories
144 DirectoryStream
<Path
> files
= Files
.newDirectoryStream(testDir
);
146 Path listedFile
= null;
147 for (Path file
: files
) {
149 if (!Files
.isDirectory(file
))
152 assertEquals(2, fileCount
);
153 assertEquals(copiedFile
, listedFile
);
154 assertEquals(copiedFile
.toString(), listedFile
.toString());
155 log
.debug("Listed " + testDir
);
156 // Generic attributes
157 Map
<String
, Object
> attrs
= Files
.readAttributes(copiedFile
, "*");
158 assertEquals(3, attrs
.size());
159 log
.debug("Read attributes of " + copiedFile
+ ": " + attrs
.keySet());
160 // Direct node access
161 NodeFileAttributes nfa
= Files
.readAttributes(copiedFile
, NodeFileAttributes
.class);
162 nfa
.getNode().addMixin(NodeType
.MIX_LANGUAGE
);
163 nfa
.getNode().getSession().save();
164 log
.debug("Add mix:language");
165 Files
.setAttribute(copiedFile
, Property
.JCR_LANGUAGE
, "fr");
166 log
.debug("Set language");
167 attrs
= Files
.readAttributes(copiedFile
, "*");
168 assertEquals(4, attrs
.size());
169 log
.debug("Read attributes of " + copiedFile
+ ": " + attrs
.keySet());
172 public void testIllegalCharacters() throws Exception
{
173 FileSystemProvider fsProvider
= new JackrabbitMemoryFsProvider();
174 String fileName
= "tüßçt[1].txt";
175 String pathStr
= "/testDir/" + fileName
;
176 Path testDir
= fsProvider
.getPath(new URI("jcr+memory:/testDir"));
177 Files
.createDirectory(testDir
);
178 Path testPath
= testDir
.resolve(fileName
);
179 assertEquals(pathStr
, testPath
.toString());
180 Files
.createFile(testPath
);
181 DirectoryStream
<Path
> files
= Files
.newDirectoryStream(testDir
);
182 Path listedPath
= files
.iterator().next();
183 assertEquals(pathStr
, listedPath
.toString());
185 String dirName
= "*[~WeirdDir~]*";
186 Path subDir
= testDir
.resolve(dirName
);
187 Files
.createDirectory(subDir
);
188 subDir
= testDir
.resolve(dirName
);
189 assertEquals(dirName
, subDir
.getFileName().toString());