Skip to content

Commit

Permalink
Issue #27 - A website now takes a number of file/directory filters th…
Browse files Browse the repository at this point in the history
…at are ignored on pushing or pulling
  • Loading branch information
robert-bor committed May 10, 2013
1 parent e07dcfe commit e404f3c
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
package org.javaswift.joss.client.website;

import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
import java.util.*;

public abstract class AbstractFileObjects implements FileObjects {

private final Map<String, FileObject> fileObjects = new TreeMap<String, FileObject>();

private final String[] ignoreFilters;

public AbstractFileObjects() {
this(new String[]{});
}

public AbstractFileObjects(final String[] ignoreFilters) {
this.ignoreFilters = ignoreFilters;
}

protected void add(String path, FileObject fileObject) {
this.fileObjects.put(path, fileObject);
}
Expand All @@ -22,4 +30,14 @@ public FileObject get(String path) {
return this.fileObjects.get(path);
}

@Override
public boolean ignore(String path) {
for (String ignoreFilter : ignoreFilters) {
if (path.equals(ignoreFilter)) {
return true;
}
}
return false;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,18 @@

public abstract class AbstractWebsite extends AbstractContainer implements Website {

private String[] ignoreFilters = new String[] {};

public AbstractWebsite(Account account, String name, boolean allowCaching) {
super(account, name, allowCaching);
}

@Override
public Website setIgnoreFilters(String[] ignoreFilters) {
this.ignoreFilters = ignoreFilters;
return this;
}

@Override
/**
* Websites are made public by default. If this is not desirable, the Website can be made private again
Expand Down Expand Up @@ -90,15 +98,15 @@ public void setListing(boolean listing) {
@Override
public void pushDirectory(File directory) {
syncDirectory(
new LocalFileObjects(directory), // source
new LocalFileObjects(directory, ignoreFilters), // source
new ObjectStoreFileObjects(this)); // target
}

@Override
public void pullDirectory(File directory) {
syncDirectory(
new ObjectStoreFileObjects(this), // target
new LocalFileObjects(directory)); // source
new LocalFileObjects(directory, ignoreFilters )); // source
}

protected void syncDirectory(FileObjects source, FileObjects target) {
Expand All @@ -112,6 +120,9 @@ protected void syncDirectory(FileObjects source, FileObjects target) {

private void deleteObjects(FileObjects source, FileObjects target) {
for (String targetPath : target.keys()) {
if (target.ignore(targetPath)) {
continue;
}
FileObject targetObject = target.get(targetPath);
if (source.get(targetPath) == null) {
targetObject.delete();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public interface FileObjects {

void cleanup();

public boolean ignore(String path);

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,17 @@
import org.javaswift.joss.util.FileReference;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class LocalFileObjects extends AbstractFileObjects {

private final File rootDirectory;

public LocalFileObjects(File rootDirectory) {
public LocalFileObjects(File rootDirectory, final String[] ignoreFilters) {
super(ignoreFilters);
this.rootDirectory = rootDirectory;
for (FileReference file : FileAction.listFiles(this.rootDirectory)) {
for (FileReference file : FileAction.listFiles(this.rootDirectory, ignoreFilters)) {
add(file.getPath(), new LocalFileObject(file));
}
}
Expand All @@ -32,6 +35,7 @@ public void cleanup() {
deleteEmptyDirectories(rootDirectory);
}

@SuppressWarnings({"ConstantConditions", "ResultOfMethodCallIgnored"})
protected void deleteEmptyDirectories(File directory) {
for (File file : directory.listFiles()) {
if (file.isDirectory()) {
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/org/javaswift/joss/model/Website.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,12 @@ public interface Website extends Container {
*/
public void pullDirectory(File directory);

/**
* Passes a number of files and directories that must be ignored by the push/pull mechanism. Use normal
* path notation using the root directory as the root path.
* @param ignoreFilters files/directories to be ignored
* @return instance of Website
*/
public Website setIgnoreFilters(String[] ignoreFilters);

}
23 changes: 20 additions & 3 deletions src/main/java/org/javaswift/joss/util/FileAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,26 +40,43 @@ protected static void close(Closeable closeable) throws IOException {
}

public static List<FileReference> listFiles(File root) {
return listFiles(root, new String[] {});
}

public static List<FileReference> listFiles(File root, String[] ignoreFilters) {
List<FileReference> files = new ArrayList<FileReference>();
List<String> path = new ArrayList<String>();
if (root.isDirectory()) {
listFiles(files, path, root);
listFiles(files, path, root, ignoreFilters);
}
return files;
}

@SuppressWarnings("ConstantConditions")
protected static void listFiles(List<FileReference> files, List<String> path, File directoryFile) {
protected static void listFiles(List<FileReference> files, List<String> path, File directoryFile, String[] ignoreFilters) {
for (File currentFile : directoryFile.listFiles()) {
if (ignore(path, ignoreFilters)) {
continue;
}
List<String> currentPath = getPath(path, currentFile.getName());
if (currentFile.isDirectory()) {
listFiles(files, currentPath, currentFile);
listFiles(files, currentPath, currentFile, ignoreFilters);
} else {
files.add(new FileReference(currentFile, currentPath));
}
}
}

protected static boolean ignore(List<String> pathAndFile, String[] ignoreFilters) {
String path = FileReference.getPath(0, pathAndFile);
for (String ignoreFilter : ignoreFilters) {
if (path.equals(ignoreFilter)) {
return true;
}
}
return false;
}

protected static List<String> getPath(List<String> currentPath, String extension) {
List<String> path = new ArrayList<String>();
path.addAll(currentPath);
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/javaswift/joss/util/FileReference.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ public String getPath() {
}

public String getPath(int startFrom) {
return getPath(startFrom, pathAndFile);
}

public static String getPath(int startFrom, List<String> pathAndFile) {
StringBuilder path = new StringBuilder();
int count = 0;
for (String currentPart : pathAndFile) {
Expand Down
25 changes: 25 additions & 0 deletions src/test/java/org/javaswift/joss/client/mock/WebsiteMockTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,31 @@ public void deleteEmptyFolders() throws IOException, URISyntaxException {
assertFalse(new File(writeDir.getPath()+"/script/modb").exists());
}

@Test
public void ignoreFoldersOnPushing() throws IOException, URISyntaxException {
Swift swift = new Swift()
.setOnFileObjectStore("websites");
website = new WebsiteMock(new AccountMock(swift), "website")
.setIgnoreFilters(new String[] {"script"} );
website.pushDirectory(FileAction.getFile("websites/website"));
assertEquals(4, website.list().size());
}

@SuppressWarnings("ConstantConditions")
@Test
public void ignoreFileOnPulling() throws IOException, URISyntaxException {
Swift swift = new Swift()
.setOnFileObjectStore("object-store");
website = new WebsiteMock(new AccountMock(swift), "container1");
website.pullDirectory(this.writeDir);
assertEquals(2, writeDir.listFiles().length); // 2 files
website = new WebsiteMock(new AccountMock(swift), "container2")
.setIgnoreFilters(new String[] {"checkmark.png"});
website.pullDirectory(this.writeDir);
assertEquals(6, writeDir.listFiles().length); // 6 files, checkmark.png has not been removed
}


@Test
public void getHost() {
Swift swift = new Swift()
Expand Down

0 comments on commit e404f3c

Please sign in to comment.