package org.atomnuke.container.packaging.resource; import java.net.URI; import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.Map; import java.util.TreeMap; public class ResourceManagerImpl implements ResourceManager { private final Map<URI, Resource> resourceMappings; private final Map<String, URI> resourceAliases; public ResourceManagerImpl() { this(new TreeMap<URI, Resource>(), new TreeMap<String, URI>()); } public ResourceManagerImpl(Map<URI, Resource> resourceMappings, Map<String, URI> resourceAliases) { this.resourceMappings = resourceMappings; this.resourceAliases = resourceAliases; } @Override public synchronized ResourceManager copy() { return new ResourceManagerImpl(new TreeMap<URI, Resource>(resourceMappings), new TreeMap<String, URI>(resourceAliases)); } @Override public synchronized Collection<Resource> resources() { return new LinkedList<Resource>(resourceMappings.values()); } @Override public synchronized boolean exists(String resourcePath) { return resourceAliases.containsKey(resourcePath); } @Override public synchronized boolean exists(URI location) { return resourceMappings.containsKey(location); } @Override public synchronized Resource lookup(String path) { final URI aliasedResource = resourceAliases.get(path); return aliasedResource != null ? lookup(aliasedResource) : null; } @Override public synchronized Resource lookup(URI path) { return resourceMappings.get(path); } @Override public synchronized void register(Resource resource) { resourceMappings.put(resource.uri(), resource); } @Override public synchronized void alias(String alias, URI location) { resourceAliases.put(alias, location); } @Override public boolean conflicts(URI path, byte[] digest) { final Resource internalDescriptor = resourceMappings.get(path); if (internalDescriptor != null) { // If the identies are not equal then this may be a potential conflict return !Arrays.equals(internalDescriptor.digestBytes(), digest); } return false; } }