diff --git a/textarea/elfinder-sakai/pom.xml b/textarea/elfinder-sakai/pom.xml
index b9864280899c..402236af30d0 100644
--- a/textarea/elfinder-sakai/pom.xml
+++ b/textarea/elfinder-sakai/pom.xml
@@ -56,6 +56,12 @@
classes
jar
+
+ org.mockito
+ mockito-core
+ 1.10.19
+ test
+
\ No newline at end of file
diff --git a/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/SakaiFsService.java b/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/SakaiFsService.java
index 28829c828567..81661ed2ab87 100644
--- a/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/SakaiFsService.java
+++ b/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/SakaiFsService.java
@@ -219,6 +219,10 @@ public String asId(FsItem fsItem) {
}
}
+ public SiteService getSiteService() {
+ return siteService;
+ }
+
public void setSiteService(SiteService siteService) {
this.siteService = siteService;
}
diff --git a/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/content/ContentSiteVolumeFactory.java b/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/content/ContentSiteVolumeFactory.java
index cb94e9504f5a..0ca321d9519a 100644
--- a/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/content/ContentSiteVolumeFactory.java
+++ b/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/content/ContentSiteVolumeFactory.java
@@ -265,9 +265,8 @@ public String getName(FsItem fsi) {
public FsItem getParent(FsItem fsi) {
String rootId = asId(getRoot());
- String id1 = asId(fsi);
- if (!rootId.equals(id1)) {
- String id = asId(fsi);
+ String id = asId(fsi);
+ if (id.startsWith(rootId) && !rootId.equals(id)) {
String parentId = contentHostingService.getContainingCollectionId(id);
return fromPath(parentId);
} else {
diff --git a/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/site/SiteFsVolume.java b/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/site/SiteFsVolume.java
index ae4e9cd2d2fa..09b493d681cd 100644
--- a/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/site/SiteFsVolume.java
+++ b/textarea/elfinder-sakai/src/java/org/sakaiproject/elfinder/sakai/site/SiteFsVolume.java
@@ -35,8 +35,7 @@ public String getSiteId() {
public SiteFsVolume(String siteId, SakaiFsService service) {
this.siteId = siteId;
this.service = service;
- // TODO Injection
- siteService = (SiteService) ComponentManager.get(SiteService.class);
+ this.siteService = service.getSiteService();
}
@Override
diff --git a/textarea/elfinder-sakai/src/test/org/sakaiproject/elfinder/sakai/content/ContentSiteVolumeFactoryTest.java b/textarea/elfinder-sakai/src/test/org/sakaiproject/elfinder/sakai/content/ContentSiteVolumeFactoryTest.java
new file mode 100644
index 000000000000..59aba6e97eb9
--- /dev/null
+++ b/textarea/elfinder-sakai/src/test/org/sakaiproject/elfinder/sakai/content/ContentSiteVolumeFactoryTest.java
@@ -0,0 +1,88 @@
+package org.sakaiproject.elfinder.sakai.content;
+
+import cn.bluejoe.elfinder.service.FsItem;
+import cn.bluejoe.elfinder.service.FsVolume;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.sakaiproject.content.api.ContentHostingService;
+import org.sakaiproject.elfinder.sakai.SakaiFsService;
+import org.sakaiproject.elfinder.sakai.SiteVolume;
+import org.sakaiproject.site.api.SiteService;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ContentSiteVolumeFactoryTest {
+
+ @Mock
+ private ContentHostingService contentHostingService;
+
+ @Mock
+ private SiteService siteService;
+
+ @Mock
+ private SakaiFsService service;
+
+ @Mock
+ private FsItem siteItem;
+ @Mock
+ private FsVolume siteVolume;
+
+ private ContentSiteVolumeFactory factory;
+
+ @Before
+ public void setUp() {
+
+ factory = new ContentSiteVolumeFactory();
+ factory.setSiteService(siteService);
+ factory.setContentHostingService(contentHostingService);
+
+ }
+
+ @Test
+ public void testGetParent() {
+
+ Mockito.when(contentHostingService.getSiteCollection("siteId")).thenReturn("/group/siteId");
+ Mockito.when(contentHostingService.getContainingCollectionId("/group/siteId/example")).thenReturn("/group/siteId");
+ Mockito.when(contentHostingService.getContainingCollectionId("/group/siteId")).thenReturn("/group");
+ Mockito.when(contentHostingService.getContainingCollectionId("/group")).thenReturn("");
+ Mockito.when(service.getSiteVolume("siteId")).thenReturn(siteVolume);
+ Mockito.when(siteVolume.getRoot()).thenReturn(siteItem);
+
+ SiteVolume volume = factory.getVolume(service, "siteId");
+
+ // This is for a path inside the same site
+ FsItem fsItem = volume.fromPath("/group/siteId/example");
+ Assert.assertNotNull(fsItem);
+ FsItem parent = volume.getParent(fsItem);
+ Assert.assertNotNull(parent);
+ FsItem siteParent = volume.getParent(parent);
+ Assert.assertNotNull(siteParent);
+
+ Assert.assertEquals("Should get site back", siteItem, siteParent);
+ }
+
+ @Test
+ public void testParentCrossSite() {
+
+ Mockito.when(contentHostingService.getSiteCollection("siteId")).thenReturn("/group/siteId");
+ Mockito.when(contentHostingService.getContainingCollectionId("/group/otherId/example")).thenReturn("/group/otherId");
+ Mockito.when(contentHostingService.getContainingCollectionId("/group/otherId")).thenReturn("/group");
+ Mockito.when(service.getSiteVolume("siteId")).thenReturn(siteVolume);
+ Mockito.when(siteVolume.getRoot()).thenReturn(siteItem);
+
+ SiteVolume volume = factory.getVolume(service, "siteId");
+
+ // This is for a path outisde the same site
+ FsItem otherItem = volume.fromPath("/group/otherId/example");
+ Assert.assertNotNull(otherItem);
+ FsItem otherParent = volume.getParent(otherItem);
+ Assert.assertNotNull(otherParent);
+ // Should have got back the site parent instead
+ Assert.assertEquals("Should get site back", siteItem, otherParent);
+ }
+
+}