/*
* Copyright 2008 Whohoo Licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable
* law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*/
package com.googlecode.mycontainer.util.cpscanner;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.List;
import com.googlecode.mycontainer.util.cpscanner.plugin.DirectoryClasspathPlugin;
import com.googlecode.mycontainer.util.cpscanner.plugin.ZipClasspathPlugin;
public class ClasspathScanner implements ScannerPlugin {
private final List<ScannerPlugin> plugins = new ArrayList<ScannerPlugin>();
private final List<ScannerListener> listeners = new ArrayList<ScannerListener>();
public ClasspathScanner() {
plugins.add(new ZipClasspathPlugin());
plugins.add(new DirectoryClasspathPlugin());
}
public void addListener(ScannerListener listener) {
this.listeners.add(listener);
}
public void scan(Class<?> clazz) {
ProtectionDomain pd = clazz.getProtectionDomain();
CodeSource cs = pd.getCodeSource();
scan(cs.getLocation());
}
public void scan(URL url) {
scan(url, url);
}
public void scan(URL base, URL url) {
List<URL> files = listFiles(url);
for (URL file : files) {
fireEvent(base, file);
}
List<URL> dirs = listDirectories(url);
for (URL dir : dirs) {
scan(base, dir);
}
}
private void fireEvent(URL base, URL file) {
for (ScannerListener listener : listeners) {
listener.resourceFound(base, file);
}
}
public List<URL> listDirectories(URL directory) {
for (ScannerPlugin plugin : plugins) {
List<URL> ret = plugin.listDirectories(directory);
if (ret != null) {
return ret;
}
}
throw new RuntimeException("ScannerPlugin not found: " + directory);
}
public List<URL> listFiles(URL directory) {
for (ScannerPlugin plugin : plugins) {
List<URL> ret = plugin.listFiles(directory);
if (ret != null) {
return ret;
}
}
throw new RuntimeException("ScannerPlugin not found: " + directory);
}
}