Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
mcculls authored and kohsuke committed Mar 1, 2011
1 parent d4db356 commit 9987524
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 52 deletions.
34 changes: 34 additions & 0 deletions core/src/main/java/hudson/ClassicPluginStrategy.java
Expand Up @@ -24,6 +24,7 @@
package hudson;

import hudson.PluginWrapper.Dependency;
import hudson.model.Hudson;
import hudson.util.IOException2;
import hudson.util.MaskingClassLoader;
import hudson.util.VersionNumber;
Expand All @@ -47,6 +48,7 @@
import java.util.List;
import java.util.jar.Manifest;
import java.util.jar.Attributes;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.tools.ant.BuildException;
Expand Down Expand Up @@ -256,6 +258,38 @@ private ClassLoader getBaseClassLoader(Attributes atts) {
public void initializeComponents(PluginWrapper plugin) {
}

public <T> List<ExtensionComponent<T>> findComponents(Class<T> type, Hudson hudson) {

List<ExtensionFinder> finders;
if (type==ExtensionFinder.class) {
// Avoid infinite recursion of using ExtensionFinders to find ExtensionFinders
finders = Collections.<ExtensionFinder>singletonList(new ExtensionFinder.Sezpoz());
} else {
finders = hudson.getExtensionList(ExtensionFinder.class);
}

/**
* See {@link ExtensionFinder#scout(Class, Hudson)} for the dead lock issue and what this does.
*/
if (LOGGER.isLoggable(Level.FINER))
LOGGER.log(Level.FINER,"Scout-loading ExtensionList: "+type, new Throwable());
for (ExtensionFinder finder : finders) {
finder.scout(type, hudson);
}

List<ExtensionComponent<T>> r = new ArrayList<ExtensionComponent<T>>();
for (ExtensionFinder finder : finders) {
try {
r.addAll(finder._find(type, hudson));
} catch (AbstractMethodError e) {
// backward compatibility
for (T t : finder.findExtensions(type, hudson))
r.add(new ExtensionComponent<T>(t));
}
}
return r;
}

public void load(PluginWrapper wrapper) throws IOException {
// override the context classloader so that XStream activity in plugin.start()
// will be able to resolve classes in this plugin
Expand Down
5 changes: 0 additions & 5 deletions core/src/main/java/hudson/DescriptorExtensionList.java
Expand Up @@ -141,11 +141,6 @@ protected Object getLoadLock() {
return this;
}

@Override
protected void scoutLoad() {
// no-op, since our load() doesn't by itself do any classloading
}

/**
* Loading the descriptors in this case means filtering the descriptor from the master {@link ExtensionList}.
*/
Expand Down
48 changes: 2 additions & 46 deletions core/src/main/java/hudson/ExtensionList.java
Expand Up @@ -23,14 +23,14 @@
*/
package hudson;

import hudson.ExtensionFinder.Sezpoz;
import hudson.init.InitMilestone;
import hudson.model.Hudson;
import hudson.util.AdaptedIterator;
import hudson.util.DescriptorList;
import hudson.util.Memoizer;
import hudson.util.Iterators;
import hudson.ExtensionPoint.LegacyInstancesAreScopedToHudson;
import hudson.PluginStrategy;

import java.util.AbstractList;
import java.util.ArrayList;
Expand Down Expand Up @@ -197,22 +197,12 @@ public T getDynamic(String className) {
return null;
}


/**
* Returns {@link ExtensionFinder}s used to search for the extension instances.
*/
protected Iterable<? extends ExtensionFinder> finders() {
return hudson.getExtensionList(ExtensionFinder.class);
}

private List<ExtensionComponent<T>> ensureLoaded() {
if(extensions!=null)
return extensions; // already loaded
if(Hudson.getInstance().getInitLevel().compareTo(InitMilestone.PLUGINS_PREPARED)<0)
return legacyInstances; // can't perform the auto discovery until all plugins are loaded, so just make the legacy instances visible

scoutLoad();

synchronized (getLoadLock()) {
if(extensions==null) {
List<ExtensionComponent<T>> r = load();
Expand All @@ -237,35 +227,14 @@ protected Object getLoadLock() {
*/
private static final class Lock {}

/**
* See {@link ExtensionFinder#scout(Class, Hudson)} for the dead lock issue and what this does.
*/
protected void scoutLoad() {
if (LOGGER.isLoggable(Level.FINER))
LOGGER.log(Level.FINER,"Scout-loading ExtensionList: "+extensionType, new Throwable());
for (ExtensionFinder finder : finders()) {
finder.scout(extensionType, hudson);
}
}

/**
* Loads all the extensions.
*/
protected List<ExtensionComponent<T>> load() {
if (LOGGER.isLoggable(Level.FINE))
LOGGER.log(Level.FINE,"Loading ExtensionList: "+extensionType, new Throwable());

List<ExtensionComponent<T>> r = new ArrayList<ExtensionComponent<T>>();
for (ExtensionFinder finder : finders()) {
try {
r.addAll(finder._find(extensionType, hudson));
} catch (AbstractMethodError e) {
// backward compatibility
for (T t : finder.findExtensions(extensionType, hudson))
r.add(new ExtensionComponent<T>(t));
}
}
return r;
return hudson.getPluginManager().getPluginStrategy().findComponents(extensionType, hudson);
}

/**
Expand All @@ -282,19 +251,6 @@ protected List<ExtensionComponent<T>> sort(List<ExtensionComponent<T>> r) {
}

public static <T> ExtensionList<T> create(Hudson hudson, Class<T> type) {
if(type==ExtensionFinder.class)
return new ExtensionList<T>(hudson,type) {
Set<Sezpoz> finders = Collections.singleton(new Sezpoz());

/**
* If this ExtensionList is searching for ExtensionFinders, calling hudson.getExtensionList
* results in infinite recursion.
*/
@Override
protected Iterable<? extends ExtensionFinder> finders() {
return finders;
}
};
if(type.getAnnotation(LegacyInstancesAreScopedToHudson.class)!=null)
return new ExtensionList<T>(hudson,type);
else {
Expand Down
14 changes: 13 additions & 1 deletion core/src/main/java/hudson/PluginStrategy.java
Expand Up @@ -23,8 +23,11 @@
*/
package hudson;

import hudson.model.Hudson;

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

/**
* Pluggability point for how to create {@link PluginWrapper}.
Expand Down Expand Up @@ -63,4 +66,13 @@ public abstract PluginWrapper createPluginWrapper(File archive)
*/
public abstract void initializeComponents(PluginWrapper plugin);

}
/**
* Find components of the given type using the assigned strategy.
*
* @param type The component type
* @param hudson The Hudson scope
* @return Sequence of components
* @since 1.400
*/
public abstract <T> List<ExtensionComponent<T>> findComponents(Class<T> type, Hudson hudson);
}

0 comments on commit 9987524

Please sign in to comment.