提交 a5388c9a 编写于 作者: O Oleg Nenashev 提交者: GitHub

Merge pull request #3091 from jglick/Memoizer

Deprecating Memoizer as there is a better replacement in Java 8
...@@ -31,7 +31,6 @@ import jenkins.model.Jenkins; ...@@ -31,7 +31,6 @@ import jenkins.model.Jenkins;
import hudson.model.ViewDescriptor; import hudson.model.ViewDescriptor;
import hudson.model.Descriptor.FormException; import hudson.model.Descriptor.FormException;
import hudson.util.AdaptedIterator; import hudson.util.AdaptedIterator;
import hudson.util.Memoizer;
import hudson.util.Iterators.FlattenIterator; import hudson.util.Iterators.FlattenIterator;
import hudson.slaves.NodeDescriptor; import hudson.slaves.NodeDescriptor;
import hudson.tasks.Publisher; import hudson.tasks.Publisher;
...@@ -41,6 +40,8 @@ import java.util.List; ...@@ -41,6 +40,8 @@ import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
...@@ -213,14 +214,12 @@ public class DescriptorExtensionList<T extends Describable<T>, D extends Descrip ...@@ -213,14 +214,12 @@ public class DescriptorExtensionList<T extends Describable<T>, D extends Descrip
/** /**
* Stores manually registered Descriptor instances. Keyed by the {@link Describable} type. * Stores manually registered Descriptor instances. Keyed by the {@link Describable} type.
*/ */
private static final Memoizer<Class,CopyOnWriteArrayList<ExtensionComponent<Descriptor>>> legacyDescriptors = new Memoizer<Class,CopyOnWriteArrayList<ExtensionComponent<Descriptor>>>() { @SuppressWarnings("rawtypes")
public CopyOnWriteArrayList compute(Class key) { private static final Map<Class, CopyOnWriteArrayList<ExtensionComponent<Descriptor>>> legacyDescriptors = new ConcurrentHashMap<>();
return new CopyOnWriteArrayList();
}
};
@SuppressWarnings({"unchecked", "rawtypes"})
private static <T extends Describable<T>> CopyOnWriteArrayList<ExtensionComponent<Descriptor<T>>> getLegacyDescriptors(Class<T> type) { private static <T extends Describable<T>> CopyOnWriteArrayList<ExtensionComponent<Descriptor<T>>> getLegacyDescriptors(Class<T> type) {
return (CopyOnWriteArrayList)legacyDescriptors.get(type); return legacyDescriptors.computeIfAbsent(type, key -> new CopyOnWriteArrayList());
} }
/** /**
......
...@@ -30,7 +30,6 @@ import jenkins.ExtensionComponentSet; ...@@ -30,7 +30,6 @@ import jenkins.ExtensionComponentSet;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import hudson.util.AdaptedIterator; import hudson.util.AdaptedIterator;
import hudson.util.DescriptorList; import hudson.util.DescriptorList;
import hudson.util.Memoizer;
import hudson.util.Iterators; import hudson.util.Iterators;
import hudson.ExtensionPoint.LegacyInstancesAreScopedToHudson; import hudson.ExtensionPoint.LegacyInstancesAreScopedToHudson;
...@@ -40,7 +39,9 @@ import java.util.Collection; ...@@ -40,7 +39,9 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Vector; import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
...@@ -395,11 +396,12 @@ public class ExtensionList<T> extends AbstractList<T> implements OnMaster { ...@@ -395,11 +396,12 @@ public class ExtensionList<T> extends AbstractList<T> implements OnMaster {
return create((Jenkins)hudson,type); return create((Jenkins)hudson,type);
} }
@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> ExtensionList<T> create(Jenkins jenkins, Class<T> type) { public static <T> ExtensionList<T> create(Jenkins jenkins, Class<T> type) {
if(type.getAnnotation(LegacyInstancesAreScopedToHudson.class)!=null) if(type.getAnnotation(LegacyInstancesAreScopedToHudson.class)!=null)
return new ExtensionList<T>(jenkins,type); return new ExtensionList<T>(jenkins,type);
else { else {
return new ExtensionList<T>(jenkins,type,staticLegacyInstances.get(type)); return new ExtensionList(jenkins, type, staticLegacyInstances.computeIfAbsent(type, key -> new CopyOnWriteArrayList()));
} }
} }
...@@ -420,11 +422,8 @@ public class ExtensionList<T> extends AbstractList<T> implements OnMaster { ...@@ -420,11 +422,8 @@ public class ExtensionList<T> extends AbstractList<T> implements OnMaster {
/** /**
* Places to store static-scope legacy instances. * Places to store static-scope legacy instances.
*/ */
private static final Memoizer<Class,CopyOnWriteArrayList> staticLegacyInstances = new Memoizer<Class,CopyOnWriteArrayList>() { @SuppressWarnings("rawtypes")
public CopyOnWriteArrayList compute(Class key) { private static final Map<Class, CopyOnWriteArrayList> staticLegacyInstances = new ConcurrentHashMap<>();
return new CopyOnWriteArrayList();
}
};
/** /**
* Exposed for the test harness to clear all legacy extension instances. * Exposed for the test harness to clear all legacy extension instances.
......
...@@ -34,7 +34,9 @@ import java.util.concurrent.ConcurrentHashMap; ...@@ -34,7 +34,9 @@ import java.util.concurrent.ConcurrentHashMap;
* *
* @author Kohsuke Kawaguchi * @author Kohsuke Kawaguchi
* @since 1.281 * @since 1.281
* @deprecated Simply use {@link ConcurrentHashMap#computeIfAbsent}.
*/ */
@Deprecated
public abstract class Memoizer<K,V> { public abstract class Memoizer<K,V> {
private final ConcurrentHashMap<K,V> store = new ConcurrentHashMap<K,V>(); private final ConcurrentHashMap<K,V> store = new ConcurrentHashMap<K,V>();
......
...@@ -158,14 +158,12 @@ import hudson.util.HudsonIsLoading; ...@@ -158,14 +158,12 @@ import hudson.util.HudsonIsLoading;
import hudson.util.HudsonIsRestarting; import hudson.util.HudsonIsRestarting;
import hudson.util.Iterators; import hudson.util.Iterators;
import hudson.util.JenkinsReloadFailed; import hudson.util.JenkinsReloadFailed;
import hudson.util.Memoizer;
import hudson.util.MultipartFormDataParser; import hudson.util.MultipartFormDataParser;
import hudson.util.NamingThreadFactory; import hudson.util.NamingThreadFactory;
import hudson.util.PluginServletFilter; import hudson.util.PluginServletFilter;
import hudson.util.RemotingDiagnostics; import hudson.util.RemotingDiagnostics;
import hudson.util.RemotingDiagnostics.HeapDump; import hudson.util.RemotingDiagnostics.HeapDump;
import hudson.util.TextFile; import hudson.util.TextFile;
import java.util.concurrent.TimeUnit;
import hudson.util.VersionNumber; import hudson.util.VersionNumber;
import hudson.util.XStream2; import hudson.util.XStream2;
import hudson.views.DefaultMyViewsTabBar; import hudson.views.DefaultMyViewsTabBar;
...@@ -461,20 +459,14 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve ...@@ -461,20 +459,14 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
/** /**
* All {@link ExtensionList} keyed by their {@link ExtensionList#extensionType}. * All {@link ExtensionList} keyed by their {@link ExtensionList#extensionType}.
*/ */
private transient final Memoizer<Class,ExtensionList> extensionLists = new Memoizer<Class,ExtensionList>() { @SuppressWarnings("rawtypes")
public ExtensionList compute(Class key) { private transient final Map<Class, ExtensionList> extensionLists = new ConcurrentHashMap<>();
return ExtensionList.create(Jenkins.this,key);
}
};
/** /**
* All {@link DescriptorExtensionList} keyed by their {@link DescriptorExtensionList#describableType}. * All {@link DescriptorExtensionList} keyed by their {@link DescriptorExtensionList#describableType}.
*/ */
private transient final Memoizer<Class,DescriptorExtensionList> descriptorLists = new Memoizer<Class,DescriptorExtensionList>() { @SuppressWarnings("rawtypes")
public DescriptorExtensionList compute(Class key) { private transient final Map<Class, DescriptorExtensionList> descriptorLists = new ConcurrentHashMap<>();
return DescriptorExtensionList.createDescriptorList(Jenkins.this,key);
}
};
/** /**
* {@link Computer}s in this Jenkins system. Read-only. * {@link Computer}s in this Jenkins system. Read-only.
...@@ -2636,7 +2628,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve ...@@ -2636,7 +2628,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
*/ */
@SuppressWarnings({"unchecked"}) @SuppressWarnings({"unchecked"})
public <T> ExtensionList<T> getExtensionList(Class<T> extensionType) { public <T> ExtensionList<T> getExtensionList(Class<T> extensionType) {
return extensionLists.get(extensionType); return extensionLists.computeIfAbsent(extensionType, key -> ExtensionList.create(this, key));
} }
/** /**
...@@ -2657,7 +2649,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve ...@@ -2657,7 +2649,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
*/ */
@SuppressWarnings({"unchecked"}) @SuppressWarnings({"unchecked"})
public <T extends Describable<T>,D extends Descriptor<T>> DescriptorExtensionList<T,D> getDescriptorList(Class<T> type) { public <T extends Describable<T>,D extends Descriptor<T>> DescriptorExtensionList<T,D> getDescriptorList(Class<T> type) {
return descriptorLists.get(type); return descriptorLists.computeIfAbsent(type, key -> DescriptorExtensionList.createDescriptorList(this, key));
} }
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册