From abe5d090bbbd359b579cdf19dd52cf98b150d0d1 Mon Sep 17 00:00:00 2001 From: Matt Gilman Date: Mon, 14 Dec 2015 15:03:31 -0500 Subject: [PATCH] [447816] - ServletHolder#compareTo not transitive Updating compareTo to properly order when one _className is null and the other is not. Signed-off-by: Matt Gilman --- .../eclipse/jetty/servlet/ServletHolder.java | 18 +++++- .../jetty/servlet/ServletHolderTest.java | 55 +++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletHolderTest.java diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java index 1ae25d8a668..1180bfa19b3 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java @@ -208,15 +208,29 @@ public class ServletHolder extends Holder implements UserIdentity.Scope { if (sh==this) return 0; + if (sh._initOrder<_initOrder) return 1; + if (sh._initOrder>_initOrder) return -1; - int c=(_className!=null && sh._className!=null)?_className.compareTo(sh._className):0; + // consider _className, need to position properly when one is configured but not the other + int c; + if (_className==null && sh._className==null) + c=0; + else if (_className==null) + c=-1; + else if (sh._className==null) + c=1; + else + c=_className.compareTo(sh._className); + + // if _initOrder and _className are the same, consider the _name if (c==0) c=_name.compareTo(sh._name); - return c; + + return c; } /* ------------------------------------------------------------ */ diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletHolderTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletHolderTest.java new file mode 100644 index 00000000000..7ec8c172779 --- /dev/null +++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletHolderTest.java @@ -0,0 +1,55 @@ +// +// ======================================================================== +// 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.servlet; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; + +public class ServletHolderTest { + + @Test + public void testTransitiveCompareTo() throws Exception + { + // example of jsp-file referenced in web.xml + final ServletHolder one = new ServletHolder(); + one.setInitOrder(-1); + one.setName("Login"); + one.setClassName(null); + + // example of pre-compiled jsp + final ServletHolder two = new ServletHolder(); + two.setInitOrder(-1); + two.setName("org.my.package.jsp.WEB_002dINF.pages.precompiled_002dpage_jsp"); + two.setClassName("org.my.package.jsp.WEB_002dINF.pages.precompiled_002dpage_jsp"); + + // example of servlet referenced in web.xml + final ServletHolder three = new ServletHolder(); + three.setInitOrder(-1); + three.setName("Download"); + three.setClassName("org.my.package.web.DownloadServlet"); + + // verify compareTo transitivity + Assert.assertTrue(one.compareTo(two) < 0); + Assert.assertTrue(two.compareTo(three) < 0); + Assert.assertTrue(one.compareTo(three) < 0); + } +}