/**
*
*/
package org.jboss.test.faces.staging;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/**
* Directory-like map for a virtual web application content.
* @author Nick Belaevski
*
*/
public class DirectoryMap<Resource, Directory extends Resource> {
/**
* Directory content.
*/
private final Map<String, Resource> children = new TreeMap<String, Resource>();
private final Directory directory;
private final DirectoryMapAdapter<Resource, Directory> adapter;
public DirectoryMap(Directory directory, DirectoryMapAdapter<Resource, Directory> instance) {
super();
this.directory = directory;
this.adapter = instance;
}
private void putChild(String fileName, Resource child) {
Resource previousChild = children.put(fileName, child);
if (previousChild != null) {
//TODO warning for replaced resource
}
}
public Directory addDirectory(String fileName) {
if (fileName == null) {
throw new IllegalArgumentException();
}
Resource childResource = children.get(fileName);
Directory result = adapter.asDirectory(childResource);
if (result == null) {
String resourcePath = adapter.getResourcePath(directory);
if (resourcePath == null) {
resourcePath = "";
}
result = adapter.createChildDirectory(resourcePath + "/" + fileName);
putChild(fileName, result);
}
return result;
}
public Directory addDirectory(ServerResourcePath path) {
if (null == path) {
throw new IllegalArgumentException();
}
Directory result = this.directory;
ServerResourcePath subPath = path;
String fileName;
while (subPath != null && (fileName = subPath.getFileName()) != null) {
result = adapter.addDirectory(result, fileName);
subPath = subPath.getNextPath();
}
return result;
}
public void addResource(ServerResourcePath path, Resource resource) {
if (null == path) {
throw new IllegalArgumentException();
}
String fileName = path.getFileName();
if (fileName == null) {
throw new IllegalArgumentException();
}
if (path.hasNextPath()) {
Directory childResource = addDirectory(fileName);
adapter.addResource(childResource, path.getNextPath(), resource);
} else {
putChild(fileName, resource);
}
}
public Resource getResource(ServerResourcePath path) {
if (null == path) {
throw new NullPointerException();
}
Resource resource = null; //children.get(path.getName());
String fileName = path.getFileName();
if (fileName == null) {
// Path points to the resource itself.
resource = this.directory;
} else {
resource = children.get(fileName);
if (resource != null && path.hasNextPath()) {
// Get next resource in the tree, if exists.
resource = adapter.getResource(resource, path.getNextPath());
}
}
return resource;
}
public Set<String> getResourceNames() {
return children.keySet();
}
public Collection<Resource> getResources() {
return children.values();
}
public void clear() {
children.clear();
}
}