| // Copyright (C) 2012 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.httpd.plugins; |
| |
| import com.google.common.collect.Maps; |
| import com.google.common.flogger.FluentLogger; |
| import com.google.gerrit.common.Version; |
| import com.google.gerrit.server.plugins.Plugin; |
| import java.io.InputStream; |
| import java.lang.reflect.InvocationHandler; |
| import java.lang.reflect.Method; |
| import java.lang.reflect.Proxy; |
| import java.net.URL; |
| import java.util.Collections; |
| import java.util.Enumeration; |
| import java.util.Set; |
| import java.util.concurrent.ConcurrentMap; |
| import javax.servlet.RequestDispatcher; |
| import javax.servlet.Servlet; |
| import javax.servlet.ServletContext; |
| |
| class PluginServletContext { |
| private static final FluentLogger logger = FluentLogger.forEnclosingClass(); |
| |
| static ServletContext create(Plugin plugin, String contextPath) { |
| return (ServletContext) |
| Proxy.newProxyInstance( |
| PluginServletContext.class.getClassLoader(), |
| new Class<?>[] {ServletContext.class, API.class}, |
| new Handler(plugin, contextPath)); |
| } |
| |
| private PluginServletContext() {} |
| |
| private static class Handler implements InvocationHandler, API { |
| private final Plugin plugin; |
| private final String contextPath; |
| private final ConcurrentMap<String, Object> attributes; |
| |
| Handler(Plugin plugin, String contextPath) { |
| this.plugin = plugin; |
| this.contextPath = contextPath; |
| this.attributes = Maps.newConcurrentMap(); |
| } |
| |
| @Override |
| public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { |
| Method handler; |
| try { |
| handler = API.class.getDeclaredMethod(method.getName(), method.getParameterTypes()); |
| } catch (NoSuchMethodException e) { |
| throw new NoSuchMethodError( |
| String.format( |
| "%s does not implement %s", |
| PluginServletContext.class, method.toGenericString())) |
| .initCause(e); |
| } |
| return handler.invoke(this, args); |
| } |
| |
| @Override |
| public String getContextPath() { |
| return contextPath; |
| } |
| |
| @Override |
| public String getInitParameter(String name) { |
| return null; |
| } |
| |
| @SuppressWarnings("rawtypes") |
| @Override |
| public Enumeration getInitParameterNames() { |
| return Collections.enumeration(Collections.emptyList()); |
| } |
| |
| @Override |
| public ServletContext getContext(String name) { |
| return null; |
| } |
| |
| @Override |
| public RequestDispatcher getNamedDispatcher(String name) { |
| return null; |
| } |
| |
| @Override |
| public RequestDispatcher getRequestDispatcher(String name) { |
| return null; |
| } |
| |
| @Override |
| public URL getResource(String name) { |
| return null; |
| } |
| |
| @Override |
| public InputStream getResourceAsStream(String name) { |
| return null; |
| } |
| |
| @SuppressWarnings("rawtypes") |
| @Override |
| public Set getResourcePaths(String name) { |
| return null; |
| } |
| |
| @Override |
| public Servlet getServlet(String name) { |
| return null; |
| } |
| |
| @Override |
| public String getRealPath(String name) { |
| return null; |
| } |
| |
| @Override |
| public String getServletContextName() { |
| return plugin.getName(); |
| } |
| |
| @SuppressWarnings("rawtypes") |
| @Override |
| public Enumeration getServletNames() { |
| return Collections.enumeration(Collections.emptyList()); |
| } |
| |
| @SuppressWarnings("rawtypes") |
| @Override |
| public Enumeration getServlets() { |
| return Collections.enumeration(Collections.emptyList()); |
| } |
| |
| @Override |
| public void log(Exception reason, String msg) { |
| log(msg, reason); |
| } |
| |
| @Override |
| public void log(String msg) { |
| log(msg, null); |
| } |
| |
| @Override |
| public void log(String msg, Throwable reason) { |
| logger.atWarning().withCause(reason).log("[plugin %s] %s", plugin.getName(), msg); |
| } |
| |
| @Override |
| public Object getAttribute(String name) { |
| return attributes.get(name); |
| } |
| |
| @Override |
| public Enumeration<String> getAttributeNames() { |
| return Collections.enumeration(attributes.keySet()); |
| } |
| |
| @Override |
| public void setAttribute(String name, Object value) { |
| attributes.put(name, value); |
| } |
| |
| @Override |
| public void removeAttribute(String name) { |
| attributes.remove(name); |
| } |
| |
| @Override |
| public String getMimeType(String file) { |
| return null; |
| } |
| |
| @Override |
| public int getMajorVersion() { |
| return 2; |
| } |
| |
| @Override |
| public int getMinorVersion() { |
| return 5; |
| } |
| |
| @Override |
| public String getServerInfo() { |
| String v = Version.getVersion(); |
| return "Gerrit Code Review/" + (v != null ? v : "dev"); |
| } |
| |
| @Override |
| public String getVirtualServerName() { |
| return null; |
| } |
| } |
| |
| interface API { |
| String getContextPath(); |
| |
| String getInitParameter(String name); |
| |
| @SuppressWarnings("rawtypes") |
| Enumeration getInitParameterNames(); |
| |
| ServletContext getContext(String name); |
| |
| RequestDispatcher getNamedDispatcher(String name); |
| |
| RequestDispatcher getRequestDispatcher(String name); |
| |
| URL getResource(String name); |
| |
| InputStream getResourceAsStream(String name); |
| |
| @SuppressWarnings("rawtypes") |
| Set getResourcePaths(String name); |
| |
| Servlet getServlet(String name); |
| |
| String getRealPath(String name); |
| |
| String getServletContextName(); |
| |
| @SuppressWarnings("rawtypes") |
| Enumeration getServletNames(); |
| |
| @SuppressWarnings("rawtypes") |
| Enumeration getServlets(); |
| |
| void log(Exception reason, String msg); |
| |
| void log(String msg); |
| |
| void log(String msg, Throwable reason); |
| |
| Object getAttribute(String name); |
| |
| Enumeration<String> getAttributeNames(); |
| |
| void setAttribute(String name, Object value); |
| |
| void removeAttribute(String name); |
| |
| String getMimeType(String file); |
| |
| int getMajorVersion(); |
| |
| int getMinorVersion(); |
| |
| String getServerInfo(); |
| |
| String getVirtualServerName(); |
| } |
| } |