Allow plugins to replace gerrit-provided DynamicItem

This should make it possible in the future to allow plugins to
override items provided by core gerrit, such as the WebSession.

This only affects plugins trying to override gerrit core.  If two
plugins try to replace the same DynamicItem then the second will fail.

Change-Id: I399dfc1577003e6a1478f7cb7f40b0b2ffc86c36
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
index aa1dc76..4888f4f 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
@@ -152,6 +152,12 @@
     while (!ref.compareAndSet(null, item)) {
       NamedProvider<T> old = ref.get();
       if (old != null) {
+        if ("gerrit".equals(old.pluginName)) {
+          if (ref.compareAndSet(old, item)) {
+            break;
+          }
+          old = ref.get();
+        }
         throw new ProvisionException(String.format(
             "%s already provided by %s, ignoring plugin %s",
             key.getTypeLiteral(), old.pluginName, pluginName));