diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java new file mode 100644 index 0000000000..3875b778cd --- /dev/null +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java @@ -0,0 +1,37 @@ +// Copyright (C) 2014 The Android Open Source Project +// +// 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.google.gerrit.extensions.annotations; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import com.google.inject.BindingAnnotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * Annotation applied to HttpServletRequest and HttpServletResponse + * when they are inherited from Gerrit instead of being injected by + * a plugin's ServletModule. This means that the path returned by + * {@link javax.servlet.http.HttpServletRequest#getPathInfo} is + * relative to the Gerrit root instead of a path within the plugin's + * URL space. + */ +@Target({ElementType.PARAMETER, ElementType.FIELD}) +@Retention(RUNTIME) +@BindingAnnotation +public @interface RootRelative { +} diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java index 8bc57abc91..3742f47c67 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java @@ -95,9 +95,7 @@ public class PrivateInternals_DynamicTypes { DynamicItem item = (DynamicItem) e.getValue(); for (Binding b : bindings(src, type)) { - if (b.getKey().getAnnotation() != null) { - handles.add(item.set(b.getKey(), b.getProvider(), pluginName)); - } + handles.add(item.set(b.getKey(), b.getProvider(), pluginName)); } } } catch (RuntimeException e) { diff --git a/gerrit-server/BUCK b/gerrit-server/BUCK index aaac9c99a9..a75967a26a 100644 --- a/gerrit-server/BUCK +++ b/gerrit-server/BUCK @@ -47,6 +47,7 @@ java_library2( '//lib:parboiled-core', '//lib:pegdown', '//lib:protobuf', + '//lib:servlet-api-3_1', '//lib:velocity', '//lib/antlr:java_runtime', '//lib/commons:codec', diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java index 975fc72d84..bc622ad4f7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java @@ -24,6 +24,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.gerrit.common.Nullable; +import com.google.gerrit.extensions.annotations.RootRelative; import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.extensions.registration.DynamicMap; @@ -56,6 +57,8 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * Tracks Guice bindings that should be exposed to loaded plugins. @@ -501,6 +504,12 @@ public class PluginGuiceEnvironment { bindings.remove(Key.get(Injector.class)); bindings.remove(Key.get(java.util.logging.Logger.class)); + final @Nullable Binding requestBinding = + src.getExistingBinding(Key.get(HttpServletRequest.class)); + + final @Nullable Binding responseBinding = + src.getExistingBinding(Key.get(HttpServletResponse.class)); + return new AbstractModule() { @SuppressWarnings("unchecked") @Override @@ -510,6 +519,17 @@ public class PluginGuiceEnvironment { Binding b = (Binding) e.getValue(); bind(k).toProvider(b.getProvider()); } + + if (requestBinding != null) { + bind(HttpServletRequest.class) + .annotatedWith(RootRelative.class) + .toProvider(requestBinding.getProvider()); + } + if (responseBinding != null) { + bind(HttpServletResponse.class) + .annotatedWith(RootRelative.class) + .toProvider(responseBinding.getProvider()); + } } }; }