From 481102db3043215a35407b72c327eafb0b9aea10 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Tue, 1 Dec 2015 15:53:46 -0700 Subject: [PATCH] 483413 - Warn on @Deprecated servlet/filter use --- .../jetty/servlet/ServletContextHandler.java | 6 +- .../jetty/util/DeprecationWarning.java | 86 +++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 jetty-util/src/main/java/org/eclipse/jetty/util/DeprecationWarning.java diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java index f79803c8035..d8b6c0bc635 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java @@ -62,6 +62,7 @@ import org.eclipse.jetty.server.handler.gzip.GzipHandler; import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.servlet.BaseHolder.Source; import org.eclipse.jetty.util.DecoratedObjectFactory; +import org.eclipse.jetty.util.DeprecationWarning; import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.component.LifeCycle; @@ -90,7 +91,7 @@ public class ServletContextHandler extends ContextHandler public interface ServletContainerInitializerCaller extends LifeCycle {}; - protected final DecoratedObjectFactory _objFactory = new DecoratedObjectFactory(); + protected final DecoratedObjectFactory _objFactory; protected Class _defaultSecurityHandlerClass=org.eclipse.jetty.security.ConstraintSecurityHandler.class; protected SessionHandler _sessionHandler; protected SecurityHandler _securityHandler; @@ -150,6 +151,9 @@ public class ServletContextHandler extends ContextHandler _sessionHandler = sessionHandler; _securityHandler = securityHandler; _servletHandler = servletHandler; + + _objFactory = new DecoratedObjectFactory(); + _objFactory.addDecorator(new DeprecationWarning()); if (contextPath!=null) setContextPath(contextPath); diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/DeprecationWarning.java b/jetty-util/src/main/java/org/eclipse/jetty/util/DeprecationWarning.java new file mode 100644 index 00000000000..a41684aea41 --- /dev/null +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/DeprecationWarning.java @@ -0,0 +1,86 @@ +// +// ======================================================================== +// Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.util; + +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; + +public class DeprecationWarning implements Decorator +{ + private static final Logger LOG = Log.getLogger(DeprecationWarning.class); + + @Override + public T decorate(T o) + { + if (o == null) + { + return null; + } + + Class clazz = o.getClass(); + + try + { + Deprecated depr = clazz.getAnnotation(Deprecated.class); + if (depr != null) + { + LOG.warn("Using @Deprecated Class {}",clazz.getName()); + } + } + catch (Throwable t) + { + LOG.ignore(t); + } + + verifyIndirectTypes(clazz.getSuperclass(),clazz,"Class"); + for (Class ifaceClazz : clazz.getInterfaces()) + { + verifyIndirectTypes(ifaceClazz,clazz,"Interface"); + } + + return o; + } + + private void verifyIndirectTypes(Class superClazz, Class clazz, String typeName) + { + try + { + // Report on super class deprecation too + while (superClazz != null && superClazz != Object.class) + { + Deprecated supDepr = clazz.getAnnotation(Deprecated.class); + if (supDepr != null) + { + LOG.warn("Using indirect @Deprecated {} {} - (seen from {})",typeName,superClazz.getName(),clazz); + } + + superClazz = superClazz.getSuperclass(); + } + } + catch (Throwable t) + { + LOG.ignore(t); + } + } + + @Override + public void destroy(Object o) + { + } +}