Skip to content
This repository has been archived by the owner on May 16, 2018. It is now read-only.

Commit

Permalink
Merge branch 'master' into bbs-contingencies
Browse files Browse the repository at this point in the history
  • Loading branch information
mathbagu committed Jul 24, 2017
2 parents f2c6457 + 36feeb5 commit 2d0a68d
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ public Project getProject() {
return new Project(projectId, storage, fileSystem);
}

public void moveTo(ProjectFolder folder) {
Objects.requireNonNull(folder);
storage.setParentNode(id, folder.id);
}

public void delete() {
storage.deleteNode(id);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,69 @@
*/
public class AfsBaseTest {

private static class FooFile extends ProjectFile {

private FooFile(NodeId id, AppFileSystemStorage storage, NodeId projectId, AppFileSystem fileSystem) {
super(id, storage, projectId, fileSystem);
}

@Override
public FileIcon getIcon() {
return new FileIcon("?", new byte[]{});
}
}

private static class FooFileBuilder implements ProjectFileBuilder<FooFile> {

private final NodeId folderId;

private final AppFileSystemStorage storage;

private final NodeId projectId;

private final AppFileSystem fileSystem;

private FooFileBuilder(NodeId folderId, AppFileSystemStorage storage, NodeId projectId, AppFileSystem fileSystem) {
this.folderId = folderId;
this.storage = storage;
this.projectId = projectId;
this.fileSystem = fileSystem;
}

@Override
public FooFile build() {
NodeId id = storage.createNode(folderId, "foo", "foo");
return new FooFile(id, storage, projectId, fileSystem);
}
}

private static class FooFileExtension implements ProjectFileExtension {
@Override
public Class<? extends ProjectFile> getProjectFileClass() {
return FooFile.class;
}

@Override
public String getProjectFilePseudoClass() {
return "foo";
}

@Override
public Class<? extends ProjectFileBuilder<? extends ProjectFile>> getProjectFileBuilderClass() {
return FooFileBuilder.class;
}

@Override
public FooFile createProjectFile(NodeId id, AppFileSystemStorage storage, NodeId projectId, AppFileSystem fileSystem) {
return new FooFile(id, storage, projectId, fileSystem);
}

@Override
public FooFileBuilder createProjectFileBuilder(NodeId folderId, AppFileSystemStorage storage, NodeId projectId, AppFileSystem fileSystem) {
return new FooFileBuilder(folderId, storage, projectId, fileSystem);
}
}

private AppFileSystemStorage storage;

private AppFileSystem afs;
Expand All @@ -48,7 +111,7 @@ public void setup() throws IOException {
ComputationManager computationManager = Mockito.mock(ComputationManager.class);
afs = new AppFileSystem("mem", storage);
ad = new AppData(computationManager, importersLoader, Collections.singletonList(computationManager1 -> Collections.singletonList(afs)),
Collections.emptyList(), Collections.emptyList());
Collections.emptyList(), Collections.singletonList(new FooFileExtension()));
}

@After
Expand All @@ -57,11 +120,11 @@ public void tearDown() throws Exception {
}

@Test
public void test() throws IOException {
public void baseTest() throws IOException {
assertSame(afs, ad.getFileSystem("mem"));
assertNull(ad.getFileSystem("???"));
assertEquals("mem", afs.getName());
assertTrue(ad.getProjectFileClasses().isEmpty()); // no plugin
assertEquals(1, ad.getProjectFileClasses().size());
Folder root = afs.getRootFolder();
assertNotNull(root);
Folder dir1 = (Folder) root.getChild("dir1");
Expand Down Expand Up @@ -119,4 +182,20 @@ public void test() throws IOException {
assertEquals("dir6", project1.getRootFolder().getChild("dir5/dir6").getName());
}

@Test
public void moveToTest() throws IOException {
Project project = afs.getRootFolder().createProject("test", "");
ProjectFolder test1 = project.getRootFolder().createFolder("test1");
ProjectFolder test2 = project.getRootFolder().createFolder("test2");
FooFile file = test1.fileBuilder(FooFileBuilder.class)
.build();
assertEquals(test1.getId(), file.getFolder().getId());
assertEquals(1, test1.getChildren().size());
assertTrue(test2.getChildren().isEmpty());
file.moveTo(test2);
assertEquals(test2.getId(), file.getFolder().getId());
assertTrue(test1.getChildren().isEmpty());
assertEquals(1, test2.getChildren().size());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,11 @@ public NodeId getParentNode(NodeId nodeId) {
return path.equals(rootDir) ? null : new PathNodeId(path.getParent());
}

@Override
public void setParentNode(NodeId nodeId, NodeId newParentNodeId) {
throw new AssertionError();
}

@Override
public boolean isWritable(NodeId nodeId) {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,11 +279,38 @@ public NodeId getChildNode(NodeId parentNodeId, String name) {
public NodeId getParentNode(NodeId nodeId) {
Objects.requireNonNull(nodeId);
if (!nodeNameMap.containsKey(nodeId)) {
throw new AfsStorageException("Parent node " + nodeId + " not found");
throw new AfsStorageException("Node " + nodeId + " not found");
}
return parentNodeMap.get(nodeId);
}

@Override
public void setParentNode(NodeId nodeId, NodeId newParentNodeId) {
Objects.requireNonNull(nodeId);
Objects.requireNonNull(newParentNodeId);
if (!nodeNameMap.containsKey(nodeId)) {
throw new AfsStorageException("Node " + nodeId + " not found");
}
if (!nodeNameMap.containsKey(newParentNodeId)) {
throw new AfsStorageException("New parent node " + newParentNodeId+ " not found");
}
NodeId oldParentNodeId = parentNodeMap.get(nodeId);
if (oldParentNodeId == null) {
throw new AfsStorageException("Cannot change parent of root folder");
}

parentNodeMap.put(nodeId, newParentNodeId);

// remove from old parent
String name = nodeNameMap.get(nodeId);
childNodeMap.remove(new NamedLink(oldParentNodeId, name));
childNodesMap.put(oldParentNodeId, remove(childNodesMap.get(oldParentNodeId), nodeId));

// add to new parent
childNodesMap.put(newParentNodeId, add(childNodesMap.get(newParentNodeId), nodeId));
childNodeMap.put(new NamedLink(newParentNodeId, name), nodeId);
}

@Override
public boolean isWritable(NodeId nodeId) {
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public interface AppFileSystemStorage extends AutoCloseable {

NodeId getParentNode(NodeId nodeId);

void setParentNode(NodeId nodeId, NodeId newParentNodeId);

void deleteNode(NodeId nodeId);

String getStringAttribute(NodeId nodeId, String name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,4 +130,16 @@ public void test() throws IOException {
assertEquals(PseudoClass.PROJECT_FOLDER_PSEUDO_CLASS, storage.getNodePseudoClass(projectRootId));
assertTrue(storage.getChildNodes(projectRootId).isEmpty());
}

@Test
public void setParentTest() throws IOException {
NodeId rootFolderId = storage.getRootNode();
NodeId folder1Id = storage.createNode(rootFolderId, "test1", PseudoClass.FOLDER_PSEUDO_CLASS);
NodeId folder2Id = storage.createNode(rootFolderId, "test2", PseudoClass.FOLDER_PSEUDO_CLASS);
NodeId fileId = storage.createNode(folder1Id, "file", "file-type");
assertEquals(folder1Id, storage.getParentNode(fileId));
storage.setParentNode(fileId, folder2Id);
assertEquals(folder2Id, storage.getParentNode(fileId));
}

}

0 comments on commit 2d0a68d

Please sign in to comment.