Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2011-07-07 08:18:24 +0000
committerGreg Wilkins2011-07-07 08:18:24 +0000
commit17e907c2fbd6a4537ac1b609165115bc40efaa67 (patch)
tree6c1c84cc2a3c92c4318b9741e0b59157712ec61d
parent54e885d9670548c12cf9ffbd58702b73d373c186 (diff)
downloadorg.eclipse.jetty.project-17e907c2fbd6a4537ac1b609165115bc40efaa67.tar.gz
org.eclipse.jetty.project-17e907c2fbd6a4537ac1b609165115bc40efaa67.tar.xz
org.eclipse.jetty.project-17e907c2fbd6a4537ac1b609165115bc40efaa67.zip
git diff 54e885d9670548c12cf9ffbd58702b73d373c186 remotes/origin/jetty-8-historical | patch -p1 ; git add -A
-rw-r--r--VERSION.txt43
-rw-r--r--example-async-rest/async-rest-jar/pom.xml24
-rw-r--r--example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/AbstractRestServlet.java116
-rw-r--r--example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/AsyncRestServlet.java207
-rw-r--r--example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/SerialRestServlet.java102
-rw-r--r--example-async-rest/async-rest-jar/src/main/resources/META-INF/resources/asyncrest.html38
-rw-r--r--example-async-rest/async-rest-jar/src/main/resources/META-INF/web-fragment.xml22
-rw-r--r--example-async-rest/async-rest-webapp/pom.xml33
-rw-r--r--example-async-rest/async-rest-webapp/src/main/webapp/META-INF/MANIFEST.MF3
-rw-r--r--example-async-rest/async-rest-webapp/src/main/webapp/WEB-INF/web.xml9
-rw-r--r--example-async-rest/async-rest-webapp/src/main/webapp/index.html38
-rw-r--r--example-async-rest/async-rest-webapp/src/test/java/org/eclipse/jetty/example/asyncrest/DemoServer.java30
-rw-r--r--example-async-rest/pom.xml16
-rw-r--r--example-jetty-embedded/pom.xml4
-rw-r--r--example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java2
-rw-r--r--example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/ManyContexts.java1
-rw-r--r--jetty-aggregate/jetty-all-server/pom.xml14
-rw-r--r--jetty-aggregate/jetty-all/pom.xml29
-rw-r--r--jetty-aggregate/jetty-client/pom.xml2
-rw-r--r--jetty-aggregate/jetty-plus/pom.xml13
-rw-r--r--jetty-aggregate/jetty-server/pom.xml15
-rw-r--r--jetty-aggregate/jetty-servlet/pom.xml15
-rw-r--r--jetty-aggregate/jetty-webapp/pom.xml22
-rw-r--r--jetty-aggregate/pom.xml2
-rw-r--r--jetty-ajp/pom.xml2
-rw-r--r--jetty-ajp/src/main/java/org/eclipse/jetty/ajp/Ajp13SocketConnector.java8
-rw-r--r--jetty-annotations/pom.xml4
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationConfiguration.java353
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationDecorator.java1
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationParser.java5
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerAnnotationHandler.java67
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerConfiguration.java118
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/MultiPartConfigAnnotationHandler.java90
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletSecurityAnnotationHandler.java291
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/Util.java3
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotation.java210
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotationHandler.java55
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotation.java83
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotationHandler.java50
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotation.java169
-rw-r--r--jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotationHandler.java66
-rw-r--r--jetty-annotations/src/test/java/org/eclipse/jetty/annotations/FilterC.java4
-rw-r--r--jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ListenerC.java2
-rw-r--r--jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ServletC.java9
-rw-r--r--jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestAnnotationConfiguration.java53
-rw-r--r--jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestAnnotationInheritance.java47
-rw-r--r--jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestSecurityAnnotationConversions.java328
-rw-r--r--jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestServletAnnotations.java53
-rw-r--r--jetty-client/pom.xml2
-rw-r--r--jetty-client/src/test/java/org/eclipse/jetty/client/TimeoutExchangeTest.java2
-rw-r--r--jetty-continuation/pom.xml12
-rw-r--r--jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationSupport.java8
-rw-r--r--jetty-continuation/src/main/java/org/eclipse/jetty/continuation/FauxContinuation.java2
-rw-r--r--jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Servlet3Continuation.java1
-rw-r--r--jetty-deploy/pom.xml2
-rw-r--r--jetty-deploy/src/main/config/etc/jetty-deploy.xml2
-rw-r--r--jetty-distribution/pom.xml65
-rw-r--r--jetty-http/pom.xml2
-rw-r--r--jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java46
-rw-r--r--jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java6
-rw-r--r--jetty-io/pom.xml2
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/AbstractBuffer.java40
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayBuffer.java3
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java3
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedIOException.java43
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedPrintWriter.java2
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/bio/StreamEndPoint.java3
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/nio/ChannelEndPoint.java6
-rw-r--r--jetty-io/src/main/java/org/eclipse/jetty/io/nio/IndirectNIOBuffer.java6
-rw-r--r--jetty-jaspi/pom.xml16
-rw-r--r--jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/SimpleAuthConfig.java2
-rw-r--r--jetty-jmx/pom.xml2
-rw-r--r--jetty-jndi/pom.xml2
-rw-r--r--jetty-jsp-2.1/pom.xml87
-rw-r--r--jetty-jsp-2.1/src/main/java/org/eclipse/jetty/jsp/JettyLog.java102
-rw-r--r--jetty-nested/pom.xml2
-rw-r--r--jetty-nested/src/main/java/org/eclipse/jetty/nested/NestedConnection.java6
-rw-r--r--jetty-osgi/jetty-osgi-boot-jsp/META-INF/MANIFEST.MF36
-rw-r--r--jetty-osgi/jetty-osgi-boot-jsp/pom.xml34
-rw-r--r--jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/WebappRegistrationCustomizerImpl.java1
-rw-r--r--jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java1
-rw-r--r--jetty-osgi/jetty-osgi-boot-logback/META-INF/MANIFEST.MF20
-rw-r--r--jetty-osgi/jetty-osgi-boot-logback/META-INF/readme.txt12
-rw-r--r--jetty-osgi/jetty-osgi-boot-logback/build.properties5
-rw-r--r--jetty-osgi/jetty-osgi-boot-logback/pom.xml109
-rw-r--r--jetty-osgi/jetty-osgi-boot-logback/src/main/java/org/eclipse/jetty/osgi/boot/logback/FragmentActivator.java86
-rw-r--r--jetty-osgi/jetty-osgi-boot-logback/src/main/java/org/eclipse/jetty/osgi/boot/logback/internal/LogbackInitializer.java98
-rw-r--r--jetty-osgi/jetty-osgi-boot-warurl/META-INF/MANIFEST.MF4
-rw-r--r--jetty-osgi/jetty-osgi-boot-warurl/pom.xml4
-rw-r--r--jetty-osgi/jetty-osgi-boot-warurl/pom.xml.tycho14
-rw-r--r--jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF57
-rw-r--r--jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-osgi-default.xml1
-rw-r--r--jetty-osgi/jetty-osgi-boot/pom.xml69
-rw-r--r--jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java197
-rw-r--r--jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationParser.java192
-rw-r--r--jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiAppProvider.java40
-rw-r--r--jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java8
-rw-r--r--jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleTrackerCustomizer.java14
-rw-r--r--jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultFileLocatorHelper.java2
-rw-r--r--jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java1
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/META-INF/MANIFEST.MF22
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/build.properties5
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/equinoxconsole/index.html85
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/equinoxconsole/ws/index.html109
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/pom.xml96
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/WebEquinoxToolsActivator.java127
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxChattingSupport.java150
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleContinuationServlet.java246
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleSyncServlet.java76
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleWebSocketServlet.java168
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/WebConsoleSession.java183
-rw-r--r--jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/WebConsoleWriterOutputStream.java87
-rw-r--r--jetty-osgi/jetty-osgi-httpservice/META-INF/MANIFEST.MF13
-rw-r--r--jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml4
-rw-r--r--jetty-osgi/jetty-osgi-httpservice/pom.xml8
-rw-r--r--jetty-osgi/jetty-osgi-httpservice/pom.xml.tycho12
-rw-r--r--jetty-osgi/jetty-osgi-servletbridge/pom.xml40
-rw-r--r--jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/nested/Dump.java1140
-rw-r--r--jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/osgi/servletbridge/FrameworkLauncherExtended.java606
-rw-r--r--jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/osgi/servletbridge/hook/ServletBridgeClassLoaderDelegateHook.java106
-rw-r--r--jetty-osgi/jetty-osgi-servletbridge/src/main/webapp/WEB-INF/web.xml61
-rw-r--r--jetty-osgi/pom.xml29
-rw-r--r--jetty-osgi/test-jetty-osgi/pom.xml25
-rw-r--r--jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/boot/TestJettyOSGiBootWithJsp.java8
-rw-r--r--jetty-overlay-deployer/pom.xml2
-rw-r--r--jetty-plus/pom.xml4
-rw-r--r--jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/ContainerInitializer.java108
-rw-r--r--jetty-plus/src/test/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessorTest.java171
-rw-r--r--jetty-plus/src/test/resources/web-fragment-1.xml27
-rw-r--r--jetty-plus/src/test/resources/web-fragment-2.xml27
-rw-r--r--jetty-plus/src/test/resources/web-fragment-3.xml27
-rw-r--r--jetty-plus/src/test/resources/web.xml23
-rw-r--r--jetty-policy/pom.xml2
-rw-r--r--jetty-rewrite/pom.xml10
-rw-r--r--jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/HeaderPatternRuleTest.java8
-rw-r--r--jetty-security/pom.xml4
-rw-r--r--jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintMapping.java16
-rw-r--r--jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DeferredAuthentication.java31
-rw-r--r--jetty-server/pom.xml13
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContext.java43
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContinuation.java242
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java19
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/DispatcherType.java11
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java14
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java1
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/Request.java90
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/Response.java22
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/Server.java3
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/ServletRequestHttpWrapper.java45
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/ServletResponseHttpWrapper.java33
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/SessionManager.java74
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java306
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java2
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java266
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java1
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionManager.java2
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java9
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/AsyncContextTest.java413
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java33
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java6
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java16
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionHandlerTest.java260
-rw-r--r--jetty-servlet/pom.xml2
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterHolder.java16
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterMapping.java4
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Holder.java38
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletContextHandler.java299
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java65
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHolder.java64
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/FilterRegistration.java27
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/Registration.java25
-rw-r--r--jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/ServletRegistration.java21
-rw-r--r--jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DefaultServletTest.java7
-rw-r--r--jetty-servlet/src/test/java/org/eclipse/jetty/servlet/HolderTest.java77
-rw-r--r--jetty-servlets/pom.xml12
-rw-r--r--jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java21
-rw-r--r--jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java285
-rw-r--r--jetty-servlets/src/main/java/org/eclipse/jetty/servlets/ProxyServlet.java2
-rw-r--r--jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AbstractDoSFilterTest.java9
-rw-r--r--jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AsyncProxyServer.java6
-rw-r--r--jetty-servlets/src/test/java/org/eclipse/jetty/servlets/CloseableDoSFilterTest.java1
-rw-r--r--jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DoSFilterTest.java3
-rw-r--r--jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java9
-rw-r--r--jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java4
-rw-r--r--jetty-servlets/src/test/java/org/eclipse/jetty/servlets/QoSFilterTest.java7
-rw-r--r--jetty-start/pom.xml2
-rw-r--r--jetty-start/src/main/resources/org/eclipse/jetty/start/start.config7
-rw-r--r--jetty-util/pom.xml12
-rw-r--r--jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java2
-rw-r--r--jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStream.java628
-rw-r--r--jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartInputStreamTest.java187
-rw-r--r--jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java14
-rw-r--r--jetty-util/src/test/java/org/eclipse/jetty/util/thread/TimeoutTest.java5
-rw-r--r--jetty-webapp/pom.xml2
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/JettyWebXmlConfiguration.java11
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaData.java9
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java11
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Ordering.java11
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/StandardDescriptorProcessor.java422
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java1
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java5
-rw-r--r--jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java18
-rw-r--r--jetty-websocket/pom.xml8
-rw-r--r--jetty-websocket/src/test/java/org/eclipse/jetty/websocket/WebSocketParserD06Test.java3
-rw-r--r--jetty-xml/pom.xml2
-rw-r--r--pom.xml35
-rw-r--r--test-continuation-jetty6/pom.xml26
-rw-r--r--test-continuation-jetty6/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java423
-rw-r--r--test-continuation-jetty6/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java78
-rw-r--r--test-continuation/pom.xml2
-rw-r--r--test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java2
-rw-r--r--test-continuation/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java5
-rw-r--r--test-jetty-nested/pom.xml2
-rw-r--r--test-jetty-servlet/pom.xml2
-rw-r--r--test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/HttpTester.java2
-rw-r--r--test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/ServletTester.java7
-rw-r--r--test-jetty-webapp/pom.xml12
-rw-r--r--test-jetty-webapp/src/main/java/com/acme/Dump.java12
-rw-r--r--test-jetty-webapp/src/main/webapp/WEB-INF/web.xml13
-rw-r--r--test-jetty-webapp/src/main/webapp/index.html4
-rw-r--r--tests/pom.xml2
-rw-r--r--tests/test-integration/pom.xml2
-rw-r--r--tests/test-loginservice/pom.xml2
-rw-r--r--tests/test-sessions/pom.xml2
-rw-r--r--tests/test-sessions/test-hash-sessions/pom.xml2
-rw-r--r--tests/test-sessions/test-jdbc-sessions/pom.xml2
-rw-r--r--tests/test-sessions/test-sessions-common/pom.xml2
-rw-r--r--tests/test-webapps/pom.xml2
-rw-r--r--tests/test-webapps/test-webapp-rfc2616/pom.xml13
229 files changed, 7904 insertions, 5257 deletions
diff --git a/VERSION.txt b/VERSION.txt
index 42553deafa..402907dfb2 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1,3 +1,10 @@
+jetty-8.0.0.M3
+ + 324505 Implement API login
+ + 335500 request.getParts() throws a NullPointerException
+ + 343472 isUserInRole does not prevent subsequent login call.
+ + 346180 jsp-2.2 support
+ + Updated to jetty-7.4.2.v20110526
+
jetty-7.4.2.v20110526
+ 334443 Improve the ability to specify extra class paths using the Jetty Maven Plugin
+ 336220 tmp directory is not set if you reload a webapp with jetty-maven-plugin
@@ -95,6 +102,20 @@ jetty-7.4.0.RC0
+ Ensure generated fragment names are unique
+ Added extra session removal test
+jetty-8.0.0.M2 16 November 2010
+ + 320073 Reconsile configuration mechanism
+ + 321068 JSF2 fails to initialize
+ + 324493 Registration init parameter handling null check, setInitParameters additive
+ + 324505 Request.login method must throw ServletException if it cant login
+ + 324872 allow disabling listener restriction from using *Registration interfaces
+ + 327416 Change meaning of @HandlesTypes in line with latest interpretation by JSR315
+ + 327489 Change meaning of @MultipartConfig to match servlet spec 3.0 maintenance release 3.0a
+ + 328008 Handle update to Servlet Spec 3 Section 8.2.3.h.ii
+ + 330188 Reject web-fragment.xml with same <name> as another already loaded one
+ + 330208 Support new wording on servlet-mapping and filter-mapping merging from servlet3.0a
+ + 330292 request.getParts() returns only one part when the name is the same
+ + Update to jetty-7.2.1.v20101111
+
jetty-7.3.1.v20110307 7 March 2011
+ 316382 Support a more strict SSL option with certificates
+ 333481 Handle UCS-4 codepoints in decode and encode
@@ -118,9 +139,7 @@ jetty-7.3.1.v20110307 7 March 2011
+ 338068 Leaking ConstraintMappings on redeploy
+ 338092 ProxyServlet leaks memory
+ 338607 Removed managed attributes when context is stopped
- + 338880 Fixed failing buffer range checks
- + 338920 Handle non existent real path directories
- + 338961 AJP packet size
+ + 338819 Externally control Deployment Manager application lifecycle
+ JETTY-1304 Allow quoted boundaries in Multipart filter
+ JETTY-1317 More elegent handling of bad URIs in requests
+ JETTY-1331 Allow alternate XML configuration processors (eg spring)
@@ -291,7 +310,6 @@ jetty-7.2.0.RC0 1 October 2010
+ JETTY-1245 Do not use direct buffers with NIO SSL
+ JETTY-1249 Apply max idle time to all connectors
+ JETTY-1250 Parallel start of HandlerCollection
- + JETTY-1252 Handle more multipart transfer encodings
+ JETTY-1256 annotation and jta jars from Orbit
+ JETTY-1259 NullPointerException in JDBCSessionIdManager when invalidating session
+ JETTY-1261 errant listener usage in StandardDescriptorProcessor
@@ -317,6 +335,13 @@ jetty-7.1.6.v20100715
+ JETTY-1249 Apply max idle time to all connectors
+ JETTY-1251 Replace then close selector for JVM bugs
+jetty-8.0.0.M1 12 July 2010
+ + 306350 Ensure jars excluded by ordering are not scanned for annotations
+ + JETTY-1224 Change jetty-8 merge rules for fragment descriptors and annotations
+ + Ensure <absolute-ordering> in web.xml overrides relative <ordering> in fragments
+ + Ensure empty <absolute-ordering> implies exclusion of all fragments
+ + Ensure servlet-api jar class inheritance hierarchy is scanned
+
jetty-7.1.5.v20100705
+ Update ecj to 3.6 Helios release drop
+ 288194 Add blacklist/whitelist to ProxyServlet and ProxyHandler
@@ -473,6 +498,9 @@ jetty-7.1.0.RC0 27 April 2010
+ Fix jetty-plus.xml reference to addLifeCycle
+ JETTY-1200 SSL NIO Endpoint wraps non NIO buffers
+ JETTY-1202 Use platform default algorithm for SecureRandom
+ + Merged 7.0.2.v20100331
+ + Add NPE protection to ContainerInitializerConfiguration
+ + Temporarily remove jetty-osgi module to clarify jsp version compatibility
+ JETTY-1212 handle long content lengths
+ JETTY-1214 avoid ISE when scavenging invalid session
+ JETTY-903 Stop both caches
@@ -611,6 +639,13 @@ jetty-7.0.2.RC0
+ 305997 Coalesce buffers in ChannelEndPoint.flush()
+ 306028 Enable TCP_NODELAY by default in client connectors
+
+jetty-8.0.0.M0 28 February 2010
+ + Updated servlet 3.0 spec 20100224
+ + Merged 7.0.1.v20091116
+ + Updated to cometd 1.0.1
+
+
jetty-7.0.1.v20091125 25 November 2009
+ 274251 DefaultServlet supports exact match mode.
+ 288401 HttpExchange.cancel() Method Unimplemented
diff --git a/example-async-rest/async-rest-jar/pom.xml b/example-async-rest/async-rest-jar/pom.xml
new file mode 100644
index 0000000000..67eb042e49
--- /dev/null
+++ b/example-async-rest/async-rest-jar/pom.xml
@@ -0,0 +1,24 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>example-async-rest</artifactId>
+ <version>8.0.0.RC0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.eclipse.jetty.example-async-rest</groupId>
+ <artifactId>example-async-rest-jar</artifactId>
+ <packaging>jar</packaging>
+ <name>Example Async Rest :: Jar</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-client</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/AbstractRestServlet.java b/example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/AbstractRestServlet.java
new file mode 100644
index 0000000000..c71f80067a
--- /dev/null
+++ b/example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/AbstractRestServlet.java
@@ -0,0 +1,116 @@
+//========================================================================
+//Copyright 2004-2008 Mort Bay Consulting Pty. Ltd.
+//------------------------------------------------------------------------
+//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 org.eclipse.jetty.example.asyncrest;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URLEncoder;
+import java.util.Map;
+import java.util.Queue;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Abstract Servlet implementation class AsyncRESTServlet.
+ * Enquires ebay REST service for auctions by key word.
+ * May be configured with init parameters: <dl>
+ * <dt>appid</dt><dd>The eBay application ID to use</dd>
+ * </dl>
+ * Each request examines the following request parameters:<dl>
+ * <dt>items</dt><dd>The keyword to search for</dd>
+ * </dl>
+ */
+public class AbstractRestServlet extends HttpServlet
+{
+ protected final static String __DEFAULT_APPID = "Webtide81-adf4-4f0a-ad58-d91e41bbe85";
+ protected final static String STYLE =
+ "<style type='text/css'>"+
+ " img.thumb:hover {height:50px}"+
+ " img.thumb {vertical-align:text-top}"+
+ " span.red {color: #ff0000}"+
+ " span.green {color: #00ff00}"+
+ " iframe {border: 0px}"+
+ "</style>";
+
+ protected final static String ITEMS_PARAM = "items";
+ protected final static String APPID_PARAM = "appid";
+
+ protected String _appid;
+
+ public void init(ServletConfig servletConfig) throws ServletException
+ {
+ if (servletConfig.getInitParameter(APPID_PARAM) == null)
+ _appid = __DEFAULT_APPID;
+ else
+ _appid = servletConfig.getInitParameter(APPID_PARAM);
+ }
+
+ protected String restURL(String item)
+ {
+ try
+ {
+ return ("http://open.api.ebay.com/shopping?MaxEntries=3&appid=" + _appid +
+ "&version=573&siteid=0&callname=FindItems&responseencoding=JSON&QueryKeywords=" +
+ URLEncoder.encode(item,"UTF-8"));
+ }
+ catch(Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected String generateThumbs(Queue<Map<String,String>> results)
+ {
+ StringBuilder thumbs = new StringBuilder();
+ for (Map<String, String> m : results)
+ {
+ if (!m.containsKey("GalleryURL"))
+ continue;
+
+ thumbs.append("<a href=\""+m.get("ViewItemURLForNaturalSearch")+"\">");
+ thumbs.append("<img class='thumb' border='1px' height='25px'"+
+ " src='"+m.get("GalleryURL")+"'"+
+ " title='"+m.get("Title")+"'"+
+ "/>");
+ thumbs.append("</a>&nbsp;");
+ }
+ return thumbs.toString();
+ }
+
+ protected String ms(long nano)
+ {
+ BigDecimal dec = new BigDecimal(nano);
+ return dec.divide(new BigDecimal(1000000L)).setScale(1,RoundingMode.UP).toString();
+ }
+
+ protected int width(long nano)
+ {
+ int w=(int)((nano+999999L)/5000000L);
+ if (w==0)
+ w=2;
+ return w;
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doGet(request, response);
+ }
+
+}
diff --git a/example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/AsyncRestServlet.java b/example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/AsyncRestServlet.java
new file mode 100644
index 0000000000..2380a08daa
--- /dev/null
+++ b/example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/AsyncRestServlet.java
@@ -0,0 +1,207 @@
+//========================================================================
+//Copyright 2004-2008 Mort Bay Consulting Pty. Ltd.
+//------------------------------------------------------------------------
+//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 org.eclipse.jetty.example.asyncrest;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.client.ContentExchange;
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.util.ajax.JSON;
+
+/**
+ * Servlet implementation class AsyncRESTServlet.
+ * Enquires ebay REST service for auctions by key word.
+ * May be configured with init parameters: <dl>
+ * <dt>appid</dt><dd>The eBay application ID to use</dd>
+ * </dl>
+ * Each request examines the following request parameters:<dl>
+ * <dt>items</dt><dd>The keyword to search for</dd>
+ * </dl>
+ */
+public class AsyncRestServlet extends AbstractRestServlet
+{
+ final static String RESULTS_ATTR = "org.eclipse.jetty.demo.client";
+ final static String DURATION_ATTR = "org.eclipse.jetty.demo.duration";
+ final static String START_ATTR = "org.eclispe.jetty.demo.start";
+
+ HttpClient _client;
+
+ public void init(ServletConfig servletConfig) throws ServletException
+ {
+ super.init(servletConfig);
+
+ _client = new HttpClient();
+ _client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
+
+ try
+ {
+ _client.start();
+ }
+ catch (Exception e)
+ {
+ throw new ServletException(e);
+ }
+ }
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ Long start=System.nanoTime();
+
+ // Do we have results yet?
+ Queue<Map<String, String>> results = (Queue<Map<String, String>>) request.getAttribute(RESULTS_ATTR);
+
+ // If no results, this must be the first dispatch, so send the REST request(s)
+ if (results==null)
+ {
+ // define results data structures
+ final Queue<Map<String, String>> resultsQueue = new ConcurrentLinkedQueue<Map<String,String>>();
+ request.setAttribute(RESULTS_ATTR, results=resultsQueue);
+
+ // suspend the request
+ // This is done before scheduling async handling to avoid race of
+ // dispatch before startAsync!
+ final AsyncContext async = request.startAsync();
+ async.setTimeout(30000);
+
+ // extract keywords to search for
+ String[] keywords=request.getParameter(ITEMS_PARAM).split(",");
+ final AtomicInteger outstanding=new AtomicInteger(keywords.length);
+
+ // Send request each keyword
+ for (final String item:keywords)
+ {
+ _client.send(
+ new AsyncRestRequest(item)
+ {
+ void onAuctionFound(Map<String,String> auction)
+ {
+ resultsQueue.add(auction);
+ }
+ void onComplete()
+ {
+ if (outstanding.decrementAndGet()<=0)
+ async.dispatch();
+ }
+ });
+ }
+
+ // save timing info and return
+ request.setAttribute(START_ATTR, start);
+ request.setAttribute(DURATION_ATTR, new Long(System.nanoTime() - start));
+
+ return;
+ }
+
+ // We have results!
+
+ // Generate the response
+ String thumbs = generateThumbs(results);
+
+ response.setContentType("text/html");
+ PrintWriter out = response.getWriter();
+ out.println("<html><head>");
+ out.println(STYLE);
+ out.println("</head><body><small>");
+
+ long initial = (Long) request.getAttribute(DURATION_ATTR);
+ long start0 = (Long) request.getAttribute(START_ATTR);
+
+ long now = System.nanoTime();
+ long total=now-start0;
+ long generate=now-start;
+ long thread=initial+generate;
+
+ out.print("<b>Asynchronous: "+request.getParameter(ITEMS_PARAM)+"</b><br/>");
+ out.print("Total Time: "+ms(total)+"ms<br/>");
+
+ out.print("Thread held (<span class='red'>red</span>): "+ms(thread)+"ms (" + ms(initial) + " initial + " + ms(generate) + " generate )<br/>");
+ out.print("Async wait (<span class='green'>green</span>): "+ms(total-thread)+"ms<br/>");
+
+ out.println("<img border='0px' src='asyncrest/red.png' height='20px' width='"+width(initial)+"px'>"+
+ "<img border='0px' src='asyncrest/green.png' height='20px' width='"+width(total-thread)+"px'>"+
+ "<img border='0px' src='asyncrest/red.png' height='20px' width='"+width(generate)+"px'>");
+
+ out.println("<hr />");
+ out.println(thumbs);
+ out.println("</small>");
+ out.println("</body></html>");
+ out.close();
+ }
+
+ private abstract class AsyncRestRequest extends ContentExchange
+ {
+ AsyncRestRequest(final String item)
+ {
+ // send the exchange
+ setMethod("GET");
+ setURL(restURL(item));
+ }
+
+ abstract void onAuctionFound(Map<String,String> details);
+ abstract void onComplete();
+
+ protected void onResponseComplete() throws IOException
+ {
+ // extract auctions from the results
+ Map<String,?> query = (Map<String,?>) JSON.parse(this.getResponseContent());
+ Object[] auctions = (Object[]) query.get("Item");
+ if (auctions != null)
+ {
+ for (Object o : auctions)
+ onAuctionFound((Map<String,String>)o);
+ }
+
+ onComplete();
+ }
+
+ /* ------------------------------------------------------------ */
+ protected void onConnectionFailed(Throwable ex)
+ {
+ getServletContext().log("onConnectionFailed: ",ex);
+ onComplete();
+ }
+
+ /* ------------------------------------------------------------ */
+ protected void onException(Throwable ex)
+ {
+ getServletContext().log("onConnectionFailed: ",ex);
+ onComplete();
+ }
+
+ /* ------------------------------------------------------------ */
+ protected void onExpire()
+ {
+ getServletContext().log("onConnectionFailed: expired");
+ onComplete();
+ }
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doGet(request, response);
+ }
+
+}
diff --git a/example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/SerialRestServlet.java b/example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/SerialRestServlet.java
new file mode 100644
index 0000000000..07e8158943
--- /dev/null
+++ b/example-async-rest/async-rest-jar/src/main/java/org/eclipse/jetty/example/asyncrest/SerialRestServlet.java
@@ -0,0 +1,102 @@
+//========================================================================
+//Copyright 2004-2008 Mort Bay Consulting Pty. Ltd.
+//------------------------------------------------------------------------
+//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 org.eclipse.jetty.example.asyncrest;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Queue;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.util.ajax.JSON;
+
+/**
+ * Servlet implementation class SerialRestServlet
+ */
+public class SerialRestServlet extends AbstractRestServlet
+{
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ long start = System.nanoTime();
+
+
+ String[] keywords=request.getParameter(ITEMS_PARAM).split(",");
+ Queue<Map<String,String>> results = new LinkedList<Map<String,String>>();
+
+ // make all requests serially
+ for (String itemName : keywords)
+ {
+ URL url = new URL(restURL(itemName));
+
+ HttpURLConnection connection = (HttpURLConnection)url.openConnection();
+ connection.setRequestMethod("GET");
+
+ Map query = (Map)JSON.parse(new BufferedReader(new InputStreamReader(connection.getInputStream())));
+ Object[] auctions = (Object[]) query.get("Item");
+ if (auctions != null)
+ {
+ for (Object o : auctions)
+ results.add((Map) o);
+ }
+ }
+
+
+ // Generate the response
+ String thumbs=generateThumbs(results);
+
+ response.setContentType("text/html");
+ PrintWriter out = response.getWriter();
+ out.println("<html><head>");
+ out.println(STYLE);
+ out.println("</head><body><small>");
+
+ long now = System.nanoTime();
+ long total=now-start;
+
+ out.print("<b>Blocking: "+request.getParameter(ITEMS_PARAM)+"</b><br/>");
+ out.print("Total Time: "+ms(total)+"ms<br/>");
+ out.print("Thread held (<span class='red'>red</span>): "+ms(total)+"ms<br/>");
+
+ out.println("<img border='0px' src='asyncrest/red.png' height='20px' width='"+width(total)+"px'>");
+
+ out.println("<hr />");
+ out.println(thumbs);
+ out.println("</small>");
+ out.println("</body></html>");
+ out.close();
+
+
+
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
+ * response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ doGet(request, response);
+ }
+
+}
diff --git a/example-async-rest/async-rest-jar/src/main/resources/META-INF/resources/asyncrest.html b/example-async-rest/async-rest-jar/src/main/resources/META-INF/resources/asyncrest.html
new file mode 100644
index 0000000000..f92f7f661d
--- /dev/null
+++ b/example-async-rest/async-rest-jar/src/main/resources/META-INF/resources/asyncrest.html
@@ -0,0 +1,38 @@
+<html>
+ <head>
+ <style type='text/css'>
+ iframe {border: 0px}
+ table, tr, td {border: 0px}
+ </style>
+</head>
+<body>
+<h1>Blocking vs Asynchronous REST</h1>
+<p>
+This demo calls the EBay WS API both synchronously and asynchronously,
+to obtain items matching each of the keywords passed on the query
+string. The time the request thread is head is displayed for both.
+</p>
+
+<table width='100%'>
+
+<tr>
+<td>
+ <iframe id="f1" width='100%' height='175px' src="testSerial?items=kayak"></iframe>
+</td>
+<td>
+ <iframe id="f3" width='100%' height='175px' src="testSerial?items=mouse,beer,gnome"></iframe>
+</td>
+</tr>
+
+<tr>
+<td>
+ <iframe id="f2" width='100%' height='175px' src="testAsync?items=kayak"/></iframe>
+</td>
+<td>
+ <iframe id="f4" width='100%' height='175px' src="testAsync?items=mouse,beer,gnome"/></iframe>
+</td>
+</tr>
+
+</table>
+</body>
+</html>
diff --git a/example-async-rest/async-rest-jar/src/main/resources/META-INF/web-fragment.xml b/example-async-rest/async-rest-jar/src/main/resources/META-INF/web-fragment.xml
new file mode 100644
index 0000000000..9876d9983b
--- /dev/null
+++ b/example-async-rest/async-rest-jar/src/main/resources/META-INF/web-fragment.xml
@@ -0,0 +1,22 @@
+<web-fragment>
+ <servlet>
+ <display-name>SerialRestServlet</display-name>
+ <servlet-name>SerialRestServlet</servlet-name>
+ <servlet-class>org.eclipse.jetty.example.asyncrest.SerialRestServlet</servlet-class>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>SerialRestServlet</servlet-name>
+ <url-pattern>/testSerial</url-pattern>
+ </servlet-mapping>
+
+ <servlet>
+ <display-name>AsyncRestServlet</display-name>
+ <servlet-name>AsyncRestServlet</servlet-name>
+ <servlet-class>org.eclipse.jetty.example.asyncrest.AsyncRestServlet</servlet-class>
+ <async-supported>true</async-supported>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>AsyncRestServlet</servlet-name>
+ <url-pattern>/testAsync</url-pattern>
+ </servlet-mapping>
+</web-fragment> \ No newline at end of file
diff --git a/example-async-rest/async-rest-webapp/pom.xml b/example-async-rest/async-rest-webapp/pom.xml
new file mode 100644
index 0000000000..7e2e8544d9
--- /dev/null
+++ b/example-async-rest/async-rest-webapp/pom.xml
@@ -0,0 +1,33 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>example-async-rest</artifactId>
+ <version>8.0.0.RC0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.eclipse.jetty.example-async-rest</groupId>
+ <artifactId>example-async-rest-webapp</artifactId>
+ <packaging>war</packaging>
+ <name>Example Async Rest :: Webapp</name>
+ <build>
+ <finalName>async-rest</finalName>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.eclipse.jetty.example-async-rest</groupId>
+ <artifactId>example-async-rest-jar</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-webapp</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/example-async-rest/async-rest-webapp/src/main/webapp/META-INF/MANIFEST.MF b/example-async-rest/async-rest-webapp/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..5e9495128c
--- /dev/null
+++ b/example-async-rest/async-rest-webapp/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/example-async-rest/async-rest-webapp/src/main/webapp/WEB-INF/web.xml b/example-async-rest/async-rest-webapp/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..8916bdb6af
--- /dev/null
+++ b/example-async-rest/async-rest-webapp/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ version="3.0">
+
+ <display-name>Async REST Webservice Example</display-name>
+
+</web-app>
diff --git a/example-async-rest/async-rest-webapp/src/main/webapp/index.html b/example-async-rest/async-rest-webapp/src/main/webapp/index.html
new file mode 100644
index 0000000000..f92f7f661d
--- /dev/null
+++ b/example-async-rest/async-rest-webapp/src/main/webapp/index.html
@@ -0,0 +1,38 @@
+<html>
+ <head>
+ <style type='text/css'>
+ iframe {border: 0px}
+ table, tr, td {border: 0px}
+ </style>
+</head>
+<body>
+<h1>Blocking vs Asynchronous REST</h1>
+<p>
+This demo calls the EBay WS API both synchronously and asynchronously,
+to obtain items matching each of the keywords passed on the query
+string. The time the request thread is head is displayed for both.
+</p>
+
+<table width='100%'>
+
+<tr>
+<td>
+ <iframe id="f1" width='100%' height='175px' src="testSerial?items=kayak"></iframe>
+</td>
+<td>
+ <iframe id="f3" width='100%' height='175px' src="testSerial?items=mouse,beer,gnome"></iframe>
+</td>
+</tr>
+
+<tr>
+<td>
+ <iframe id="f2" width='100%' height='175px' src="testAsync?items=kayak"/></iframe>
+</td>
+<td>
+ <iframe id="f4" width='100%' height='175px' src="testAsync?items=mouse,beer,gnome"/></iframe>
+</td>
+</tr>
+
+</table>
+</body>
+</html>
diff --git a/example-async-rest/async-rest-webapp/src/test/java/org/eclipse/jetty/example/asyncrest/DemoServer.java b/example-async-rest/async-rest-webapp/src/test/java/org/eclipse/jetty/example/asyncrest/DemoServer.java
new file mode 100644
index 0000000000..c3b5e75175
--- /dev/null
+++ b/example-async-rest/async-rest-webapp/src/test/java/org/eclipse/jetty/example/asyncrest/DemoServer.java
@@ -0,0 +1,30 @@
+package org.eclipse.jetty.example.asyncrest;
+
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.nio.SelectChannelConnector;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+public class DemoServer
+{
+ public static void main(String[] args)
+ throws Exception
+ {
+ String jetty_home = System.getProperty("jetty.home",".");
+
+ Server server = new Server();
+
+ Connector connector=new SelectChannelConnector();
+ connector.setPort(Integer.getInteger("jetty.port",8080).intValue());
+ server.setConnectors(new Connector[]{connector});
+
+ WebAppContext webapp = new WebAppContext();
+ webapp.setContextPath("/");
+ webapp.setWar(jetty_home+"/target/example-async-rest-webapp-8.0.0.M0-SNAPSHOT");
+
+ server.setHandler(webapp);
+
+ server.start();
+ server.join();
+ }
+}
diff --git a/example-async-rest/pom.xml b/example-async-rest/pom.xml
new file mode 100644
index 0000000000..fedd20a370
--- /dev/null
+++ b/example-async-rest/pom.xml
@@ -0,0 +1,16 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-project</artifactId>
+ <version>8.0.0.RC0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>example-async-rest</artifactId>
+ <packaging>pom</packaging>
+ <name>Example Async Rest</name>
+ <modules>
+ <module>async-rest-jar</module>
+ <module>async-rest-webapp</module>
+ </modules>
+</project>
diff --git a/example-jetty-embedded/pom.xml b/example-jetty-embedded/pom.xml
index 588d52ff3d..edcbdf5a15 100644
--- a/example-jetty-embedded/pom.xml
+++ b/example-jetty-embedded/pom.xml
@@ -2,11 +2,11 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>example-jetty-embedded</artifactId>
- <name>Example :: Jetty Embedded</name>
+ <name>Example :: Embedded Jetty Examples</name>
<description>Jetty Embedded Examples</description>
<build>
<plugins>
diff --git a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
index a88a23f1ab..633d4026e9 100644
--- a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
+++ b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
@@ -123,7 +123,7 @@ public class LikeJettyXml
webapp_provider.setDefaultsDescriptor(jetty_home + "/etc/webdefault.xml");
webapp_provider.setContextXmlDir(jetty_home + "/contexts");
deployer.addAppProvider(webapp_provider);
-
+
HashLoginService login = new HashLoginService();
login.setName("Test Realm");
login.setConfig(jetty_home + "/etc/realm.properties");
diff --git a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/ManyContexts.java b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/ManyContexts.java
index 919b4f40a8..079ed2f154 100644
--- a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/ManyContexts.java
+++ b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/ManyContexts.java
@@ -69,5 +69,4 @@ public class ManyContexts
System.err.println(server.dump());
server.join();
}
-
}
diff --git a/jetty-aggregate/jetty-all-server/pom.xml b/jetty-aggregate/jetty-all-server/pom.xml
index e2b05ae534..317403379d 100644
--- a/jetty-aggregate/jetty-all-server/pom.xml
+++ b/jetty-aggregate/jetty-all-server/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-aggregate-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.aggregate</groupId>
@@ -136,9 +136,9 @@
<scope>provided</scope>
</dependency>
<dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <scope>compile</scope>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <version>${servlet.spec.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
@@ -148,12 +148,6 @@
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jsp-2.1</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-plus</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
diff --git a/jetty-aggregate/jetty-all/pom.xml b/jetty-aggregate/jetty-all/pom.xml
index 6bf6863267..2f8a6630a2 100644
--- a/jetty-aggregate/jetty-all/pom.xml
+++ b/jetty-aggregate/jetty-all/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-aggregate-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.aggregate</groupId>
@@ -92,12 +92,8 @@
<scope>provided</scope>
<exclusions>
<exclusion>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>servlet-api</artifactId>
- </exclusion>
- <exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
</exclusion>
</exclusions>
</dependency>
@@ -108,8 +104,8 @@
<scope>provided</scope>
</dependency>
<dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
@@ -120,19 +116,13 @@
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jsp-2.1</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-plus</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.geronimo.specs</groupId>
@@ -200,6 +190,11 @@
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <scope>compile</scope>
+ </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-nested</artifactId>
diff --git a/jetty-aggregate/jetty-client/pom.xml b/jetty-aggregate/jetty-client/pom.xml
index cdf4c541e8..4c83269261 100644
--- a/jetty-aggregate/jetty-client/pom.xml
+++ b/jetty-aggregate/jetty-client/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-aggregate-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.aggregate</groupId>
diff --git a/jetty-aggregate/jetty-plus/pom.xml b/jetty-aggregate/jetty-plus/pom.xml
index 3e87ba4fc1..833337cd8a 100644
--- a/jetty-aggregate/jetty-plus/pom.xml
+++ b/jetty-aggregate/jetty-plus/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-aggregate-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.aggregate</groupId>
@@ -86,8 +86,8 @@
<scope>provided</scope>
<exclusions>
<exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.geronimo.specs</groupId>
@@ -104,9 +104,10 @@
</exclusions>
</dependency>
<dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <scope>compile</scope>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <version>${servlet.spec.version}</version>
+ <scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
diff --git a/jetty-aggregate/jetty-server/pom.xml b/jetty-aggregate/jetty-server/pom.xml
index 99318dc405..551f6383e2 100644
--- a/jetty-aggregate/jetty-server/pom.xml
+++ b/jetty-aggregate/jetty-server/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-aggregate-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.aggregate</groupId>
@@ -86,21 +86,20 @@
<scope>provided</scope>
<exclusions>
<exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-websocket</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <scope>compile</scope>
- </dependency>
</dependencies>
</project>
diff --git a/jetty-aggregate/jetty-servlet/pom.xml b/jetty-aggregate/jetty-servlet/pom.xml
index 3eed34c5e9..e157f20080 100644
--- a/jetty-aggregate/jetty-servlet/pom.xml
+++ b/jetty-aggregate/jetty-servlet/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-aggregate-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.aggregate</groupId>
@@ -86,16 +86,15 @@
<scope>provided</scope>
<exclusions>
<exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
</exclusion>
</exclusions>
</dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <scope>compile</scope>
- </dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-websocket</artifactId>
diff --git a/jetty-aggregate/jetty-webapp/pom.xml b/jetty-aggregate/jetty-webapp/pom.xml
index a3d3dfc832..c63b5ac4eb 100644
--- a/jetty-aggregate/jetty-webapp/pom.xml
+++ b/jetty-aggregate/jetty-webapp/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-aggregate-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.aggregate</groupId>
@@ -86,21 +86,15 @@
<scope>provided</scope>
<exclusions>
<exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
</exclusion>
</exclusions>
</dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jsp-2.1</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <scope>compile</scope>
+ </dependency>
</dependencies>
</project>
diff --git a/jetty-aggregate/pom.xml b/jetty-aggregate/pom.xml
index cec84756b9..79b68468f9 100644
--- a/jetty-aggregate/pom.xml
+++ b/jetty-aggregate/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-aggregate-project</artifactId>
diff --git a/jetty-ajp/pom.xml b/jetty-ajp/pom.xml
index e5eb00912e..e501ee0e3a 100644
--- a/jetty-ajp/pom.xml
+++ b/jetty-ajp/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-ajp</artifactId>
diff --git a/jetty-ajp/src/main/java/org/eclipse/jetty/ajp/Ajp13SocketConnector.java b/jetty-ajp/src/main/java/org/eclipse/jetty/ajp/Ajp13SocketConnector.java
index 547ec34324..7a7dd9d62b 100644
--- a/jetty-ajp/src/main/java/org/eclipse/jetty/ajp/Ajp13SocketConnector.java
+++ b/jetty-ajp/src/main/java/org/eclipse/jetty/ajp/Ajp13SocketConnector.java
@@ -33,10 +33,10 @@ public class Ajp13SocketConnector extends SocketConnector
static boolean __allowShutdown = false;
public Ajp13SocketConnector()
{
- super.setRequestHeaderSize(Ajp13Packet.MAX_PACKET_SIZE);
- super.setResponseHeaderSize(Ajp13Packet.MAX_PACKET_SIZE);
- super.setRequestBufferSize(Ajp13Packet.MAX_PACKET_SIZE);
- super.setResponseBufferSize(Ajp13Packet.MAX_PACKET_SIZE);
+ super.setRequestHeaderSize(Ajp13Packet.MAX_DATA_SIZE);
+ super.setResponseHeaderSize(Ajp13Packet.MAX_DATA_SIZE);
+ super.setRequestBufferSize(Ajp13Packet.MAX_DATA_SIZE);
+ super.setResponseBufferSize(Ajp13Packet.MAX_DATA_SIZE);
// IN AJP protocol the socket stay open, so
// by default the time out is set to 0 seconds
super.setMaxIdleTime(0);
diff --git a/jetty-annotations/pom.xml b/jetty-annotations/pom.xml
index f531c7e6c8..f84789254b 100644
--- a/jetty-annotations/pom.xml
+++ b/jetty-annotations/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-annotations</artifactId>
@@ -25,7 +25,7 @@
</goals>
<configuration>
<instructions>
- <Import-Package>javax.servlet.*;version="[2.5,3.0)",*</Import-Package>
+ <Import-Package>javax.servlet.*;version="3.0",*</Import-Package>
</instructions>
</configuration>
</execution>
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationConfiguration.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationConfiguration.java
index bb04460c50..1ebf151e7e 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationConfiguration.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationConfiguration.java
@@ -13,8 +13,29 @@
package org.eclipse.jetty.annotations;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ServiceLoader;
+
+import javax.servlet.ServletContainerInitializer;
+import javax.servlet.ServletContext;
+import javax.servlet.annotation.HandlesTypes;
+
+
+import org.eclipse.jetty.annotations.AnnotationParser.DiscoverableAnnotationHandler;
+import org.eclipse.jetty.plus.annotation.ContainerInitializer;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.AbstractConfiguration;
+import org.eclipse.jetty.webapp.Descriptor;
+import org.eclipse.jetty.webapp.DiscoveredAnnotation;
+import org.eclipse.jetty.webapp.FragmentDescriptor;
+import org.eclipse.jetty.webapp.MetaDataComplete;
import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.webapp.WebDescriptor;
/**
* Configuration for Annotations
@@ -23,15 +44,343 @@ import org.eclipse.jetty.webapp.WebAppContext;
*/
public class AnnotationConfiguration extends AbstractConfiguration
{
+ public static final String CLASS_INHERITANCE_MAP = "org.eclipse.jetty.classInheritanceMap";
+
+ public void preConfigure(final WebAppContext context) throws Exception
+ {
+ }
+
@Override
public void configure(WebAppContext context) throws Exception
- {
+ {
+ boolean metadataComplete = context.getMetaData().isMetaDataComplete();
context.addDecorator(new AnnotationDecorator(context));
+
+ if (metadataComplete)
+ {
+ //Never scan any jars or classes for annotations if metadata is complete
+ if (Log.isDebugEnabled()) Log.debug("Metadata-complete==true, not processing annotations for context "+context);
+ return;
+ }
+ else
+ {
+ //Only scan jars and classes if metadata is not complete and the web app is version 3.0, or
+ //a 2.5 version webapp that has specifically asked to discover annotations
+ if (Log.isDebugEnabled()) Log.debug("parsing annotations");
+
+ AnnotationParser parser = createAnnotationParser();
+ //Discoverable annotations - those that you have to look for without loading a class
+ parser.registerAnnotationHandler("javax.servlet.annotation.WebServlet", new WebServletAnnotationHandler(context));
+ parser.registerAnnotationHandler("javax.servlet.annotation.WebFilter", new WebFilterAnnotationHandler(context));
+ parser.registerAnnotationHandler("javax.servlet.annotation.WebListener", new WebListenerAnnotationHandler(context));
+ ClassInheritanceHandler classHandler = new ClassInheritanceHandler();
+ parser.registerClassHandler(classHandler);
+ registerServletContainerInitializerAnnotationHandlers(context, parser);
+
+ if (context.getServletContext().getEffectiveMajorVersion() >= 3 || context.isConfigurationDiscovered())
+ {
+ if (Log.isDebugEnabled()) Log.debug("Scanning all classses for annotations: webxmlVersion="+context.getServletContext().getEffectiveMajorVersion()+" configurationDiscovered="+context.isConfigurationDiscovered());
+ parseContainerPath(context, parser);
+ //email from Rajiv Mordani jsrs 315 7 April 2010
+ // If there is a <others/> then the ordering should be
+ // WEB-INF/classes the order of the declared elements + others.
+ // In case there is no others then it is
+ // WEB-INF/classes + order of the elements.
+ parseWebInfClasses(context, parser);
+ parseWebInfLib (context, parser);
+ }
+
+ //save the type inheritance map created by the parser for later reference
+ context.setAttribute(CLASS_INHERITANCE_MAP, classHandler.getMap());
+ }
}
-
+
+ /**
+ * @return a new AnnotationParser. This method can be overridden to use a different impleemntation of
+ * the AnnotationParser. Note that this is considered internal API.
+ */
+ protected AnnotationParser createAnnotationParser()
+ {
+ return new AnnotationParser();
+ }
+
@Override
public void cloneConfigure(WebAppContext template, WebAppContext context) throws Exception
{
context.addDecorator(new AnnotationDecorator(context));
}
+
+
+ public void registerServletContainerInitializerAnnotationHandlers (WebAppContext context, AnnotationParser parser)
+ throws Exception
+ {
+ //TODO verify my interpretation of the spec. That is, that metadata-complete has nothing
+ //to do with finding the ServletContainerInitializers, classes designated to be of interest to them,
+ //or even calling them on startup.
+
+ //Get all ServletContainerInitializers, and check them for HandlesTypes annotations.
+ //For each class in the HandlesTypes value, if it IS an annotation, register a handler
+ //that will record the classes that have that annotation.
+ //If it is NOT an annotation, then we will interrogate the type hierarchy discovered during
+ //parsing later on to find the applicable classes.
+ ArrayList<ContainerInitializer> initializers = new ArrayList<ContainerInitializer>();
+ context.setAttribute(ContainerInitializerConfiguration.CONTAINER_INITIALIZERS, initializers);
+
+ //We use the ServiceLoader mechanism to find the ServletContainerInitializer classes to inspect
+ ServiceLoader<ServletContainerInitializer> loadedInitializers = ServiceLoader.load(ServletContainerInitializer.class, context.getClassLoader());
+
+ if (loadedInitializers != null)
+ {
+ for (ServletContainerInitializer service : loadedInitializers)
+ {
+ if (!isFromExcludedJar(context, service))
+ {
+ HandlesTypes annotation = service.getClass().getAnnotation(HandlesTypes.class);
+ ContainerInitializer initializer = new ContainerInitializer();
+ initializer.setTarget(service);
+ initializers.add(initializer);
+ if (annotation != null)
+ {
+ Class[] classes = annotation.value();
+ if (classes != null)
+ {
+ initializer.setInterestedTypes(classes);
+ for (Class c: classes)
+ {
+ if (c.isAnnotation())
+ {
+ if (Log.isDebugEnabled()) Log.debug("Registering annotation handler for "+c.getName());
+ parser.registerAnnotationHandler(c.getName(), new ContainerInitializerAnnotationHandler(initializer, c));
+ }
+ }
+ }
+ else
+ if (Log.isDebugEnabled()) Log.debug("No classes in HandlesTypes on initializer "+service.getClass());
+ }
+ else
+ if (Log.isDebugEnabled()) Log.debug("No annotation on initializer "+service.getClass());
+ }
+ }
+ }
+ }
+
+ /**
+ * Check to see if the ServletContainerIntializer loaded via the ServiceLoader came
+ * from a jar that is excluded by the fragment ordering. See ServletSpec 3.0 p.85.
+ * @param orderedJars
+ * @param service
+ * @return
+ */
+ public boolean isFromExcludedJar (WebAppContext context, ServletContainerInitializer service)
+ throws Exception
+ {
+ List<Resource> orderedJars = context.getMetaData().getOrderedWebInfJars();
+
+ //If no ordering, nothing is excluded
+ if (context.getMetaData().getOrdering() == null)
+ return false;
+
+ //there is an ordering, but there are no jars resulting from the ordering, everything excluded
+ if (orderedJars.isEmpty())
+ return true;
+
+ String loadingJarName = Thread.currentThread().getContextClassLoader().getResource(service.getClass().getName().replace('.','/')+".class").toString();
+
+ int i = loadingJarName.indexOf(".jar");
+ if (i < 0)
+ return false; //not from a jar therefore not from WEB-INF so not excludable
+
+ loadingJarName = loadingJarName.substring(0,i+4);
+ loadingJarName = (loadingJarName.startsWith("jar:")?loadingJarName.substring(4):loadingJarName);
+ URI loadingJarURI = Resource.newResource(loadingJarName).getURI();
+ boolean found = false;
+ Iterator<Resource> itor = orderedJars.iterator();
+ while (!found && itor.hasNext())
+ {
+ Resource r = itor.next();
+ found = r.getURI().equals(loadingJarURI);
+ }
+
+ return !found;
+ }
+
+ public void parseContainerPath (final WebAppContext context, final AnnotationParser parser)
+ throws Exception
+ {
+ //if no pattern for the container path is defined, then by default scan NOTHING
+ Log.debug("Scanning container jars");
+
+ //clear any previously discovered annotations
+ clearAnnotationList(parser.getAnnotationHandlers());
+
+ //Convert from Resource to URI
+ ArrayList<URI> containerUris = new ArrayList<URI>();
+ for (Resource r : context.getMetaData().getOrderedContainerJars())
+ {
+ URI uri = r.getURI();
+ containerUris.add(uri);
+ }
+
+ parser.parse (containerUris.toArray(new URI[containerUris.size()]),
+ new ClassNameResolver ()
+ {
+ public boolean isExcluded (String name)
+ {
+ if (context.isSystemClass(name)) return false;
+ if (context.isServerClass(name)) return true;
+ return false;
+ }
+
+ public boolean shouldOverride (String name)
+ {
+ //looking at system classpath
+ if (context.isParentLoaderPriority())
+ return true;
+ return false;
+ }
+ });
+
+ //gather together all annotations discovered
+ List<DiscoveredAnnotation> annotations = new ArrayList<DiscoveredAnnotation>();
+ gatherAnnotations(annotations, parser.getAnnotationHandlers());
+
+ context.getMetaData().addDiscoveredAnnotations(annotations);
+ }
+
+
+ public void parseWebInfLib (final WebAppContext context, final AnnotationParser parser)
+ throws Exception
+ {
+ List<FragmentDescriptor> frags = context.getMetaData().getFragments();
+
+ //email from Rajiv Mordani jsrs 315 7 April 2010
+ //jars that do not have a web-fragment.xml are still considered fragments
+ //they have to participate in the ordering
+ ArrayList<URI> webInfUris = new ArrayList<URI>();
+
+ List<Resource> jars = context.getMetaData().getOrderedWebInfJars();
+
+ //No ordering just use the jars in any order
+ if (jars == null || jars.isEmpty())
+ jars = context.getMetaData().getWebInfJars();
+
+ for (Resource r : jars)
+ {
+ //clear any previously discovered annotations from handlers
+ clearAnnotationList(parser.getAnnotationHandlers());
+
+
+ URI uri = r.getURI();
+ FragmentDescriptor f = getFragmentFromJar(r, frags);
+
+ //if a jar has no web-fragment.xml we scan it (because it is not exluded by the ordering)
+ //or if it has a fragment we scan it if it is not metadata complete
+ if (f == null || !isMetaDataComplete(f))
+ {
+ parser.parse(uri,
+ new ClassNameResolver()
+ {
+ public boolean isExcluded (String name)
+ {
+ if (context.isSystemClass(name)) return true;
+ if (context.isServerClass(name)) return false;
+ return false;
+ }
+
+ public boolean shouldOverride (String name)
+ {
+ //looking at webapp classpath, found already-parsed class of same name - did it come from system or duplicate in webapp?
+ if (context.isParentLoaderPriority())
+ return false;
+ return true;
+ }
+ });
+ List<DiscoveredAnnotation> annotations = new ArrayList<DiscoveredAnnotation>();
+ gatherAnnotations(annotations, parser.getAnnotationHandlers());
+ context.getMetaData().addDiscoveredAnnotations(r, annotations);
+ }
+ }
+ }
+
+ public void parseWebInfClasses (final WebAppContext context, final AnnotationParser parser)
+ throws Exception
+ {
+ Log.debug("Scanning classes in WEB-INF/classes");
+ if (context.getWebInf() != null)
+ {
+ Resource classesDir = context.getWebInf().addPath("classes/");
+ if (classesDir.exists())
+ {
+ clearAnnotationList(parser.getAnnotationHandlers());
+ parser.parse(classesDir,
+ new ClassNameResolver()
+ {
+ public boolean isExcluded (String name)
+ {
+ if (context.isSystemClass(name)) return true;
+ if (context.isServerClass(name)) return false;
+ return false;
+ }
+
+ public boolean shouldOverride (String name)
+ {
+ //looking at webapp classpath, found already-parsed class of same name - did it come from system or duplicate in webapp?
+ if (context.isParentLoaderPriority())
+ return false;
+ return true;
+ }
+ });
+
+ //TODO - where to set the annotations discovered from WEB-INF/classes?
+ List<DiscoveredAnnotation> annotations = new ArrayList<DiscoveredAnnotation>();
+ gatherAnnotations(annotations, parser.getAnnotationHandlers());
+ context.getMetaData().addDiscoveredAnnotations (annotations);
+ }
+ }
+ }
+
+
+
+ public FragmentDescriptor getFragmentFromJar (Resource jar, List<FragmentDescriptor> frags)
+ throws Exception
+ {
+ //check if the jar has a web-fragment.xml
+ FragmentDescriptor d = null;
+ for (FragmentDescriptor frag: frags)
+ {
+ Resource fragResource = frag.getResource(); //eg jar:file:///a/b/c/foo.jar!/META-INF/web-fragment.xml
+ if (Resource.isContainedIn(fragResource,jar))
+ {
+ d = frag;
+ break;
+ }
+ }
+ return d;
+ }
+
+ public boolean isMetaDataComplete (WebDescriptor d)
+ {
+ return (d!=null && d.getMetaDataComplete() == MetaDataComplete.True);
+ }
+
+ protected void clearAnnotationList (List<DiscoverableAnnotationHandler> handlers)
+ {
+ if (handlers == null)
+ return;
+
+ for (DiscoverableAnnotationHandler h:handlers)
+ {
+ if (h instanceof AbstractDiscoverableAnnotationHandler)
+ ((AbstractDiscoverableAnnotationHandler)h).resetList();
+ }
+ }
+
+ protected void gatherAnnotations (List<DiscoveredAnnotation> annotations, List<DiscoverableAnnotationHandler> handlers)
+ {
+ for (DiscoverableAnnotationHandler h:handlers)
+ {
+ if (h instanceof AbstractDiscoverableAnnotationHandler)
+ annotations.addAll(((AbstractDiscoverableAnnotationHandler)h).getAnnotationList());
+ }
+ }
}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationDecorator.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationDecorator.java
index 25b7546d5f..8a5b1363ac 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationDecorator.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationDecorator.java
@@ -45,6 +45,7 @@ public class AnnotationDecorator implements Decorator
_introspector.registerHandler(new PostConstructAnnotationHandler(context));
_introspector.registerHandler(new PreDestroyAnnotationHandler(context));
_introspector.registerHandler(new DeclareRolesAnnotationHandler(context));
+ _introspector.registerHandler(new MultiPartConfigAnnotationHandler(context));
}
/* ------------------------------------------------------------ */
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationParser.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationParser.java
index c8bfb168ab..98d9f5c426 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationParser.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/AnnotationParser.java
@@ -43,7 +43,7 @@ import org.objectweb.asm.commons.EmptyVisitor;
* a handler being able to be registered to handle each annotation type.
*/
public class AnnotationParser
-{
+{
protected List<String> _parsedClassNames = new ArrayList<String>();
protected Map<String, List<DiscoverableAnnotationHandler>> _annotationHandlers = new HashMap<String, List<DiscoverableAnnotationHandler>>();
protected List<ClassHandler> _classHandlers = new ArrayList<ClassHandler>();
@@ -636,10 +636,11 @@ public class AnnotationParser
parse(uris, resolver);
}
- private void scanClass (InputStream is)
+ protected void scanClass (InputStream is)
throws IOException
{
ClassReader reader = new ClassReader(is);
reader.accept(new MyClassVisitor(), ClassReader.SKIP_CODE|ClassReader.SKIP_DEBUG|ClassReader.SKIP_FRAMES);
}
}
+
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerAnnotationHandler.java
new file mode 100644
index 0000000000..6b38163c8e
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerAnnotationHandler.java
@@ -0,0 +1,67 @@
+// ========================================================================
+// Copyright (c) 2006-2009 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.annotations;
+
+import java.util.List;
+
+import javax.servlet.annotation.HandlesTypes;
+
+import org.eclipse.jetty.annotations.AnnotationParser.DiscoverableAnnotationHandler;
+import org.eclipse.jetty.annotations.AnnotationParser.Value;
+import org.eclipse.jetty.plus.annotation.ContainerInitializer;
+import org.eclipse.jetty.util.Loader;
+import org.eclipse.jetty.util.log.Log;
+
+/**
+ * ContainerInitializerAnnotationHandler
+ *
+ * Discovers classes that contain the specified annotation, either at class or
+ * method level. The specified annotation is derived from an @HandlesTypes on
+ * a ServletContainerInitializer class.
+ */
+public class ContainerInitializerAnnotationHandler implements DiscoverableAnnotationHandler
+{
+ ContainerInitializer _initializer;
+ Class _annotation;
+
+ public ContainerInitializerAnnotationHandler (ContainerInitializer initializer, Class annotation)
+ {
+ _initializer = initializer;
+ _annotation = annotation;
+ }
+
+ /**
+ * Handle finding a class that is annotated with the annotation we were constructed with.
+ * @see org.eclipse.jetty.annotations.AnnotationParser.DiscoverableAnnotationHandler#handleClass(java.lang.String, int, int, java.lang.String, java.lang.String, java.lang.String[], java.lang.String, java.util.List)
+ */
+ public void handleClass(String className, int version, int access, String signature, String superName, String[] interfaces, String annotationName,
+ List<Value> values)
+ {
+ _initializer.addAnnotatedTypeName(className);
+ }
+
+ public void handleField(String className, String fieldName, int access, String fieldType, String signature, Object value, String annotation,
+ List<Value> values)
+ {
+ _initializer.addAnnotatedTypeName(className);
+ }
+
+ public void handleMethod(String className, String methodName, int access, String params, String signature, String[] exceptions, String annotation,
+ List<Value> values)
+ {
+ _initializer.addAnnotatedTypeName(className);
+ }
+
+}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerConfiguration.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerConfiguration.java
new file mode 100644
index 0000000000..91960ffcfd
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ContainerInitializerConfiguration.java
@@ -0,0 +1,118 @@
+// ========================================================================
+// Copyright (c) 2006-2009 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.annotations;
+
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jetty.plus.annotation.ContainerInitializer;
+import org.eclipse.jetty.util.MultiMap;
+import org.eclipse.jetty.webapp.AbstractConfiguration;
+import org.eclipse.jetty.webapp.Configuration;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * ContainerInitializerConfiguration
+ *
+ * Apply the ServletContainerInitializers.
+ */
+public class ContainerInitializerConfiguration extends AbstractConfiguration
+{
+ public static final String CONTAINER_INITIALIZERS = "org.eclipse.jetty.containerInitializers";
+
+ public void preConfigure(WebAppContext context) throws Exception
+ {
+ }
+
+ public void configure(WebAppContext context) throws Exception
+ {
+ List<ContainerInitializer> initializers = (List<ContainerInitializer>)context.getAttribute(CONTAINER_INITIALIZERS);
+ MultiMap classMap = (MultiMap)context.getAttribute(AnnotationConfiguration.CLASS_INHERITANCE_MAP);
+
+ if (initializers != null)
+ {
+ for (ContainerInitializer i : initializers)
+ {
+ //We have already found the classes that directly have an annotation that was in the HandlesTypes
+ //annotation of the ServletContainerInitializer. For each of those classes, walk the inheritance
+ //hierarchy to find classes that extend or implement them.
+ if (i.getAnnotatedTypeNames() != null)
+ {
+ Set<String> annotatedClassNames = new HashSet<String>(i.getAnnotatedTypeNames());
+ for (String name : annotatedClassNames)
+ {
+ //add the class with the annotation
+ i.addApplicableTypeName(name);
+ //add the classes that inherit the annotation
+ List<String> implementsOrExtends = (List<String>)classMap.getValues(name);
+ if (implementsOrExtends != null && !implementsOrExtends.isEmpty())
+ addInheritedTypes(classMap, i, implementsOrExtends);
+ }
+ }
+
+
+ //Now we need to look at the HandlesTypes classes that were not annotations. We need to
+ //find all classes that extend or implement them.
+ if (i.getInterestedTypes() != null)
+ {
+ for (Class c : i.getInterestedTypes())
+ {
+ if (!c.isAnnotation())
+ {
+ //add the classes that implement or extend the class.
+ //TODO but not including the class itself?
+ List<String> implementsOrExtends = (List<String>)classMap.getValues(c.getName());
+ if (implementsOrExtends != null && !implementsOrExtends.isEmpty())
+ addInheritedTypes(classMap, i, implementsOrExtends);
+ }
+ }
+ }
+ //instantiate ServletContainerInitializers, call doStart
+ i.callStartup(context);
+ }
+
+ //TODO Email from Jan Luehe 18 August: after all ServletContainerInitializers have been
+ //called, need to check to see if there are any ServletRegistrations remaining
+ //that are "preliminary" and fail the deployment if so.
+ }
+ }
+
+ public void postConfigure(WebAppContext context) throws Exception
+ {
+
+ }
+
+ public void deconfigure(WebAppContext context) throws Exception
+ {
+ }
+
+
+ void addInheritedTypes (MultiMap classMap, ContainerInitializer initializer, List<String> applicableTypes)
+ {
+ for (String s : applicableTypes)
+ {
+ //add the name of the class that extends or implements
+ initializer.addApplicableTypeName(s);
+
+ //walk the hierarchy and find all types that extend or implement it
+ List<String> implementsOrExtends = (List<String>)classMap.getValues(s);
+ if (implementsOrExtends != null && !implementsOrExtends.isEmpty())
+ addInheritedTypes (classMap, initializer, implementsOrExtends);
+ }
+ }
+
+}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/MultiPartConfigAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/MultiPartConfigAnnotationHandler.java
new file mode 100644
index 0000000000..7a02031352
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/MultiPartConfigAnnotationHandler.java
@@ -0,0 +1,90 @@
+// ========================================================================
+// Copyright (c) 2006-2009 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.annotations;
+
+import javax.servlet.MultipartConfigElement;
+import javax.servlet.Servlet;
+import javax.servlet.annotation.MultipartConfig;
+
+import org.eclipse.jetty.annotations.AnnotationIntrospector.AbstractIntrospectableAnnotationHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.webapp.Descriptor;
+import org.eclipse.jetty.webapp.MetaData;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * MultiPartConfigAnnotationHandler
+ *
+ *
+ */
+public class MultiPartConfigAnnotationHandler extends AbstractIntrospectableAnnotationHandler
+{
+ protected WebAppContext _context;
+
+ public MultiPartConfigAnnotationHandler(WebAppContext context)
+ {
+ //TODO verify that MultipartConfig is not inheritable
+ super(false);
+ _context = context;
+ }
+ /**
+ * @see org.eclipse.jetty.annotations.AnnotationIntrospector.AbstractIntrospectableAnnotationHandler#doHandle(java.lang.Class)
+ */
+ public void doHandle(Class clazz)
+ {
+ if (!Servlet.class.isAssignableFrom(clazz))
+ return;
+
+ MultipartConfig multi = (MultipartConfig) clazz.getAnnotation(MultipartConfig.class);
+ if (multi == null)
+ return;
+
+ MetaData metaData = _context.getMetaData();
+
+ //TODO: The MultipartConfigElement needs to be set on the ServletHolder's Registration.
+ //How to identify the correct Servlet? If the Servlet has no WebServlet annotation on it, does it mean that this MultipartConfig
+ //annotation applies to all declared instances in web.xml/programmatically?
+ //Assuming TRUE for now.
+
+ ServletHolder holder = getServletHolderForClass(clazz);
+ if (holder != null)
+ {
+ Descriptor d = metaData.getOriginDescriptor(holder.getName()+".servlet.multipart-config");
+ //if a descriptor has already set the value for multipart config, do not
+ //let the annotation override it
+ if (d == null)
+ {
+ metaData.setOrigin(holder.getName()+".servlet.multipart-config");
+ holder.getRegistration().setMultipartConfig(new MultipartConfigElement(multi));
+ }
+ }
+ }
+
+ private ServletHolder getServletHolderForClass (Class clazz)
+ {
+ ServletHolder holder = null;
+ ServletHolder[] holders = _context.getServletHandler().getServlets();
+ if (holders != null)
+ {
+ for (ServletHolder h : holders)
+ {
+ if (h.getClassName().equals(clazz.getName()))
+ {
+ holder = h;
+ }
+ }
+ }
+ return holder;
+ }
+}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletSecurityAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletSecurityAnnotationHandler.java
new file mode 100644
index 0000000000..aac9748b61
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/ServletSecurityAnnotationHandler.java
@@ -0,0 +1,291 @@
+// ========================================================================
+// Copyright (c) 2006-2009 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.annotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.annotation.HttpConstraint;
+import javax.servlet.annotation.HttpMethodConstraint;
+import javax.servlet.annotation.ServletSecurity;
+import javax.servlet.annotation.ServletSecurity.EmptyRoleSemantic;
+import javax.servlet.annotation.ServletSecurity.TransportGuarantee;
+
+import org.eclipse.jetty.annotations.AnnotationIntrospector.AbstractIntrospectableAnnotationHandler;
+import org.eclipse.jetty.http.security.Constraint;
+import org.eclipse.jetty.security.ConstraintAware;
+import org.eclipse.jetty.security.ConstraintMapping;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.servlet.ServletMapping;
+import org.eclipse.jetty.util.LazyList;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * ServletSecurityAnnotationHandler
+ *
+ * Inspect a class to see if it has an @ServletSecurity annotation on it,
+ * setting up the <security-constraint>s.
+ *
+ * A servlet can be defined in:
+ * <ul>
+ * <li>web.xml
+ * <li>web-fragment.xml
+ * <li>@WebServlet annotation discovered
+ * <li>ServletContext.createServlet
+ * </ul>
+ *
+ * The ServletSecurity annotation for a servlet should only be processed
+ * iff metadata-complete == false.
+ */
+public class ServletSecurityAnnotationHandler extends AbstractIntrospectableAnnotationHandler
+{
+
+ private WebAppContext _context;
+
+ public ServletSecurityAnnotationHandler(WebAppContext wac)
+ {
+ super(false);
+ _context = wac;
+ }
+
+ /**
+ * @see org.eclipse.jetty.annotations.AnnotationIntrospector.IntrospectableAnnotationHandler#handle(java.lang.Class)
+ */
+ public void doHandle(Class clazz)
+ {
+ if (!(_context.getSecurityHandler() instanceof ConstraintAware))
+ {
+ Log.warn("SecurityHandler not ConstraintAware, skipping security annotation processing");
+ return;
+ }
+
+ ServletSecurity servletSecurity = (ServletSecurity)clazz.getAnnotation(ServletSecurity.class);
+ if (servletSecurity == null)
+ return;
+
+ //If there are already constraints defined (ie from web.xml or programmatically(?)) that match any
+ //of the url patterns defined for this servlet, then skip the security annotation.
+
+ List<ServletMapping> servletMappings = getServletMappings(clazz.getCanonicalName());
+ List<ConstraintMapping> constraintMappings = ((ConstraintAware)_context.getSecurityHandler()).getConstraintMappings();
+
+ if (constraintsExist(servletMappings, constraintMappings))
+ {
+ Log.warn("Constraints already defined for "+clazz.getName()+", skipping ServletSecurity annotation");
+ return;
+ }
+
+ //Make a fresh list
+ constraintMappings = new ArrayList<ConstraintMapping>();
+
+ //Get the values that form the constraints that will apply unless there are HttpMethodConstraints to augment them
+ HttpConstraint defaults = servletSecurity.value();
+
+ //Make a Constraint for the <auth-constraint> and <user-data-constraint> specified by the HttpConstraint
+ Constraint defaultConstraint = makeConstraint (clazz,
+ defaults.rolesAllowed(),
+ defaults.value(),
+ defaults.transportGuarantee());
+
+ constraintMappings.addAll(makeMethodMappings(clazz,
+ defaultConstraint,
+ servletMappings,
+ servletSecurity.httpMethodConstraints()));
+
+ //set up the security constraints produced by the annotation
+ ConstraintAware securityHandler = (ConstraintAware)_context.getSecurityHandler();
+
+ for (ConstraintMapping m:constraintMappings)
+ securityHandler.addConstraintMapping(m);
+ }
+
+
+
+ /**
+ * Make a jetty Constraint object, which represents the <auth-constraint> and
+ * <user-data-constraint> elements, based on the security annotation.
+ * @param servlet
+ * @param rolesAllowed
+ * @param permitOrDeny
+ * @param transport
+ * @return
+ */
+ protected Constraint makeConstraint (Class servlet, String[] rolesAllowed, EmptyRoleSemantic permitOrDeny, TransportGuarantee transport)
+ {
+ Constraint constraint = new Constraint();
+ if (rolesAllowed == null || rolesAllowed.length==0)
+ {
+ if (permitOrDeny.equals(EmptyRoleSemantic.DENY))
+ {
+ //Equivalent to <auth-constraint> with no roles
+ constraint.setName(servlet.getName()+"-Deny");
+ constraint.setAuthenticate(true);
+ }
+ else
+ {
+ //Equivalent to no <auth-constraint>
+ constraint.setAuthenticate(false);
+ constraint.setName(servlet.getName()+"-Permit");
+ }
+ }
+ else
+ {
+ //Equivalent to <auth-constraint> with list of <security-role-name>s
+ constraint.setAuthenticate(true);
+ constraint.setRoles(rolesAllowed);
+ constraint.setName(servlet.getName()+"-RolesAllowed");
+ }
+
+ //Equivalent to //<user-data-constraint><transport-guarantee>CONFIDENTIAL</transport-guarantee></user-data-constraint>
+ constraint.setDataConstraint((transport.equals(TransportGuarantee.CONFIDENTIAL)?Constraint.DC_CONFIDENTIAL:Constraint.DC_NONE));
+ return constraint;
+ }
+
+
+ /**
+ * Make a ConstraintMapping which captures the <http-method> or <http-method-omission> elements for a particular url pattern,
+ * and relates it to a Constraint object (<auth-constraint> and <user-data-constraint>).
+ * @param constraint
+ * @param url
+ * @param method
+ * @param omissions
+ * @return
+ */
+ protected ConstraintMapping makeConstraintMapping (Constraint constraint, String url, String method, String[] omissions)
+ {
+ ConstraintMapping mapping = new ConstraintMapping();
+ mapping.setConstraint(constraint);
+ mapping.setPathSpec(url);
+ if (method != null)
+ mapping.setMethod(method);
+ if (omissions != null)
+ mapping.setMethodOmissions(omissions);
+ return mapping;
+ }
+
+ /**
+ * Make the Jetty Constraints and ConstraintMapping objects that correspond to the HttpMethodConstraint
+ * annotations for each url pattern for the servlet.
+ * @param servlet
+ * @param defaultConstraint
+ * @param servletMappings
+ * @param annotations
+ * @return
+ */
+ protected List<ConstraintMapping> makeMethodMappings (Class servlet, Constraint defaultConstraint, List<ServletMapping> servletMappings, HttpMethodConstraint[] annotations)
+ {
+ List<ConstraintMapping> mappings = new ArrayList<ConstraintMapping>();
+
+ //for each url-pattern existing for the servlet make a ConstraintMapping for the HttpConstraint, and ConstraintMappings for
+ //each HttpMethodConstraint
+ for (ServletMapping sm : servletMappings)
+ {
+ for (String url : sm.getPathSpecs())
+ {
+ //Make a ConstraintMapping that matches the defaultConstraint
+ ConstraintMapping defaultMapping = makeConstraintMapping(defaultConstraint, url, null, null);
+
+ //If there are HttpMethodConstraint annotations, make a Constraint and a ConstraintMapping for it
+ if (annotations != null && annotations.length>0)
+ {
+ List<String> omissions = new ArrayList<String>();
+
+ //for each HttpMethodConstraint annotation, make a new Constraint and ConstraintMappings for this url
+ for (int i=0; i < annotations.length;i++)
+ {
+ //Make a Constraint that captures the <auth-constraint> and <user-data-constraint> elements
+ Constraint methodConstraint = makeConstraint(servlet,
+ annotations[i].rolesAllowed(),
+ annotations[i].emptyRoleSemantic(),
+ annotations[i].transportGuarantee());
+
+ //Make ConstraintMapping that captures the <http-method> elements
+ ConstraintMapping methodConstraintMapping = makeConstraintMapping (methodConstraint,
+ url,annotations[i].value(),
+ null);
+ mappings.add(methodConstraintMapping);
+ omissions.add(annotations[i].value());
+ }
+ defaultMapping.setMethodOmissions(omissions.toArray(new String[0]));
+ }
+
+ //add the constraint mapping containing the http-method-omissions, if there are any
+ mappings.add(defaultMapping);
+ }
+ }
+ return mappings;
+ }
+
+
+
+ /**
+ * Get the ServletMappings for the servlet's class.
+ * @param className
+ * @return
+ */
+ protected List<ServletMapping> getServletMappings(String className)
+ {
+ List<ServletMapping> results = new ArrayList<ServletMapping>();
+ ServletMapping[] mappings = _context.getServletHandler().getServletMappings();
+ for (ServletMapping mapping : mappings)
+ {
+ //Check the name of the servlet that this mapping applies to, and then find the ServletHolder for it to find it's class
+ ServletHolder holder = _context.getServletHandler().getServlet(mapping.getServletName());
+ if (holder.getClassName().equals(className))
+ results.add(mapping);
+ }
+ return results;
+ }
+
+
+
+ /**
+ * Check if there are already <security-constraint> elements defined that match the url-patterns for
+ * the servlet.
+ * @param servletMappings
+ * @return
+ */
+ protected boolean constraintsExist (List<ServletMapping> servletMappings, List<ConstraintMapping> constraintMappings)
+ {
+ boolean exists = false;
+
+ //Check to see if the path spec on each constraint mapping matches a pathSpec in the servlet mappings.
+ //If it does, then we should ignore the security annotations.
+ for (ServletMapping mapping : servletMappings)
+ {
+ //Get its url mappings
+ String[] pathSpecs = mapping.getPathSpecs();
+ if (pathSpecs == null)
+ continue;
+
+ //Check through the constraints to see if there are any whose pathSpecs (url mappings)
+ //match the servlet. If so, then we already have constraints defined for this servlet,
+ //and we will not be processing the annotation (ie web.xml or programmatic override).
+ for (int i=0; constraintMappings != null && i < constraintMappings.size() && !exists; i++)
+ {
+ for (int j=0; j < pathSpecs.length; j++)
+ {
+ if (pathSpecs[j].equals(constraintMappings.get(i).getPathSpec()))
+ {
+ exists = true;
+ break;
+ }
+ }
+ }
+ }
+ return exists;
+ }
+
+}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/Util.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/Util.java
index d1ad40bbf4..5b394efeb6 100644
--- a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/Util.java
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/Util.java
@@ -56,7 +56,8 @@ public class Util
javax.servlet.ServletRequestListener.class.isAssignableFrom(c) ||
javax.servlet.ServletRequestAttributeListener.class.isAssignableFrom(c) ||
javax.servlet.http.HttpSessionListener.class.isAssignableFrom(c) ||
- javax.servlet.http.HttpSessionAttributeListener.class.isAssignableFrom(c))
+ javax.servlet.http.HttpSessionAttributeListener.class.isAssignableFrom(c) ||
+ javax.servlet.AsyncListener.class.isAssignableFrom(c))
isServlet=true;
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotation.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotation.java
new file mode 100644
index 0000000000..2d065b0b62
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotation.java
@@ -0,0 +1,210 @@
+// ========================================================================
+// Copyright (c) 2010 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.annotations;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.Filter;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.annotation.WebInitParam;
+
+import org.eclipse.jetty.servlet.FilterHolder;
+import org.eclipse.jetty.servlet.FilterMapping;
+import org.eclipse.jetty.servlet.Holder;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.webapp.DiscoveredAnnotation;
+import org.eclipse.jetty.webapp.MetaData;
+import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.webapp.Origin;
+
+/**
+ * WebFilterAnnotation
+ *
+ *
+ */
+public class WebFilterAnnotation extends DiscoveredAnnotation
+{
+
+ /**
+ * @param context
+ * @param className
+ */
+ public WebFilterAnnotation(WebAppContext context, String className)
+ {
+ super(context, className);
+ }
+
+ /**
+ * @see org.eclipse.jetty.annotations.ClassAnnotation#apply()
+ */
+ public void apply()
+ {
+ // TODO verify against rules for annotation v descriptor
+
+ Class clazz = getTargetClass();
+ if (clazz == null)
+ {
+ Log.warn(_className+" cannot be loaded");
+ return;
+ }
+
+
+ //Servlet Spec 8.1.2
+ if (!Filter.class.isAssignableFrom(clazz))
+ {
+ Log.warn(clazz.getName()+" is not assignable from javax.servlet.Filter");
+ return;
+ }
+ MetaData metaData = _context.getMetaData();
+
+ WebFilter filterAnnotation = (WebFilter)clazz.getAnnotation(WebFilter.class);
+
+ if (filterAnnotation.value().length > 0 && filterAnnotation.urlPatterns().length > 0)
+ {
+ Log.warn(clazz.getName()+" defines both @WebFilter.value and @WebFilter.urlPatterns");
+ return;
+ }
+
+ String name = (filterAnnotation.filterName().equals("")?clazz.getName():filterAnnotation.filterName());
+ String[] urlPatterns = filterAnnotation.value();
+ if (urlPatterns.length == 0)
+ urlPatterns = filterAnnotation.urlPatterns();
+
+ FilterHolder holder = _context.getServletHandler().getFilter(name);
+ if (holder == null)
+ {
+ //Filter with this name does not already exist, so add it
+ holder = _context.getServletHandler().newFilterHolder(Holder.Source.ANNOTATION);
+ holder.setName(name);
+
+ holder.setHeldClass(clazz);
+ metaData.setOrigin(name+".filter.filter-class");
+
+ holder.setDisplayName(filterAnnotation.displayName());
+ metaData.setOrigin(name+".filter.display-name");
+
+ for (WebInitParam ip: filterAnnotation.initParams())
+ {
+ holder.setInitParameter(ip.name(), ip.value());
+ metaData.setOrigin(name+".filter.init-param."+ip.name());
+ }
+
+ FilterMapping mapping = new FilterMapping();
+ mapping.setFilterName(holder.getName());
+
+ if (urlPatterns.length > 0)
+ {
+ ArrayList paths = new ArrayList();
+ for (String s:urlPatterns)
+ {
+ paths.add(Util.normalizePattern(s));
+ }
+ mapping.setPathSpecs((String[])paths.toArray(new String[paths.size()]));
+ }
+
+ if (filterAnnotation.servletNames().length > 0)
+ {
+ ArrayList<String> names = new ArrayList<String>();
+ for (String s : filterAnnotation.servletNames())
+ {
+ names.add(s);
+ }
+ mapping.setServletNames((String[])names.toArray(new String[names.size()]));
+ }
+
+ EnumSet<DispatcherType> dispatcherSet = EnumSet.noneOf(DispatcherType.class);
+ for (DispatcherType d : filterAnnotation.dispatcherTypes())
+ {
+ dispatcherSet.add(d);
+ }
+ mapping.setDispatcherTypes(dispatcherSet);
+ metaData.setOrigin(name+".filter.mappings");
+
+ holder.setAsyncSupported(filterAnnotation.asyncSupported());
+ metaData.setOrigin(name+".filter.async-supported");
+
+ _context.getServletHandler().addFilter(holder);
+ _context.getServletHandler().addFilterMapping(mapping);
+ }
+ else
+ {
+ //A Filter definition for the same name already exists from web.xml
+ //ServletSpec 3.0 p81 if the Filter is already defined and has mappings,
+ //they override the annotation. If it already has DispatcherType set, that
+ //also overrides the annotation. Init-params are additive, but web.xml overrides
+ //init-params of the same name.
+ for (WebInitParam ip: filterAnnotation.initParams())
+ {
+ //if (holder.getInitParameter(ip.name()) == null)
+ if (metaData.getOrigin(name+".filter.init-param."+ip.name())==Origin.NotSet)
+ {
+ holder.setInitParameter(ip.name(), ip.value());
+ metaData.setOrigin(name+".filter.init-param."+ip.name());
+ }
+ }
+
+ FilterMapping[] mappings = _context.getServletHandler().getFilterMappings();
+ boolean mappingExists = false;
+ if (mappings != null)
+ {
+ for (FilterMapping m:mappings)
+ {
+ if (m.getFilterName().equals(name))
+ {
+ mappingExists = true;
+ break;
+ }
+ }
+ }
+ //if a descriptor didn't specify at least one mapping, use the mappings from the annotation and the DispatcherTypes
+ //from the annotation
+ if (!mappingExists)
+ {
+ FilterMapping mapping = new FilterMapping();
+ mapping.setFilterName(holder.getName());
+
+ if (urlPatterns.length > 0)
+ {
+ ArrayList paths = new ArrayList();
+ for (String s:urlPatterns)
+ {
+ paths.add(Util.normalizePattern(s));
+ }
+ mapping.setPathSpecs((String[])paths.toArray(new String[paths.size()]));
+ }
+ if (filterAnnotation.servletNames().length > 0)
+ {
+ ArrayList<String> names = new ArrayList<String>();
+ for (String s : filterAnnotation.servletNames())
+ {
+ names.add(s);
+ }
+ mapping.setServletNames((String[])names.toArray(new String[names.size()]));
+ }
+
+ EnumSet<DispatcherType> dispatcherSet = EnumSet.noneOf(DispatcherType.class);
+ for (DispatcherType d : filterAnnotation.dispatcherTypes())
+ {
+ dispatcherSet.add(d);
+ }
+ mapping.setDispatcherTypes(dispatcherSet);
+ _context.getServletHandler().addFilterMapping(mapping);
+ metaData.setOrigin(name+".filter.mappings");
+ }
+ }
+ }
+
+}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotationHandler.java
new file mode 100644
index 0000000000..20cfdd682b
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebFilterAnnotationHandler.java
@@ -0,0 +1,55 @@
+// ========================================================================
+// Copyright (c) 2009-2010 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.annotations;
+
+import java.util.List;
+
+import org.eclipse.jetty.annotations.AnnotationParser.DiscoverableAnnotationHandler;
+import org.eclipse.jetty.annotations.AnnotationParser.Value;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.webapp.DiscoveredAnnotation;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * WebFilterAnnotationHandler
+ *
+ *
+ */
+public class WebFilterAnnotationHandler extends AbstractDiscoverableAnnotationHandler
+{
+ public WebFilterAnnotationHandler (WebAppContext context)
+ {
+ super(context);
+ }
+
+ public void handleClass(String className, int version, int access, String signature, String superName, String[] interfaces, String annotation,
+ List<Value> values)
+ {
+ WebFilterAnnotation wfAnnotation = new WebFilterAnnotation(_context, className);
+ addAnnotation(wfAnnotation);
+ }
+
+ public void handleField(String className, String fieldName, int access, String fieldType, String signature, Object value, String annotation,
+ List<Value> values)
+ {
+ Log.warn ("@WebFilter not applicable for fields: "+className+"."+fieldName);
+ }
+
+ public void handleMethod(String className, String methodName, int access, String params, String signature, String[] exceptions, String annotation,
+ List<Value> values)
+ {
+ Log.warn ("@WebFilter not applicable for methods: "+className+"."+methodName+" "+signature);
+ }
+
+}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotation.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotation.java
new file mode 100644
index 0000000000..0af13eea32
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotation.java
@@ -0,0 +1,83 @@
+// ========================================================================
+// Copyright (c) 2006-2009 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.annotations;
+
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletRequestAttributeListener;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionListener;
+
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.webapp.DiscoveredAnnotation;
+import org.eclipse.jetty.webapp.MetaData;
+import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.webapp.Origin;
+
+/**
+ * WebListenerAnnotation
+ *
+ *
+ */
+public class WebListenerAnnotation extends DiscoveredAnnotation
+{
+
+ /**
+ * @param context
+ * @param className
+ */
+ public WebListenerAnnotation(WebAppContext context, String className)
+ {
+ super(context, className);
+ }
+
+ /**
+ * @see org.eclipse.jetty.annotations.ClassAnnotation#apply()
+ */
+ public void apply()
+ {
+ // TODO check algorithm against ordering rules for descriptors v annotations
+
+ Class clazz = getTargetClass();
+
+ if (clazz == null)
+ {
+ Log.warn(_className+" cannot be loaded");
+ return;
+ }
+
+ try
+ {
+ if (ServletContextListener.class.isAssignableFrom(clazz) ||
+ ServletContextAttributeListener.class.isAssignableFrom(clazz) ||
+ ServletRequestListener.class.isAssignableFrom(clazz) ||
+ ServletRequestAttributeListener.class.isAssignableFrom(clazz) ||
+ HttpSessionListener.class.isAssignableFrom(clazz) ||
+ HttpSessionAttributeListener.class.isAssignableFrom(clazz))
+ {
+ java.util.EventListener listener = (java.util.EventListener)clazz.newInstance();
+ MetaData metaData = _context.getMetaData();
+ if (metaData.getOrigin(clazz.getName()+".listener") == Origin.NotSet)
+ _context.addEventListener(listener);
+ }
+ else
+ Log.warn(clazz.getName()+" does not implement one of the servlet listener interfaces");
+ }
+ catch (Exception e)
+ {
+ Log.warn(e);
+ }
+ }
+}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotationHandler.java
new file mode 100644
index 0000000000..d2857af8a1
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebListenerAnnotationHandler.java
@@ -0,0 +1,50 @@
+// ========================================================================
+// Copyright (c) 2009-2010 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.annotations;
+
+import java.util.List;
+
+import org.eclipse.jetty.annotations.AnnotationParser.Value;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+public class WebListenerAnnotationHandler extends AbstractDiscoverableAnnotationHandler
+{
+ public WebListenerAnnotationHandler (WebAppContext context)
+ {
+ super(context);
+ }
+
+ /**
+ * @see org.eclipse.jetty.annotations.AnnotationParser.DiscoverableAnnotationHandler#handleClass(java.lang.String, int, int, java.lang.String, java.lang.String, java.lang.String[], java.lang.String, java.util.List)
+ */
+ public void handleClass(String className, int version, int access, String signature, String superName, String[] interfaces, String annotation,
+ List<Value> values)
+ {
+ WebListenerAnnotation wlAnnotation = new WebListenerAnnotation(_context, className);
+ addAnnotation(wlAnnotation);
+ }
+
+ public void handleField(String className, String fieldName, int access, String fieldType, String signature, Object value, String annotation,
+ List<Value> values)
+ {
+ Log.warn ("@WebListener is not applicable to fields: "+className+"."+fieldName);
+ }
+
+ public void handleMethod(String className, String methodName, int access, String params, String signature, String[] exceptions, String annotation,
+ List<Value> values)
+ {
+ Log.warn ("@WebListener is not applicable to methods: "+className+"."+methodName+" "+signature);
+ }
+
+}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotation.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotation.java
new file mode 100644
index 0000000000..102bc053e1
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotation.java
@@ -0,0 +1,169 @@
+// ========================================================================
+// Copyright (c) 2010 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.annotations;
+
+import java.util.ArrayList;
+
+import javax.servlet.annotation.WebInitParam;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+
+import org.eclipse.jetty.servlet.Holder;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.servlet.ServletMapping;
+import org.eclipse.jetty.util.LazyList;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.webapp.DiscoveredAnnotation;
+import org.eclipse.jetty.webapp.MetaData;
+import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.webapp.Origin;
+
+/**
+ * WebServletAnnotation
+ *
+ *
+ */
+public class WebServletAnnotation extends DiscoveredAnnotation
+{
+
+ public WebServletAnnotation (WebAppContext context, String className)
+ {
+ super(context, className);
+ }
+
+ /**
+ * @see org.eclipse.jetty.annotations.ClassAnnotation#apply()
+ */
+ public void apply()
+ {
+ //TODO check this algorithm with new rules for applying descriptors and annotations in order
+ Class clazz = getTargetClass();
+
+ if (clazz == null)
+ {
+ Log.warn(_className+" cannot be loaded");
+ return;
+ }
+
+ //Servlet Spec 8.1.1
+ if (!HttpServlet.class.isAssignableFrom(clazz))
+ {
+ Log.warn(clazz.getName()+" is not assignable from javax.servlet.http.HttpServlet");
+ return;
+ }
+
+ WebServlet annotation = (WebServlet)clazz.getAnnotation(WebServlet.class);
+
+ if (annotation.urlPatterns().length > 0 && annotation.value().length > 0)
+ {
+ Log.warn(clazz.getName()+ " defines both @WebServlet.value and @WebServlet.urlPatterns");
+ return;
+ }
+
+ String[] urlPatterns = annotation.value();
+ if (urlPatterns.length == 0)
+ urlPatterns = annotation.urlPatterns();
+
+ if (urlPatterns.length == 0)
+ {
+ Log.warn(clazz.getName()+ " defines neither @WebServlet.value nor @WebServlet.urlPatterns");
+ return;
+ }
+
+ //canonicalize the patterns
+ ArrayList<String> urlPatternList = new ArrayList<String>();
+ for (String p : urlPatterns)
+ urlPatternList.add(Util.normalizePattern(p));
+
+ String servletName = (annotation.name().equals("")?clazz.getName():annotation.name());
+
+ MetaData metaData = _context.getMetaData();
+
+ //Find out if a <servlet> of this type already exists with this name
+ ServletHolder[] holders = _context.getServletHandler().getServlets();
+ boolean isNew = true;
+ ServletHolder holder = null;
+ if (holders != null)
+ {
+ for (ServletHolder h : holders)
+ {
+ if (h.getClassName().equals(clazz.getName()) && h.getName().equals(servletName))
+ {
+ holder = h;
+ isNew = false;
+ break;
+ }
+ }
+ }
+
+ if (isNew)
+ {
+ //No servlet of this name has already been defined, either by a descriptor
+ //or another annotation (which would be impossible).
+ holder = _context.getServletHandler().newServletHolder(Holder.Source.ANNOTATION);
+ holder.setHeldClass(clazz);
+ metaData.setOrigin(servletName+".servlet.servlet-class");
+
+ holder.setName(servletName);
+ holder.setDisplayName(annotation.displayName());
+ metaData.setOrigin(servletName+".servlet.display-name");
+
+ holder.setInitOrder(annotation.loadOnStartup());
+ metaData.setOrigin(servletName+".servlet.load-on-startup");
+
+ holder.setAsyncSupported(annotation.asyncSupported());
+ metaData.setOrigin(servletName+".servlet.async-supported");
+
+ for (WebInitParam ip:annotation.initParams())
+ {
+ holder.setInitParameter(ip.name(), ip.value());
+ metaData.setOrigin(servletName+".servlet.init-param."+ip.name());
+ }
+
+ _context.getServletHandler().addServlet(holder);
+ ServletMapping mapping = new ServletMapping();
+ mapping.setServletName(holder.getName());
+ mapping.setPathSpecs( LazyList.toStringArray(urlPatternList));
+ _context.getServletHandler().addServletMapping(mapping);
+ metaData.setOrigin(servletName+".servlet.mappings");
+ }
+ else
+ {
+ //check if the existing servlet has each init-param from the annotation
+ //if not, add it
+ for (WebInitParam ip:annotation.initParams())
+ {
+ //if (holder.getInitParameter(ip.name()) == null)
+ if (metaData.getOrigin(servletName+".servlet.init-param"+ip.name())==Origin.NotSet)
+ {
+ holder.setInitParameter(ip.name(), ip.value());
+ metaData.setOrigin(servletName+".servlet.init-param."+ip.name());
+ }
+ }
+
+ //check the url-patterns, if there annotation has a new one, add it
+ ServletMapping[] mappings = _context.getServletHandler().getServletMappings();
+
+ //ServletSpec 3.0 p81 If a servlet already has url mappings from a
+ //descriptor the annotation is ignored
+ if (mappings == null && metaData.getOriginDescriptor(servletName+".servlet.mappings") != null)
+ {
+ ServletMapping mapping = new ServletMapping();
+ mapping.setServletName(servletName);
+ mapping.setPathSpecs(LazyList.toStringArray(urlPatternList));
+ _context.getServletHandler().addServletMapping(mapping);
+ }
+ }
+ }
+}
diff --git a/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotationHandler.java b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotationHandler.java
new file mode 100644
index 0000000000..41acd84312
--- /dev/null
+++ b/jetty-annotations/src/main/java/org/eclipse/jetty/annotations/WebServletAnnotationHandler.java
@@ -0,0 +1,66 @@
+// ========================================================================
+// Copyright (c) 2009 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.annotations;
+
+import java.util.List;
+
+import org.eclipse.jetty.annotations.AnnotationParser.DiscoverableAnnotationHandler;
+import org.eclipse.jetty.annotations.AnnotationParser.Value;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.webapp.DiscoveredAnnotation;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * WebServletAnnotationHandler
+ *
+ * Process a WebServlet annotation on a class.
+ *
+ */
+public class WebServletAnnotationHandler extends AbstractDiscoverableAnnotationHandler
+{
+
+ public WebServletAnnotationHandler (WebAppContext context)
+ {
+ super(context);
+ }
+
+
+ /**
+ * Handle discovering a WebServlet annotation.
+ *
+ *
+ * @see org.eclipse.jetty.annotations.AnnotationParser.DiscoverableAnnotationHandler#handleClass(java.lang.String, int, int, java.lang.String, java.lang.String, java.lang.String[], java.lang.String, java.util.List)
+ */
+ public void handleClass(String className, int version, int access, String signature, String superName, String[] interfaces, String annotationName,
+ List<Value> values)
+ {
+ if (!"javax.servlet.annotation.WebServlet".equals(annotationName))
+ return;
+
+ WebServletAnnotation annotation = new WebServletAnnotation (_context, className);
+ addAnnotation(annotation);
+ }
+
+ public void handleField(String className, String fieldName, int access, String fieldType, String signature, Object value, String annotation,
+ List<Value> values)
+ {
+ Log.warn ("@WebServlet annotation not supported for fields");
+ }
+
+ public void handleMethod(String className, String methodName, int access, String params, String signature, String[] exceptions, String annotation,
+ List<Value> values)
+ {
+ Log.warn ("@WebServlet annotation not supported for methods");
+ }
+}
diff --git a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/FilterC.java b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/FilterC.java
index 4c85ee713c..a065232200 100644
--- a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/FilterC.java
+++ b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/FilterC.java
@@ -18,16 +18,20 @@ import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.annotation.security.RunAs;
+import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
+@WebFilter(filterName="CFilter", dispatcherTypes={DispatcherType.REQUEST}, urlPatterns = {"/*"}, initParams={@WebInitParam(name="a", value="99")}, asyncSupported=false)
@RunAs("admin")
public class FilterC implements Filter
{
diff --git a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ListenerC.java b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ListenerC.java
index d839c47c71..29b041a495 100644
--- a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ListenerC.java
+++ b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ListenerC.java
@@ -14,7 +14,9 @@ package org.eclipse.jetty.annotations;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+@WebListener
public class ListenerC implements ServletContextListener
{
diff --git a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ServletC.java b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ServletC.java
index 87cad8bc60..781a4e0715 100644
--- a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ServletC.java
+++ b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/ServletC.java
@@ -20,6 +20,12 @@ import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RunAs;
import javax.servlet.ServletException;
+import javax.servlet.annotation.HttpConstraint;
+import javax.servlet.annotation.HttpMethodConstraint;
+import javax.servlet.annotation.MultipartConfig;
+import javax.servlet.annotation.ServletSecurity;
+import javax.servlet.annotation.WebInitParam;
+import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -27,7 +33,10 @@ import javax.servlet.http.HttpServletResponse;
@DeclareRoles({"alice"})
+@WebServlet(urlPatterns = { "/foo/*", "/bah/*" }, name="CServlet", initParams={@WebInitParam(name="x", value="y")}, loadOnStartup=2, asyncSupported=false)
+@MultipartConfig(fileSizeThreshold=1000, maxFileSize=2000, maxRequestSize=3000)
@RunAs("admin")
+@ServletSecurity(value=@HttpConstraint(rolesAllowed={"fred", "bill", "dorothy"}), httpMethodConstraints={@HttpMethodConstraint(value="GET", rolesAllowed={"bob", "carol", "ted"})})
public class ServletC extends HttpServlet
{
@Resource (mappedName="foo", type=Double.class)
diff --git a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestAnnotationConfiguration.java b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestAnnotationConfiguration.java
new file mode 100644
index 0000000000..e9bf229a03
--- /dev/null
+++ b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestAnnotationConfiguration.java
@@ -0,0 +1,53 @@
+// ========================================================================
+// Copyright (c) 2006-2009 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.annotations;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.webapp.FragmentDescriptor;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+/**
+ * TestAnnotationConfiguration
+ *
+ *
+ */
+public class TestAnnotationConfiguration extends TestCase
+{
+ public void testGetFragmentFromJar ()
+ throws Exception
+ {
+ String dir = System.getProperty("basedir", ".");
+ File file = new File(dir);
+ file=new File(file.getCanonicalPath());
+ URL url=file.toURL();
+
+ Resource jar1 = Resource.newResource(url+"file.jar");
+
+ AnnotationConfiguration config = new AnnotationConfiguration();
+ WebAppContext wac = new WebAppContext();
+
+ List<FragmentDescriptor> frags = new ArrayList<FragmentDescriptor>();
+ frags.add(new FragmentDescriptor(Resource.newResource("jar:"+url+"file.jar!/fooa.props")));
+ frags.add(new FragmentDescriptor(Resource.newResource("jar:"+url+"file2.jar!/foob.props")));
+
+ assertNotNull(config.getFragmentFromJar(jar1, frags));
+ }
+}
diff --git a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestAnnotationInheritance.java b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestAnnotationInheritance.java
index e7f482de01..7cfc0aafe4 100644
--- a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestAnnotationInheritance.java
+++ b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestAnnotationInheritance.java
@@ -13,20 +13,23 @@
package org.eclipse.jetty.annotations;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
import java.util.ArrayList;
import java.util.List;
-
+import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.eclipse.jetty.annotations.AnnotationParser.DiscoverableAnnotationHandler;
import org.eclipse.jetty.annotations.AnnotationParser.Value;
+import org.eclipse.jetty.util.MultiMap;
import org.junit.After;
import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
/**
*
*/
@@ -186,4 +189,40 @@ public class TestAnnotationInheritance
});
assertEquals (1, handler.annotatedClassNames.size());
}
+
+ @Test
+ public void testTypeInheritanceHandling() throws Exception
+ {
+ AnnotationParser parser = new AnnotationParser();
+ ClassInheritanceHandler handler = new ClassInheritanceHandler();
+ parser.registerClassHandler(handler);
+
+ class Foo implements InterfaceD
+ {
+ }
+
+ classNames.clear();
+ classNames.add(ClassA.class.getName());
+ classNames.add(ClassB.class.getName());
+ classNames.add(InterfaceD.class.getName());
+ classNames.add(Foo.class.getName());
+
+ parser.parse(classNames, null);
+
+ MultiMap map = handler.getMap();
+ assertNotNull(map);
+ assertFalse(map.isEmpty());
+ assertEquals(2, map.size());
+ Map stringArrayMap = map.toStringArrayMap();
+ assertTrue (stringArrayMap.keySet().contains("org.eclipse.jetty.annotations.ClassA"));
+ assertTrue (stringArrayMap.keySet().contains("org.eclipse.jetty.annotations.InterfaceD"));
+ String[] classes = (String[])stringArrayMap.get("org.eclipse.jetty.annotations.ClassA");
+ assertEquals(1, classes.length);
+ assertEquals ("org.eclipse.jetty.annotations.ClassB", classes[0]);
+
+ classes = (String[])stringArrayMap.get("org.eclipse.jetty.annotations.InterfaceD");
+ assertEquals(2, classes.length);
+ assertEquals ("org.eclipse.jetty.annotations.ClassB", classes[0]);
+ assertEquals(Foo.class.getName(), classes[1]);
+ }
}
diff --git a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestSecurityAnnotationConversions.java b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestSecurityAnnotationConversions.java
new file mode 100644
index 0000000000..beb2c4aacc
--- /dev/null
+++ b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestSecurityAnnotationConversions.java
@@ -0,0 +1,328 @@
+// ========================================================================
+// Copyright (c) 2009 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.annotations;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.annotation.ServletSecurity;
+import javax.servlet.annotation.HttpConstraint;
+import javax.servlet.annotation.HttpMethodConstraint;
+import javax.servlet.annotation.ServletSecurity.TransportGuarantee;
+import javax.servlet.annotation.ServletSecurity.EmptyRoleSemantic;
+import javax.servlet.http.HttpServlet;
+
+import org.eclipse.jetty.http.security.Constraint;
+import org.eclipse.jetty.security.ConstraintAware;
+import org.eclipse.jetty.security.ConstraintMapping;
+import org.eclipse.jetty.servlet.Holder;
+import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.servlet.ServletMapping;
+import org.eclipse.jetty.util.LazyList;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+import junit.framework.TestCase;
+
+public class TestSecurityAnnotationConversions extends TestCase
+{
+ @ServletSecurity(value=@HttpConstraint(value=EmptyRoleSemantic.DENY))
+ public static class DenyServlet extends HttpServlet
+ {}
+
+ @ServletSecurity
+ public static class PermitServlet extends HttpServlet
+ {}
+
+ @ServletSecurity(value=@HttpConstraint(value=EmptyRoleSemantic.PERMIT, transportGuarantee=TransportGuarantee.CONFIDENTIAL, rolesAllowed={"tom", "dick", "harry"}))
+ public static class RolesServlet extends HttpServlet
+ {}
+
+ @ServletSecurity(value=@HttpConstraint(value=EmptyRoleSemantic.PERMIT, transportGuarantee=TransportGuarantee.CONFIDENTIAL, rolesAllowed={"tom", "dick", "harry"}),
+ httpMethodConstraints={@HttpMethodConstraint(value="GET")})
+ public static class Method1Servlet extends HttpServlet
+ {}
+
+ @ServletSecurity(value=@HttpConstraint(value=EmptyRoleSemantic.PERMIT, transportGuarantee=TransportGuarantee.CONFIDENTIAL, rolesAllowed={"tom", "dick", "harry"}),
+ httpMethodConstraints={@HttpMethodConstraint(value="GET", transportGuarantee=TransportGuarantee.CONFIDENTIAL)})
+ public static class Method2Servlet extends HttpServlet
+ {}
+
+
+ public void setUp()
+ {
+ }
+
+ public void testDenyAllOnClass ()
+ throws Exception
+ {
+
+ WebAppContext wac = makeWebAppContext(DenyServlet.class.getCanonicalName(), "denyServlet", new String[]{"/foo/*", "*.foo"});
+
+ //Assume we found 1 servlet with a @HttpConstraint with value=EmptyRoleSemantic.DENY security annotation
+ ServletSecurityAnnotationHandler annotationHandler = new ServletSecurityAnnotationHandler(wac);
+ AnnotationIntrospector introspector = new AnnotationIntrospector();
+ introspector.registerHandler(annotationHandler);
+
+ //set up the expected outcomes:
+ //1 ConstraintMapping per ServletMapping pathSpec
+ Constraint expectedConstraint = new Constraint();
+ expectedConstraint.setAuthenticate(true);
+ expectedConstraint.setDataConstraint(Constraint.DC_NONE);
+
+ ConstraintMapping[] expectedMappings = new ConstraintMapping[2];
+
+ expectedMappings[0] = new ConstraintMapping();
+ expectedMappings[0].setConstraint(expectedConstraint);
+ expectedMappings[0].setPathSpec("/foo/*");
+
+ expectedMappings[1] = new ConstraintMapping();
+ expectedMappings[1].setConstraint(expectedConstraint);
+ expectedMappings[1].setPathSpec("*.foo");
+
+ introspector.introspect(DenyServlet.class);
+
+ compareResults(expectedMappings, ((ConstraintAware)wac.getSecurityHandler()).getConstraintMappings());
+ }
+
+
+ public void testPermitAll()
+ throws Exception
+ {
+ //Assume we found 1 servlet with a @ServletSecurity security annotation
+ WebAppContext wac = makeWebAppContext(PermitServlet.class.getCanonicalName(), "permitServlet", new String[]{"/foo/*", "*.foo"});
+
+ ServletSecurityAnnotationHandler annotationHandler = new ServletSecurityAnnotationHandler(wac);
+ AnnotationIntrospector introspector = new AnnotationIntrospector();
+ introspector.registerHandler(annotationHandler);
+
+
+ //set up the expected outcomes:
+ //1 ConstraintMapping per ServletMapping pathSpec
+ Constraint expectedConstraint = new Constraint();
+ expectedConstraint.setAuthenticate(false);
+ expectedConstraint.setDataConstraint(Constraint.DC_NONE);
+
+ ConstraintMapping[] expectedMappings = new ConstraintMapping[2];
+ expectedMappings[0] = new ConstraintMapping();
+ expectedMappings[0].setConstraint(expectedConstraint);
+ expectedMappings[0].setPathSpec("/foo/*");
+
+ expectedMappings[1] = new ConstraintMapping();
+ expectedMappings[1].setConstraint(expectedConstraint);
+ expectedMappings[1].setPathSpec("*.foo");
+
+ introspector.introspect(PermitServlet.class);
+
+ compareResults (expectedMappings, ((ConstraintAware)wac.getSecurityHandler()).getConstraintMappings());
+ }
+
+ public void testRolesAllowedWithTransportGuarantee ()
+ throws Exception
+ {
+ //Assume we found 1 servlet with annotation with roles defined and
+ //and a TransportGuarantee
+
+ WebAppContext wac = makeWebAppContext(RolesServlet.class.getCanonicalName(), "rolesServlet", new String[]{"/foo/*", "*.foo"});
+
+ ServletSecurityAnnotationHandler annotationHandler = new ServletSecurityAnnotationHandler(wac);
+ AnnotationIntrospector introspector = new AnnotationIntrospector();
+ introspector.registerHandler(annotationHandler);
+
+ //set up the expected outcomes:compareResults
+ //1 ConstraintMapping per ServletMapping
+ Constraint expectedConstraint = new Constraint();
+ expectedConstraint.setAuthenticate(true);
+ expectedConstraint.setRoles(new String[]{"tom", "dick", "harry"});
+ expectedConstraint.setDataConstraint(Constraint.DC_CONFIDENTIAL);
+
+ ConstraintMapping[] expectedMappings = new ConstraintMapping[2];
+ expectedMappings[0] = new ConstraintMapping();
+ expectedMappings[0].setConstraint(expectedConstraint);
+ expectedMappings[0].setPathSpec("/foo/*");
+
+ expectedMappings[1] = new ConstraintMapping();
+ expectedMappings[1].setConstraint(expectedConstraint);
+ expectedMappings[1].setPathSpec("*.foo");
+
+ introspector.introspect(RolesServlet.class);
+ compareResults (expectedMappings, ((ConstraintAware)wac.getSecurityHandler()).getConstraintMappings());
+ }
+
+
+ public void testMethodAnnotation ()
+ throws Exception
+ {
+ //ServletSecurity annotation with HttpConstraint of TransportGuarantee.CONFIDENTIAL, and a list of rolesAllowed, and
+ //a HttpMethodConstraint for GET method that permits all and has TransportGuarantee.NONE (ie is default)
+
+ WebAppContext wac = makeWebAppContext(Method1Servlet.class.getCanonicalName(), "method1Servlet", new String[]{"/foo/*", "*.foo"});
+
+ //set up the expected outcomes: - a Constraint for the RolesAllowed on the class
+ //with userdata constraint of DC_CONFIDENTIAL
+ //and mappings for each of the pathSpecs
+ Constraint expectedConstraint1 = new Constraint();
+ expectedConstraint1.setAuthenticate(true);
+ expectedConstraint1.setRoles(new String[]{"tom", "dick", "harry"});
+ expectedConstraint1.setDataConstraint(Constraint.DC_CONFIDENTIAL);
+
+ //a Constraint for the PermitAll on the doGet method with a userdata
+ //constraint of DC_CONFIDENTIAL inherited from the class
+ Constraint expectedConstraint2 = new Constraint();
+ expectedConstraint2.setDataConstraint(Constraint.DC_NONE);
+
+ ConstraintMapping[] expectedMappings = new ConstraintMapping[4];
+ expectedMappings[0] = new ConstraintMapping();
+ expectedMappings[0].setConstraint(expectedConstraint1);
+ expectedMappings[0].setPathSpec("/foo/*");
+ expectedMappings[0].setMethodOmissions(new String[]{"GET"});
+ expectedMappings[1] = new ConstraintMapping();
+ expectedMappings[1].setConstraint(expectedConstraint1);
+ expectedMappings[1].setPathSpec("*.foo");
+ expectedMappings[1].setMethodOmissions(new String[]{"GET"});
+
+ expectedMappings[2] = new ConstraintMapping();
+ expectedMappings[2].setConstraint(expectedConstraint2);
+ expectedMappings[2].setPathSpec("/foo/*");
+ expectedMappings[2].setMethod("GET");
+ expectedMappings[3] = new ConstraintMapping();
+ expectedMappings[3].setConstraint(expectedConstraint2);
+ expectedMappings[3].setPathSpec("*.foo");
+ expectedMappings[3].setMethod("GET");
+
+ AnnotationIntrospector introspector = new AnnotationIntrospector();
+ ServletSecurityAnnotationHandler annotationHandler = new ServletSecurityAnnotationHandler(wac);
+ introspector.registerHandler(annotationHandler);
+ introspector.introspect(Method1Servlet.class);
+ compareResults (expectedMappings, ((ConstraintAware)wac.getSecurityHandler()).getConstraintMappings());
+ }
+
+ public void testMethodAnnotation2 ()
+ throws Exception
+ {
+ //A ServletSecurity annotation that has HttpConstraint of CONFIDENTIAL with defined roles, but a
+ //HttpMethodConstraint for GET that permits all, but also requires CONFIDENTIAL
+ WebAppContext wac = makeWebAppContext(Method2Servlet.class.getCanonicalName(), "method2Servlet", new String[]{"/foo/*", "*.foo"});
+
+ AnnotationIntrospector introspector = new AnnotationIntrospector();
+ ServletSecurityAnnotationHandler annotationHandler = new ServletSecurityAnnotationHandler(wac);
+ introspector.registerHandler(annotationHandler);
+
+ //set up the expected outcomes: - a Constraint for the RolesAllowed on the class
+ //with userdata constraint of DC_CONFIDENTIAL
+ //and mappings for each of the pathSpecs
+ Constraint expectedConstraint1 = new Constraint();
+ expectedConstraint1.setAuthenticate(true);
+ expectedConstraint1.setRoles(new String[]{"tom", "dick", "harry"});
+ expectedConstraint1.setDataConstraint(Constraint.DC_CONFIDENTIAL);
+
+ //a Constraint for the Permit on the GET method with a userdata
+ //constraint of DC_CONFIDENTIAL
+ Constraint expectedConstraint2 = new Constraint();
+ expectedConstraint2.setDataConstraint(Constraint.DC_CONFIDENTIAL);
+
+ ConstraintMapping[] expectedMappings = new ConstraintMapping[4];
+ expectedMappings[0] = new ConstraintMapping();
+ expectedMappings[0].setConstraint(expectedConstraint1);
+ expectedMappings[0].setPathSpec("/foo/*");
+ expectedMappings[0].setMethodOmissions(new String[]{"GET"});
+ expectedMappings[1] = new ConstraintMapping();
+ expectedMappings[1].setConstraint(expectedConstraint1);
+ expectedMappings[1].setPathSpec("*.foo");
+ expectedMappings[1].setMethodOmissions(new String[]{"GET"});
+
+ expectedMappings[2] = new ConstraintMapping();
+ expectedMappings[2].setConstraint(expectedConstraint2);
+ expectedMappings[2].setPathSpec("/foo/*");
+ expectedMappings[2].setMethod("GET");
+ expectedMappings[3] = new ConstraintMapping();
+ expectedMappings[3].setConstraint(expectedConstraint2);
+ expectedMappings[3].setPathSpec("*.foo");
+ expectedMappings[3].setMethod("GET");
+
+ introspector.introspect(Method2Servlet.class);
+ compareResults (expectedMappings, ((ConstraintAware)wac.getSecurityHandler()).getConstraintMappings());
+ }
+
+ private void compareResults (ConstraintMapping[] expectedMappings, List<ConstraintMapping> actualMappings)
+ {
+ assertNotNull(actualMappings);
+ assertEquals(expectedMappings.length, actualMappings.size());
+
+ for (int k=0; k < actualMappings.size(); k++)
+ {
+ ConstraintMapping am = actualMappings.get(k);
+ boolean matched = false;
+
+ for (int i=0; i< expectedMappings.length && !matched; i++)
+ {
+ ConstraintMapping em = expectedMappings[i];
+ if (em.getPathSpec().equals(am.getPathSpec()))
+ {
+ if ((em.getMethod()==null && am.getMethod() == null) || em.getMethod() != null && em.getMethod().equals(am.getMethod()))
+ {
+ matched = true;
+
+ assertEquals(em.getConstraint().getAuthenticate(), am.getConstraint().getAuthenticate());
+ assertEquals(em.getConstraint().getDataConstraint(), am.getConstraint().getDataConstraint());
+ if (em.getMethodOmissions() == null)
+ {
+ assertNull(am.getMethodOmissions());
+ }
+ else
+ {
+ assertTrue(Arrays.equals(am.getMethodOmissions(), em.getMethodOmissions()));
+ }
+
+ if (em.getConstraint().getRoles() == null)
+ {
+ assertNull(am.getConstraint().getRoles());
+ }
+ else
+ {
+ assertTrue(Arrays.equals(em.getConstraint().getRoles(), am.getConstraint().getRoles()));
+ }
+ }
+ }
+ }
+
+ if (!matched)
+ fail("No expected ConstraintMapping matching method:"+am.getMethod()+" pathSpec: "+am.getPathSpec());
+ }
+ }
+
+
+ private WebAppContext makeWebAppContext (String className, String servletName, String[] paths)
+ {
+ WebAppContext wac = new WebAppContext();
+
+ ServletHolder[] holders = new ServletHolder[1];
+ holders[0] = new ServletHolder();
+ holders[0].setClassName(className);
+ holders[0].setName(servletName);
+ holders[0].setServletHandler(wac.getServletHandler());
+ wac.getServletHandler().setServlets(holders);
+ wac.setSecurityHandler(new ConstraintSecurityHandler());
+
+ ServletMapping[] servletMappings = new ServletMapping[1];
+ servletMappings[0] = new ServletMapping();
+
+ servletMappings[0].setPathSpecs(paths);
+ servletMappings[0].setServletName(servletName);
+ wac.getServletHandler().setServletMappings(servletMappings);
+ return wac;
+ }
+}
diff --git a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestServletAnnotations.java b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestServletAnnotations.java
index ef875f9614..9dc25abda1 100644
--- a/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestServletAnnotations.java
+++ b/jetty-annotations/src/test/java/org/eclipse/jetty/annotations/TestServletAnnotations.java
@@ -1,5 +1,5 @@
// ========================================================================
-//Copyright (c) 2006-2009 Mort Bay Consulting Pty. Ltd.
+// Copyright (c) 2006-2009 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
@@ -13,12 +13,19 @@
package org.eclipse.jetty.annotations;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.List;
import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.servlet.ServletMapping;
import org.eclipse.jetty.webapp.WebAppContext;
import org.junit.Test;
@@ -29,8 +36,50 @@ import org.junit.Test;
*/
public class TestServletAnnotations
{
-
@Test
+ public void testServletAnnotation() throws Exception
+ {
+ List<String> classes = new ArrayList<String>();
+ classes.add("org.eclipse.jetty.annotations.ServletC");
+ AnnotationParser parser = new AnnotationParser();
+
+ WebAppContext wac = new WebAppContext();
+ WebServletAnnotationHandler handler = new WebServletAnnotationHandler(wac);
+ parser.registerAnnotationHandler("javax.servlet.annotation.WebServlet", handler);
+
+ parser.parse(classes, new ClassNameResolver ()
+ {
+ public boolean isExcluded(String name)
+ {
+ return false;
+ }
+
+ public boolean shouldOverride(String name)
+ {
+ return false;
+ }
+ });
+
+ assertEquals(1, handler.getAnnotationList().size());
+ assertTrue(handler.getAnnotationList().get(0) instanceof WebServletAnnotation);
+
+ handler.getAnnotationList().get(0).apply();
+
+ ServletHolder[] holders = wac.getServletHandler().getServlets();
+ assertNotNull(holders);
+ assertEquals(1, holders.length);
+ assertEquals("CServlet", holders[0].getName());
+ ServletMapping[] mappings = wac.getServletHandler().getServletMappings();
+ assertNotNull(mappings);
+ assertEquals(1, mappings.length);
+ String[] paths = mappings[0].getPathSpecs();
+ assertNotNull(paths);
+ assertEquals(2, paths.length);
+ assertEquals("y", holders[0].getInitParameter("x"));
+ assertEquals(2,holders[0].getInitOrder());
+ assertFalse(holders[0].isAsyncSupported());
+ }
+
public void testDeclareRoles ()
throws Exception
{
diff --git a/jetty-client/pom.xml b/jetty-client/pom.xml
index bbdd6ff8ee..4f89626757 100644
--- a/jetty-client/pom.xml
+++ b/jetty-client/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/TimeoutExchangeTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/TimeoutExchangeTest.java
index 50ea494b77..24ef85604f 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/TimeoutExchangeTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/TimeoutExchangeTest.java
@@ -16,11 +16,13 @@ package org.eclipse.jetty.client;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import junit.framework.Assert;
+
import org.eclipse.jetty.http.HttpMethods;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.io.ByteArrayBuffer;
diff --git a/jetty-continuation/pom.xml b/jetty-continuation/pom.xml
index 6eaa346aec..1765ed8a25 100644
--- a/jetty-continuation/pom.xml
+++ b/jetty-continuation/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-continuation</artifactId>
@@ -64,11 +64,11 @@
</build>
<dependencies>
<dependency>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>servlet-api</artifactId>
- <version>3.0.20100224</version>
- <scope>provided</scope>
- </dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <version>${servlet.spec.version}</version>
+ <scope>provided</scope>
+ </dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
diff --git a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationSupport.java b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationSupport.java
index a6bc9286e7..6a90a5ad3c 100644
--- a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationSupport.java
+++ b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/ContinuationSupport.java
@@ -36,7 +36,7 @@ public class ContinuationSupport
static
{
boolean servlet3Support=false;
- Constructor<? extends Continuation>s3cc=null;
+ Constructor<?>s3cc=null;
try
{
boolean servlet3=ServletRequest.class.getMethod("startAsync")!=null;
@@ -52,11 +52,11 @@ public class ContinuationSupport
finally
{
__servlet3=servlet3Support;
- __newServlet3Continuation=s3cc;
+ __newServlet3Continuation=(Constructor<? extends Continuation>)s3cc;
}
boolean jetty6Support=false;
- Constructor<? extends Continuation>j6cc=null;
+ Constructor<?>j6cc=null;
try
{
Class<?> jetty6ContinuationClass = ContinuationSupport.class.getClassLoader().loadClass("org.mortbay.util.ajax.Continuation");
@@ -73,7 +73,7 @@ public class ContinuationSupport
finally
{
__jetty6=jetty6Support;
- __newJetty6Continuation=j6cc;
+ __newJetty6Continuation=(Constructor<? extends Continuation>)j6cc;
}
Class<?> waiting=null;
diff --git a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/FauxContinuation.java b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/FauxContinuation.java
index cede7e22af..51cc48e68c 100644
--- a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/FauxContinuation.java
+++ b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/FauxContinuation.java
@@ -500,4 +500,4 @@ class FauxContinuation implements FilteredContinuation
throw new IllegalStateException("!suspended");
}
-} \ No newline at end of file
+}
diff --git a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Servlet3Continuation.java b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Servlet3Continuation.java
index e4bca0be20..9486b725ad 100644
--- a/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Servlet3Continuation.java
+++ b/jetty-continuation/src/main/java/org/eclipse/jetty/continuation/Servlet3Continuation.java
@@ -59,6 +59,7 @@ public class Servlet3Continuation implements Continuation
public void onTimeout(AsyncEvent event) throws IOException
{
_initial=false;
+ System.err.println("Doing dispatch on timed out continuation for "+_request.getAttribute("FOO"));
event.getAsyncContext().dispatch();
}
});
diff --git a/jetty-deploy/pom.xml b/jetty-deploy/pom.xml
index 7374354892..2f084f6d90 100644
--- a/jetty-deploy/pom.xml
+++ b/jetty-deploy/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-deploy</artifactId>
diff --git a/jetty-deploy/src/main/config/etc/jetty-deploy.xml b/jetty-deploy/src/main/config/etc/jetty-deploy.xml
index ebbec50932..1b3fd66dcd 100644
--- a/jetty-deploy/src/main/config/etc/jetty-deploy.xml
+++ b/jetty-deploy/src/main/config/etc/jetty-deploy.xml
@@ -22,7 +22,7 @@
</Set>
<Call name="setContextAttribute">
<Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg>
- <Arg>.*/jsp-api-[^/]*\.jar$|.*/jsp-[^/]*\.jar$</Arg>
+ <Arg>.*/servlet-api-[^/]*\.jar$</Arg>
</Call>
diff --git a/jetty-distribution/pom.xml b/jetty-distribution/pom.xml
index 4ffb8049ba..4e7b333315 100644
--- a/jetty-distribution/pom.xml
+++ b/jetty-distribution/pom.xml
@@ -3,7 +3,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>jetty-distribution</artifactId>
<name>Jetty :: Distribution Assemblies</name>
@@ -12,18 +12,18 @@
<jetty-orbit-url>http://download.eclipse.org/jetty/orbit</jetty-orbit-url>
<assembly-directory>target/distribution</assembly-directory>
<eclipse-ecj-version>3.6</eclipse-ecj-version>
- <orbit-javax-activation-version>${javax-activation-version}.0.v201005080500</orbit-javax-activation-version>
- <orbit-javax-annotation-version>1.0.0.v20100513-0750</orbit-javax-annotation-version>
- <orbit-javax-el-version>2.1.0.v201004190952</orbit-javax-el-version>
+ <orbit-javax-activation-version>${javax-activation-version}.0.v201105071233</orbit-javax-activation-version>
+ <orbit-javax-annotation-version>1.1.0.v201105051105</orbit-javax-annotation-version>
+ <orbit-javax-el-version>2.2.0.v201105051105</orbit-javax-el-version>
<orbit-javax-mail-glassfish-version>${javax-mail-version}.v201005082020</orbit-javax-mail-glassfish-version>
- <orbit-javax-servlet-version>2.5.0.v200910301333</orbit-javax-servlet-version>
- <orbit-javax-servlet-jsp-version>2.1.0.v201004190952</orbit-javax-servlet-jsp-version>
+ <orbit-javax-servlet-version>3.0.0.v201103241727</orbit-javax-servlet-version>
+ <orbit-javax-servlet-jsp-version>2.2.0.v201103241009</orbit-javax-servlet-jsp-version>
<orbit-javax-servlet-jsp-jstl-version>1.2.0.v201004190952</orbit-javax-servlet-jsp-jstl-version>
- <orbit-com-sun-el-version>1.0.0.v201004190952</orbit-com-sun-el-version>
- <orbit-org-apache-jasper-version>2.1.0.v201007080150</orbit-org-apache-jasper-version>
+ <orbit-com-sun-el-version>2.2.0.v201105051105</orbit-com-sun-el-version>
<orbit-org-apache-taglibs-standard-version>1.2.0.v201004190952</orbit-org-apache-taglibs-standard-version>
- <orbit-org-objectweb-asm-version>3.1.0.v200803061910</orbit-org-objectweb-asm-version>
+ <orbit-org-objectweb-asm-version>3.3.1.v201101071600</orbit-org-objectweb-asm-version>
<orbit-javax-transaction-version>1.1.1.v201004190952</orbit-javax-transaction-version>
+ <!-- >orbit-org-apache-jasper-version>2.1.0.v201007080150</orbit-org-apache-jasper-version -->
</properties>
<build>
<plugins>
@@ -76,19 +76,17 @@
<url url="${jetty-orbit-url}/javax.servlet.jsp_${orbit-javax-servlet-jsp-version}.jar" />
<url url="${jetty-orbit-url}/javax.servlet.jsp.jstl_${orbit-javax-servlet-jsp-jstl-version}.jar" />
<url url="${jetty-orbit-url}/com.sun.el_${orbit-com-sun-el-version}.jar" />
- <url url="${jetty-orbit-url}/org.apache.jasper.glassfish_${orbit-org-apache-jasper-version}.jar" />
+ <!-- url url="${jetty-orbit-url}/org.apache.jasper.glassfish_${orbit-org-apache-jasper-version}.jar" / -->
<url url="${jetty-orbit-url}/org.apache.taglibs.standard.glassfish_${orbit-org-apache-taglibs-standard-version}.jar" />
<url url="${jetty-orbit-url}/org.objectweb.asm_${orbit-org-objectweb-asm-version}.jar" />
<url url="${jetty-orbit-url}/javax.transaction_${orbit-javax-transaction-version}.jar" />
- <url url="${jetty-orbit-url}/ecj-${eclipse-ecj-version}.jar" />
</get>
<!-- Step 2: copy the orbit artifact from orbit-cache to the appropriate lib directory -->
<!-- ${jetty.home}/lib/ -->
<mkdir dir="${assembly-directory}/lib" />
- <copy file="${orbit-cache}/javax.servlet_${orbit-javax-servlet-version}.jar" tofile="${assembly-directory}/lib/servlet-api-2.5.jar" />
-
+
<!-- ${jetty.home}/lib/annotations/ -->
<mkdir dir="${assembly-directory}/lib/annotations" />
<copy todir="${assembly-directory}/lib/annotations">
@@ -123,12 +121,10 @@
<include name="javax.servlet.jsp_${orbit-javax-servlet-jsp-version}.jar" />
<include name="javax.servlet.jsp.jstl_${orbit-javax-servlet-jsp-jstl-version}.jar" />
<include name="com.sun.el_${orbit-com-sun-el-version}.jar" />
- <include name="org.apache.jasper.glassfish_${orbit-org-apache-jasper-version}.jar" />
<include name="org.apache.taglibs.standard.glassfish_${orbit-org-apache-taglibs-standard-version}.jar" />
- <include name="ecj-${eclipse-ecj-version}.jar" />
+ <!-- include name="org.apache.jasper.glassfish_${orbit-org-apache-jasper-version}.jar" / -->
</fileset>
</copy>
-
<copy file="../VERSION.txt" todir="${assembly-directory}" />
<chmod dir="${assembly-directory}/bin" perm="755" includes="**/*.sh" />
</tasks>
@@ -490,8 +486,18 @@
<destFileName>start.jar</destFileName>
</artifactItem>
<artifactItem>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <version>${servlet.spec.version}</version>
+ <type>jar</type>
+ <overWrite>true</overWrite>
+ <includes>**</includes>
+ <outputDirectory>${assembly-directory}/lib</outputDirectory>
+ <destFileName>servlet-api-3.0.jar</destFileName>
+ </artifactItem>
+ <artifactItem>
<groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
+ <artifactId>jetty-overlay-deployer</artifactId>
<version>${project.version}</version>
<type>jar</type>
<overWrite>true</overWrite>
@@ -509,11 +515,20 @@
</artifactItem>
<artifactItem>
<groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jsp-2.1</artifactId>
+ <artifactId>jetty-websocket</artifactId>
<version>${project.version}</version>
<type>jar</type>
<overWrite>true</overWrite>
<includes>**</includes>
+ <outputDirectory>${assembly-directory}/lib</outputDirectory>
+ </artifactItem>
+ <artifactItem>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jsp-impl</artifactId>
+ <version>2.2.2.b05.0</version>
+ <type>jar</type>
+ <overWrite>true</overWrite>
+ <includes>**/**</includes>
<outputDirectory>${assembly-directory}/lib/jsp</outputDirectory>
</artifactItem>
</artifactItems>
@@ -621,8 +636,13 @@
<version>${project.version}</version>
</dependency>
<dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <version>${servlet.spec.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
+ <artifactId>jetty-overlay-deployer</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
@@ -632,8 +652,13 @@
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jsp-2.1</artifactId>
+ <artifactId>jetty-websocket</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jsp-impl</artifactId>
+ <version>2.2.2.b05.0</version>
+ </dependency>
</dependencies>
</project>
diff --git a/jetty-http/pom.xml b/jetty-http/pom.xml
index 680e118b67..ba6abb7f21 100644
--- a/jetty-http/pom.xml
+++ b/jetty-http/pom.xml
@@ -2,7 +2,7 @@
<parent>
<artifactId>jetty-project</artifactId>
<groupId>org.eclipse.jetty</groupId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty</groupId>
diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java
index 472ce5785c..0eeaa86791 100644
--- a/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java
+++ b/jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java
@@ -18,10 +18,12 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
+import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.GregorianCalendar;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -313,6 +315,23 @@ public class HttpFields
/* -------------------------------------------------------------- */
/**
+ * Get Collection of header names.
+ */
+ public Collection<String> getFieldNamesCollection()
+ {
+ final List<String> list = new ArrayList<String>(_fields.size());
+ final int revision=_revision;
+
+ for (Field f : _fields)
+ {
+ if (f!=null && f._prev==null && f._revision==revision)
+ list.add(BufferUtil.to8859_1_String(f._name));
+ }
+ return list;
+ }
+
+ /* -------------------------------------------------------------- */
+ /**
* Get enumeration of header _names. Returns an enumeration of strings representing the header
* _names for this request.
*/
@@ -442,6 +461,32 @@ public class HttpFields
return null;
}
+
+ /* -------------------------------------------------------------- */
+ /**
+ * Get multi headers
+ *
+ * @return Enumeration of the values, or null if no such header.
+ * @param name the case-insensitive field name
+ */
+ public Collection<String> getValuesCollection(String name)
+ {
+ Field field = getField(name);
+ if (field==null)
+ return null;
+
+ final int revision=_revision;
+ final List<String> list = new ArrayList<String>();
+
+ while(field!=null)
+ {
+ if (field._revision==revision)
+ list.add(field.getValue());
+ field=field._next;
+ }
+ return list;
+ }
+
/* -------------------------------------------------------------- */
/**
* Get multi headers
@@ -1532,5 +1577,4 @@ public class HttpFields
return ("[" + (_prev == null ? "" : "<-") + getName() + "="+_revision+"=" + _value + (_next == null ? "" : "->") + "]");
}
}
-
}
diff --git a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java
index 46841564da..59cad4627d 100644
--- a/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java
+++ b/jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java
@@ -49,7 +49,7 @@ public class HttpGeneratorClientTest
generator.completeHeader(fields,false);
- generator.addContent(new ByteArrayBuffer(content).asMutableBuffer(),true);
+ generator.addContent(new ByteArrayBuffer(content),true);
generator.flushBuffer();
generator.complete();
generator.flushBuffer();
@@ -74,7 +74,7 @@ public class HttpGeneratorClientTest
String content = "The quick brown fox jumped over the lazy dog";
- generator.addContent(new ByteArrayBuffer(content).asMutableBuffer(),true);
+ generator.addContent(new ByteArrayBuffer(content),true);
generator.completeHeader(fields,true);
generator.flushBuffer();
@@ -103,7 +103,7 @@ public class HttpGeneratorClientTest
generator.completeHeader(fields,false);
- generator.addContent(new ByteArrayBuffer(content).asMutableBuffer(),false);
+ generator.addContent(new ByteArrayBuffer(content),false);
generator.flushBuffer();
generator.complete();
generator.flushBuffer();
diff --git a/jetty-io/pom.xml b/jetty-io/pom.xml
index e0c8e3799d..ee872322f4 100644
--- a/jetty-io/pom.xml
+++ b/jetty-io/pom.xml
@@ -2,7 +2,7 @@
<parent>
<artifactId>jetty-project</artifactId>
<groupId>org.eclipse.jetty</groupId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty</groupId>
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractBuffer.java
index a1348e0f81..d322928675 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractBuffer.java
@@ -26,8 +26,6 @@ import org.eclipse.jetty.util.log.Log;
*/
public abstract class AbstractBuffer implements Buffer
{
- private final static boolean __boundsChecking = Boolean.getBoolean("org.eclipse.jetty.io.AbstractBuffer.boundsChecking");
-
protected final static String
__IMMUTABLE = "IMMUTABLE",
__READONLY = "READONLY",
@@ -497,43 +495,37 @@ public abstract class AbstractBuffer implements Buffer
public void setGetIndex(int getIndex)
{
- /* bounds checking */
- if (__boundsChecking)
- {
- if (isImmutable())
- throw new IllegalStateException(__IMMUTABLE);
- if (getIndex < 0)
- throw new IllegalArgumentException("getIndex<0: " + getIndex + "<0");
- if (getIndex > putIndex())
- throw new IllegalArgumentException("getIndex>putIndex: " + getIndex + ">" + putIndex());
- }
-
+ /* bounds checking
+ if (isImmutable())
+ throw new IllegalStateException(__IMMUTABLE);
+ if (getIndex < 0)
+ throw new IllegalArgumentException("getIndex<0: " + getIndex + "<0");
+ if (getIndex > putIndex())
+ throw new IllegalArgumentException("getIndex>putIndex: " + getIndex + ">" + putIndex());
+ */
_get = getIndex;
_hash=0;
}
public void setMarkIndex(int index)
{
-
+ /*
if (index>=0 && isImmutable())
throw new IllegalStateException(__IMMUTABLE);
-
+ */
_mark = index;
}
public void setPutIndex(int putIndex)
{
- if (__boundsChecking)
- {
- /* bounds checking */
- if (isImmutable())
- throw new IllegalStateException(__IMMUTABLE);
- if (putIndex > capacity())
+ /* bounds checking
+ if (isImmutable())
+ throw new IllegalStateException(__IMMUTABLE);
+ if (putIndex > capacity())
throw new IllegalArgumentException("putIndex>capacity: " + putIndex + ">" + capacity());
- if (getIndex() > putIndex)
+ if (getIndex() > putIndex)
throw new IllegalArgumentException("getIndex>putIndex: " + getIndex() + ">" + putIndex);
- }
-
+ */
_put = putIndex;
_hash=0;
}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayBuffer.java
index c868b31165..6dea1974bd 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayBuffer.java
@@ -370,8 +370,7 @@ public class ByteArrayBuffer extends AbstractBuffer
throws IOException
{
out.write(_bytes,getIndex(),length());
- if (!isImmutable())
- clear();
+ clear();
}
/* ------------------------------------------------------------ */
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java
index fcae2f99fd..5e56b2414f 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteArrayEndPoint.java
@@ -246,8 +246,7 @@ public class ByteArrayEndPoint implements ConnectedEndPoint
}
}
int len = _out.put(buffer);
- if (!buffer.isImmutable())
- buffer.skip(len);
+ buffer.skip(len);
return len;
}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedIOException.java b/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedIOException.java
new file mode 100644
index 0000000000..34d67804f2
--- /dev/null
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedIOException.java
@@ -0,0 +1,43 @@
+// ========================================================================
+// Copyright (c) 2009-2009 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.io;
+
+/* ------------------------------------------------------------ */
+/**
+ * Subclass of {@link java.lang.RuntimeException} used to signal that there
+ * was an {@link java.io.IOException} thrown by underlying {@link UncheckedPrintWriter}
+ */
+public class UncheckedIOException extends RuntimeException
+{
+ public UncheckedIOException()
+ {
+ super();
+ }
+
+ public UncheckedIOException(String message)
+ {
+ super(message);
+ }
+
+ public UncheckedIOException(Throwable cause)
+ {
+ super(cause);
+ }
+
+ public UncheckedIOException(String message, Throwable cause)
+ {
+ super(message,cause);
+ }
+}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedPrintWriter.java b/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedPrintWriter.java
index 7be12a17d1..13c1d77f89 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedPrintWriter.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/UncheckedPrintWriter.java
@@ -104,7 +104,7 @@ public class UncheckedPrintWriter extends PrintWriter
{
setError();
if (_throwUnchecked)
- throw new RuntimeIOException(th);
+ throw new UncheckedIOException(th);
Log.debug(th);
}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/bio/StreamEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/bio/StreamEndPoint.java
index 51cec50a65..fde7272eb7 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/bio/StreamEndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/bio/StreamEndPoint.java
@@ -149,8 +149,7 @@ public class StreamEndPoint implements EndPoint
int length=buffer.length();
if (length>0)
buffer.writeTo(_out);
- if (!buffer.isImmutable())
- buffer.clear();
+ buffer.clear();
return length;
}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/nio/ChannelEndPoint.java b/jetty-io/src/main/java/org/eclipse/jetty/io/nio/ChannelEndPoint.java
index 707b67d06a..decf75d076 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/nio/ChannelEndPoint.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/nio/ChannelEndPoint.java
@@ -348,6 +348,12 @@ public class ChannelEndPoint implements EndPoint
}
finally
{
+ // adjust buffer 0 and 1
+ if (!header.isImmutable())
+ header.setGetIndex(bbuf0.position());
+ if (!buffer.isImmutable())
+ buffer.setGetIndex(bbuf1.position());
+
bbuf0.position(0);
bbuf1.position(0);
bbuf0.limit(bbuf0.capacity());
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/nio/IndirectNIOBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/nio/IndirectNIOBuffer.java
index 62596bb216..9dec71a569 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/nio/IndirectNIOBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/nio/IndirectNIOBuffer.java
@@ -37,10 +37,8 @@ public class IndirectNIOBuffer extends ByteArrayBuffer implements NIOBuffer
if (buffer.isDirect())
throw new IllegalArgumentException();
_buf = buffer;
- _get=buffer.position();
- _put=buffer.limit();
- buffer.position(0);
- buffer.limit(buffer.capacity());
+ setGetIndex(buffer.position());
+ setPutIndex(buffer.limit());
_bytes=_buf.array();
}
diff --git a/jetty-jaspi/pom.xml b/jetty-jaspi/pom.xml
index 35af61d65e..ee5d6b7c05 100644
--- a/jetty-jaspi/pom.xml
+++ b/jetty-jaspi/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-jaspi</artifactId>
@@ -46,20 +46,6 @@
</plugin>
</plugins>
</build>
- <repositories>
- <repository>
- <id>repository.apache.org</id>
- <name>Apache Snapshot Repository</name>
- <layout>default</layout>
- <url>http://repository.apache.org/content/groups/snapshots/</url>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- <releases>
- <enabled>false</enabled>
- </releases>
- </repository>
- </repositories>
<dependencies>
<dependency>
diff --git a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/SimpleAuthConfig.java b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/SimpleAuthConfig.java
index 1793ec83f8..0eb96bed74 100644
--- a/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/SimpleAuthConfig.java
+++ b/jetty-jaspi/src/main/java/org/eclipse/jetty/security/jaspi/SimpleAuthConfig.java
@@ -65,7 +65,7 @@ public class SimpleAuthConfig implements ServerAuthConfig
return true;
}
- public void refresh()
+ public void refresh()
{
}
}
diff --git a/jetty-jmx/pom.xml b/jetty-jmx/pom.xml
index 9907a3c581..12fd0c3074 100644
--- a/jetty-jmx/pom.xml
+++ b/jetty-jmx/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-jmx</artifactId>
diff --git a/jetty-jndi/pom.xml b/jetty-jndi/pom.xml
index d271091564..cb8e0e9c47 100644
--- a/jetty-jndi/pom.xml
+++ b/jetty-jndi/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-jndi</artifactId>
diff --git a/jetty-jsp-2.1/pom.xml b/jetty-jsp-2.1/pom.xml
deleted file mode 100644
index b1d6d8086d..0000000000
--- a/jetty-jsp-2.1/pom.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <parent>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>jetty-jsp-2.1</artifactId>
- <name>Jetty :: Jetty JSP Additions</name>
- <description>Additions to Jasper implementation from Glassfish</description>
- <properties>
- <bundle-symbolic-name>${project.groupId}.jsp-2.1</bundle-symbolic-name>
- </properties>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <executions>
- <execution>
- <goals>
- <goal>manifest</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <instructions>
- <Import-Package>
- com.sun.org.apache.commons.logging;version="[2.1,3)";glassfish="split",
- *
- </Import-Package>
- <Export-Package>org.eclipse.jetty*;version="${parsedVersion.osgiVersion}"</Export-Package>
- <Fragment-Host>org.apache.jasper.glassfish</Fragment-Host>
- <!-- disable the uses directive: we don't want to fore eeryone that uses us to
- have to depend on com.sun.org.apache.commons.logging provided by jasper-glassfish. -->
- <_nouses>true</_nouses>
- </instructions>
- </configuration>
- </plugin>
- <plugin>
- <!--
- Required for OSGI
- -->
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <configuration>
- <archive>
- <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>findbugs-maven-plugin</artifactId>
- <configuration>
- <onlyAnalyze>org.eclipse.jetty.jsp.*</onlyAnalyze>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jsp-2.1-glassfish</artifactId>
- <version>${javax-servlet-jsp-version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>servlet-api</artifactId>
- </exclusion>
- </exclusions>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <scope>provided</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/jetty-jsp-2.1/src/main/java/org/eclipse/jetty/jsp/JettyLog.java b/jetty-jsp-2.1/src/main/java/org/eclipse/jetty/jsp/JettyLog.java
deleted file mode 100644
index e8bd4afe95..0000000000
--- a/jetty-jsp-2.1/src/main/java/org/eclipse/jetty/jsp/JettyLog.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.eclipse.jetty.jsp;
-
-import com.sun.org.apache.commons.logging.LogFactory;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
-
-/**
- * @version $Revision$ $Date$
- */
-public class JettyLog implements com.sun.org.apache.commons.logging.Log
-{
- private static volatile boolean __initialized;
-
- /**
- * Called via reflection from WebXmlProcessor
- */
- public static synchronized void init()
- {
- if (!__initialized)
- {
- __initialized = true;
- LogFactory.setLogImplClassName(JettyLog.class.getName());
- }
- }
-
- private final Logger _logger;
-
- public JettyLog(String name)
- {
- _logger = Log.getLogger(name);
- }
-
- public void fatal(Object o)
- {
- error(o);
- }
-
- public void fatal(Object o, Throwable throwable)
- {
- error(o, throwable);
- }
-
- public boolean isErrorEnabled()
- {
- return true;
- }
-
- public void error(Object o)
- {
- warn(o);
- }
-
- public void error(Object o, Throwable throwable)
- {
- _logger.warn(String.valueOf(o), throwable);
- }
-
- public boolean isWarnEnabled()
- {
- return true;
- }
-
- public void warn(Object o)
- {
- _logger.warn(String.valueOf(o));
- }
-
- public boolean isInfoEnabled()
- {
- return true;
- }
-
- public void info(Object o)
- {
- _logger.info(String.valueOf(o));
- }
-
- public boolean isDebugEnabled()
- {
- return _logger.isDebugEnabled();
- }
-
- public void debug(Object o)
- {
- _logger.debug(String.valueOf(o));
- }
-
- public void debug(Object o, Throwable throwable)
- {
- _logger.debug(String.valueOf(o), throwable);
- }
-
- public boolean isTraceEnabled()
- {
- return isDebugEnabled();
- }
-
- public void trace(Object o)
- {
- debug(o);
- }
-}
diff --git a/jetty-nested/pom.xml b/jetty-nested/pom.xml
index 77a55c7848..67bd7d8103 100644
--- a/jetty-nested/pom.xml
+++ b/jetty-nested/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>jetty-nested</artifactId>
<name>Jetty :: Nested</name>
diff --git a/jetty-nested/src/main/java/org/eclipse/jetty/nested/NestedConnection.java b/jetty-nested/src/main/java/org/eclipse/jetty/nested/NestedConnection.java
index 045afc17e3..f55f2fa24b 100644
--- a/jetty-nested/src/main/java/org/eclipse/jetty/nested/NestedConnection.java
+++ b/jetty-nested/src/main/java/org/eclipse/jetty/nested/NestedConnection.java
@@ -15,7 +15,7 @@ package org.eclipse.jetty.nested;
import java.io.IOException;
import java.util.Enumeration;
-import javax.servlet.ServletContext;
+import javax.servlet.DispatcherType;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
@@ -24,11 +24,7 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.io.Connection;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.DispatcherType;
import org.eclipse.jetty.server.HttpConnection;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.util.log.Log;
public class NestedConnection extends HttpConnection
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/META-INF/MANIFEST.MF b/jetty-osgi/jetty-osgi-boot-jsp/META-INF/MANIFEST.MF
index df5a595516..c853162b97 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/META-INF/MANIFEST.MF
+++ b/jetty-osgi/jetty-osgi-boot-jsp/META-INF/MANIFEST.MF
@@ -3,34 +3,20 @@ Bundle-ManifestVersion: 2
Bundle-Name: Jetty-OSGi-Jasper integration
Fragment-Host: org.eclipse.jetty.osgi.boot
Bundle-SymbolicName: org.eclipse.jetty.osgi.boot.jsp
-Bundle-Version: 7.4.1.qualifier
+Bundle-Version: 8.0.0.qualifier
Bundle-Vendor: Mort Bay Consulting
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: com.sun.el;resolution:=optional,
- com.sun.el.lang;resolution:=optional,
- com.sun.el.parser;resolution:=optional,
- com.sun.el.util;resolution:=optional,
- com.sun.org.apache.commons.logging;split=glassfish;version="[2.1,3)";resolution:=optional,
- javax.el;version="1.0.0";resolution:=optional,
- javax.servlet;version="2.5.0",
- javax.servlet.jsp;version="2.1.0",
- javax.servlet.jsp.el;version="2.1.0",
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: com.sun.el;version="2.2.0";resolution:=optional,
+ javax.el;version="2.2.0";resolution:=optional,
+ javax.servlet.jsp;version="2.2.0",
+ javax.servlet.jsp.el;version="2.2.0",
javax.servlet.jsp.jstl.core;version="1.2.0";resolution:=optional,
javax.servlet.jsp.jstl.fmt;version="1.2.0";resolution:=optional,
javax.servlet.jsp.jstl.sql;version="1.2.0";resolution:=optional,
javax.servlet.jsp.jstl.tlv;version="1.2.0";resolution:=optional,
- javax.servlet.jsp.resources;version="2.1.0",
- javax.servlet.jsp.tagext;version="2.1.0",
- javax.servlet.resources;version="2.5.0",
- org.apache.jasper;version="2.0.0";resolution:=optional,
- org.apache.jasper.compiler;version="2.0.0";resolution:=optional,
- org.apache.jasper.compiler.tagplugin;version="2.0.0";resolution:=optional,
- org.apache.jasper.runtime;version="2.0.0";resolution:=optional,
- org.apache.jasper.security;version="2.0.0";resolution:=optional,
- org.apache.jasper.servlet;version="2.0.0";resolution:=optional,
- org.apache.jasper.tagplugins.jstl;version="2.0.0";resolution:=optional,
- org.apache.jasper.util;version="2.0.0";resolution:=optional,
- org.apache.jasper.xmlparser;version="2.0.0";resolution:=optional,
+ org.apache.jasper;version="2.1.0";resolution:=optional,
+ org.apache.jasper.compiler;version="2.1.0";resolution:=optional,
+ org.apache.jasper.xmlparser;version="2.1.0";resolution:=optional,
org.apache.taglibs.standard;version="1.2.0";resolution:=optional,
org.apache.taglibs.standard.extra.spath;version="1.2.0";resolution:=optional,
org.apache.taglibs.standard.functions;version="1.2.0";resolution:=optional,
@@ -54,4 +40,6 @@ Import-Package: com.sun.el;resolution:=optional,
org.apache.taglibs.standard.tag.rt.xml;version="1.2.0";resolution:=optional,
org.apache.taglibs.standard.tei;version="1.2.0";resolution:=optional,
org.apache.taglibs.standard.tlv;version="1.2.0";resolution:=optional,
- org.eclipse.jetty.jsp;version="[7.0,8.0)";resolution:=optional
+ org.glassfish.jsp.api;version="2.2.2";resolution:=optional
+DynamicImport-Package: org.apache.jasper.*;version="2.1.0"
+
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
index b83a33f832..9aa80e9f9b 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.osgi</groupId>
<artifactId>jetty-osgi-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -32,19 +32,41 @@
<groupId>org.eclipse.osgi</groupId>
<artifactId>org.eclipse.osgi.services</artifactId>
</dependency>
+<!-- switch to 2.2 once it works in OSGi for us
+ <dependency>
+ <groupId>org.glassfish.web</groupId>
+ <artifactId>jsp-impl</artifactId>
+ <version>2.2</version>
+ </dependency> -->
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-glassfish</artifactId>
+ <version>2.1.v20100127</version>
</dependency>
+ <!--dependency>
+ <groupId>javax.servlet.jsp</groupId>
+ <artifactId>jsp-api</artifactId>
+ <version>2.2</version>
+ </dependency-->
<dependency>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jsp-api-2.1-glassfish</artifactId>
+ <groupId>javax.el</groupId>
+ <artifactId>el-api</artifactId>
+ <version>2.2</version>
</dependency>
<dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
</dependency>
</dependencies>
+ <!-- can't find the jsp-2.2 jars on maven central.
+ adding glassifish maven repo for now. -->
+ <repositories>
+ <repository>
+ <id>sun</id>
+ <url>http://download.java.net/maven/2/</url>
+ </repository>
+ </repositories>
+
<build>
<plugins>
@@ -55,7 +77,7 @@
<phase>process-resources</phase>
<configuration>
<tasks>
- <replace file="target/classes/META-INF/MANIFEST.MF" token="Bundle-Version: 7.4.1.qualifier" value="Bundle-Version: ${parsedVersion.osgiVersion}" />
+ <replace file="target/classes/META-INF/MANIFEST.MF" token="Bundle-Version: 8.0.0.qualifier" value="Bundle-Version: ${parsedVersion.osgiVersion}" />
</tasks>
</configuration>
<goals>
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/WebappRegistrationCustomizerImpl.java b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/WebappRegistrationCustomizerImpl.java
index 89a5f9e371..0e9df2e771 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/WebappRegistrationCustomizerImpl.java
+++ b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/WebappRegistrationCustomizerImpl.java
@@ -122,7 +122,6 @@ public class WebappRegistrationCustomizerImpl implements WebappRegistrationCusto
*/
public URL[] getJarsWithTlds(OSGiAppProvider provider, BundleFileLocatorHelper locatorHelper) throws Exception
{
-
HashSet<Class<?>> classesToAddToTheTldBundles = new HashSet<Class<?>>();
//Look for the jstl bundle
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java
index 46a9ce31bc..99a567cd70 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java
+++ b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java
@@ -36,6 +36,7 @@ public class FragmentActivator implements BundleActivator
*
*/
public void start(BundleContext context) throws Exception {
+ System.setProperty("org.apache.jasper.compiler.disablejsr199", Boolean.TRUE.toString());
WebBundleDeployerHelper.JSP_REGISTRATION_HELPERS.add(new WebappRegistrationCustomizerImpl());
WebBundleDeployerHelper.JSP_REGISTRATION_HELPERS.add(new PluggableWebAppRegistrationCustomizerImpl());
}
diff --git a/jetty-osgi/jetty-osgi-boot-logback/META-INF/MANIFEST.MF b/jetty-osgi/jetty-osgi-boot-logback/META-INF/MANIFEST.MF
deleted file mode 100644
index 898c20acd0..0000000000
--- a/jetty-osgi/jetty-osgi-boot-logback/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Jetty-OSGi-Logback integration
-Fragment-Host: org.eclipse.jetty.osgi.boot
-Bundle-SymbolicName: org.eclipse.jetty.osgi.boot.logback;singleton:=true
-Bundle-Version: 7.3.1.qualifier
-Bundle-Vendor: Mort Bay Consulting
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: ch.qos.logback.classic,
- ch.qos.logback.classic.joran,
- ch.qos.logback.core,
- ch.qos.logback.core.joran,
- ch.qos.logback.core.joran.spi,
- ch.qos.logback.core.spi,
- ch.qos.logback.core.util,
- ch.qos.logback.access.jetty.v7;resolution:=optional,
- org.apache.commons.logging;resolution:=optional,
- org.apache.log4j;resolution:=optional,
- org.osgi.framework,
- org.slf4j
diff --git a/jetty-osgi/jetty-osgi-boot-logback/META-INF/readme.txt b/jetty-osgi/jetty-osgi-boot-logback/META-INF/readme.txt
deleted file mode 100644
index 20960b4bd4..0000000000
--- a/jetty-osgi/jetty-osgi-boot-logback/META-INF/readme.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-This bundle is made to inject the logback dependencies along with the slf4j dependencies to support log4j and commons-logging.
-It will read the configuration in the jettyhome/resources/logback-test.xml or jettyhome/resources/logback.xml folder.
-
-
-It was tested with these bundles:
-#this provides lg4j and commons-logging via slf4j
-SLF4J = group("com.springsource.slf4j.api", "com.springsource.slf4j.org.apache.log4j", "com.springsource.slf4j.org.apache.commons.logging",
- :under=>"org.slf4j", :version=>"1.5.6")
-
-#logback is not exporting enough packages for us to be able to configure logback classic programatically.. on the springsource version they are fine...
-LOGBACK = group("com.springsource.ch.qos.logback.core", "com.springsource.ch.qos.logback.classic",
- :under=>"ch.qos.logback", :version=>"0.9.15") \ No newline at end of file
diff --git a/jetty-osgi/jetty-osgi-boot-logback/build.properties b/jetty-osgi/jetty-osgi-boot-logback/build.properties
deleted file mode 100644
index 6d10c98886..0000000000
--- a/jetty-osgi/jetty-osgi-boot-logback/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/main/java/
-output.. = target/classes/
-bin.includes = META-INF/,\
- .
-src.includes = META-INF/
diff --git a/jetty-osgi/jetty-osgi-boot-logback/pom.xml b/jetty-osgi/jetty-osgi-boot-logback/pom.xml
deleted file mode 100644
index 9004f5eb78..0000000000
--- a/jetty-osgi/jetty-osgi-boot-logback/pom.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <parent>
- <groupId>org.eclipse.jetty.osgi</groupId>
- <artifactId>jetty-osgi-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.eclipse.jetty.osgi</groupId>
- <artifactId>jetty-osgi-boot-logback</artifactId>
- <name>Jetty :: OSGi :: Boot Logback</name>
- <description>Jetty OSGi Boot Logback bundle</description>
- <properties>
- <bundle-symbolic-name>${project.groupId}.boot.logback</bundle-symbolic-name>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.eclipse.jetty.osgi</groupId>
- <artifactId>jetty-osgi-boot</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.osgi</groupId>
- <artifactId>org.eclipse.osgi</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-webapp</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.osgi</groupId>
- <artifactId>org.eclipse.osgi.services</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>log4j-over-slf4j</artifactId>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-core</artifactId>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
- <execution>
- <phase>process-resources</phase>
- <configuration>
- <tasks>
- <replace file="target/classes/META-INF/MANIFEST.MF" token="Bundle-Version: 7.3.0.qualifier" value="Bundle-Version: ${parsedVersion.osgiVersion}" />
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <executions>
- <execution>
- <id>artifact-jar</id>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- <execution>
- <id>test-jar</id>
- <goals>
- <goal>test-jar</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <archive>
- <manifestFile>target/classes/META-INF/MANIFEST.MF</manifestFile>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>findbugs-maven-plugin</artifactId>
- <configuration>
- <onlyAnalyze>org.eclipse.jetty.osgi.boot.logback.*</onlyAnalyze>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-
-</project>
diff --git a/jetty-osgi/jetty-osgi-boot-logback/src/main/java/org/eclipse/jetty/osgi/boot/logback/FragmentActivator.java b/jetty-osgi/jetty-osgi-boot-logback/src/main/java/org/eclipse/jetty/osgi/boot/logback/FragmentActivator.java
deleted file mode 100644
index 919c10fada..0000000000
--- a/jetty-osgi/jetty-osgi-boot-logback/src/main/java/org/eclipse/jetty/osgi/boot/logback/FragmentActivator.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// ========================================================================
-// Copyright (c) 2009 Intalio, Inc.
-// ------------------------------------------------------------------------
-// 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.osgi.boot.logback;
-
-import java.io.File;
-import java.util.Map;
-
-import org.eclipse.jetty.osgi.boot.internal.webapp.LibExtClassLoaderHelper;
-import org.eclipse.jetty.osgi.boot.internal.webapp.OSGiWebappClassLoader;
-import org.eclipse.jetty.osgi.boot.internal.webapp.LibExtClassLoaderHelper.IFilesInJettyHomeResourcesProcessor;
-import org.eclipse.jetty.osgi.boot.logback.internal.LogbackInitializer;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * Pseudo fragment activator.
- * Called by the main org.eclipse.jetty.osgi.boot bundle.
- * Please note: this is not a real BundleActivator. Simply something called back by
- * the host bundle.
- * The fragment is in charge of placing a hook to configure logback
- * when the files inside jettyhome/resources are parsed.
- */
-public class FragmentActivator implements BundleActivator, IFilesInJettyHomeResourcesProcessor
-{
- /**
- *
- */
- public void start(BundleContext context) throws Exception
- {
- LibExtClassLoaderHelper.registeredFilesInJettyHomeResourcesProcessors.add(this);
-
- //now let's make sure no log4j, no slf4j and no commons.logging
- //get inserted as a library that is not an osgi library
- OSGiWebappClassLoader.addClassThatIdentifiesAJarThatMustBeRejected("org.apache.commons.logging.Log");
- OSGiWebappClassLoader.addClassThatIdentifiesAJarThatMustBeRejected("org.apache.log4j.Logger");
- OSGiWebappClassLoader.addClassThatIdentifiesAJarThatMustBeRejected("org.slf4j.Logger");
- //OSGiWebappClassLoader.addClassThatIdentifiesAJarThatMustBeRejected(java.util.logging.Logger.class);
-
- }
-
- /**
- * Called when this bundle is stopped so the Framework can perform the
- * bundle-specific activities necessary to stop the bundle. In general, this
- * method should undo the work that the <code>BundleActivator.start</code>
- * method started. There should be no active threads that were started by
- * this bundle when this bundle returns. A stopped bundle must not call any
- * Framework objects.
- *
- * <p>
- * This method must complete and return to its caller in a timely manner.
- *
- * @param context The execution context of the bundle being stopped.
- * @throws Exception If this method throws an exception, the
- * bundle is still marked as stopped, and the Framework will remove
- * the bundle's listeners, unregister all services registered by the
- * bundle, and release all services used by the bundle.
- */
- public void stop(BundleContext context) throws Exception
- {
- LibExtClassLoaderHelper.registeredFilesInJettyHomeResourcesProcessors.remove(this);
- }
-
- public void processFilesInResourcesFolder(File jettyHome, Map<String,File> files)
- {
- try
- {
- LogbackInitializer.processFilesInResourcesFolder(jettyHome, files);
- }
- catch (Throwable t)
- {
- t.printStackTrace();
- }
- }
-
-}
diff --git a/jetty-osgi/jetty-osgi-boot-logback/src/main/java/org/eclipse/jetty/osgi/boot/logback/internal/LogbackInitializer.java b/jetty-osgi/jetty-osgi-boot-logback/src/main/java/org/eclipse/jetty/osgi/boot/logback/internal/LogbackInitializer.java
deleted file mode 100644
index 71134ab2c1..0000000000
--- a/jetty-osgi/jetty-osgi-boot-logback/src/main/java/org/eclipse/jetty/osgi/boot/logback/internal/LogbackInitializer.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// ========================================================================
-// Copyright (c) 2009 Intalio, Inc.
-// ------------------------------------------------------------------------
-// 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.
-// Contributors:
-// Hugues Malphettes - initial API and implementation
-// ========================================================================
-package org.eclipse.jetty.osgi.boot.logback.internal;
-
-import java.io.File;
-import java.util.Map;
-
-import org.slf4j.LoggerFactory;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.joran.JoranConfigurator;
-import ch.qos.logback.core.joran.JoranConfiguratorBase;
-import ch.qos.logback.core.joran.spi.JoranException;
-import ch.qos.logback.core.util.StatusPrinter;
-
-/**
- * Setup logback eventually located in the config file inside jettyhome/resources
- * All logback related code is done in this separate class for better debug
- * and isolation when it does not load.
- */
-public class LogbackInitializer {
-
- /**
- * @return true when we are currently being run by the pde in development mode.
- */
- private static boolean isPDEDevelopment()
- {
- String eclipseCommands = System.getProperty("eclipse.commands");
- // detect if we are being run from the pde: ie during development.
- return eclipseCommands != null && eclipseCommands.indexOf("-dev") != -1
- && (eclipseCommands.indexOf("-dev\n") != -1
- || eclipseCommands.indexOf("-dev\r") != -1
- || eclipseCommands.indexOf("-dev ") != -1);
- }
-
-
- /**
- * Follow the configuration for logback.
- * unless the system propery was set in which case it
- * was assume it was already setup.
- */
- public static void processFilesInResourcesFolder(File jettyHome, Map<String,File> files)
- {
- String logbackConf = System.getProperty("logback.configurationFile");
- if (logbackConf != null)
- {
- File confFile = new File(logbackConf);
- if (confFile.exists())
- {
- //assume logback was configured by this one?
- return;
- }
- }
-
- File logConf = isPDEDevelopment() ? files.get("logback-dev.xml") : null;
- if (logConf == null)
- {
- logConf = files.get("logback-test.xml");
- }
- if (logConf == null)
- {
- logConf = files.get("logback.xml");
- }
- if (logConf == null)
- {
- return;
- }
- // assume SLF4J is bound to logback in the current environment
- LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
-
- try
- {
- JoranConfiguratorBase configurator = new JoranConfigurator();
- configurator.setContext(lc);
- lc.reset();
- configurator.doConfigure(logConf.getAbsoluteFile().getAbsolutePath());
- }
- catch (JoranException je)
- {
- je.printStackTrace();
- }
- StatusPrinter.printIfErrorsOccured(lc);
-
- }
-
-}
diff --git a/jetty-osgi/jetty-osgi-boot-warurl/META-INF/MANIFEST.MF b/jetty-osgi/jetty-osgi-boot-warurl/META-INF/MANIFEST.MF
index 28a7a1456e..d51822383c 100644
--- a/jetty-osgi/jetty-osgi-boot-warurl/META-INF/MANIFEST.MF
+++ b/jetty-osgi/jetty-osgi-boot-warurl/META-INF/MANIFEST.MF
@@ -2,10 +2,10 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Support for rfc66 war url scheme
Bundle-SymbolicName: org.eclipse.jetty.osgi.boot.warurl;singleton:=true
-Bundle-Version: 7.3.0.qualifier
+Bundle-Version: 8.0.0.qualifier
Bundle-Activator: org.eclipse.jetty.osgi.boot.warurl.WarUrlActivator
Bundle-Vendor: Mort Bay Consulting
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.eclipse.jetty.util,
org.osgi.framework,
org.osgi.service.url
diff --git a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
index 8cb5815769..e4e8d45173 100644
--- a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.osgi</groupId>
<artifactId>jetty-osgi-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -33,7 +33,7 @@
<phase>process-resources</phase>
<configuration>
<tasks>
- <replace file="target/classes/META-INF/MANIFEST.MF" token="Bundle-Version: 7.3.0.qualifier" value="Bundle-Version: ${parsedVersion.osgiVersion}" />
+ <replace file="target/classes/META-INF/MANIFEST.MF" token="Bundle-Version: 8.0.0.qualifier" value="Bundle-Version: ${parsedVersion.osgiVersion}" />
</tasks>
</configuration>
<goals>
diff --git a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml.tycho b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml.tycho
deleted file mode 100644
index b30ae7a464..0000000000
--- a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml.tycho
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>jetty-osgi</artifactId>
- <version>7.0.1-SNAPSHOT</version>
- <groupId>org.eclipse.jetty.osgi</groupId>
- </parent>
- <groupId>org.eclipse.jetty.osgi</groupId>
- <artifactId>org.eclipse.jetty.osgi.boot.warurl</artifactId>
- <version>7.0.1.qualifier</version>
- <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF b/jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF
index 2b735d0af2..fda1e53a20 100644
--- a/jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF
+++ b/jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF
@@ -1,19 +1,21 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Jetty OSGi bootstrap
-Bundle-SymbolicName: org.eclipse.jetty.osgi.boot;singleton:=true
+Bundle-SymbolicName: org.eclipse.jetty.osgi.boot
Bundle-Vendor: Mort Bay Consulting
-Bundle-Version: 7.4.1.qualifier
+Bundle-Version: 8.0.0.qualifier
Bundle-Activator: org.eclipse.jetty.osgi.boot.JettyBootstrapActivator
Import-Package: javax.mail;version="1.4.0";resolution:=optional,
javax.mail.event;version="1.4.0";resolution:=optional,
javax.mail.internet;version="1.4.0";resolution:=optional,
javax.mail.search;version="1.4.0";resolution:=optional,
javax.mail.util;version="1.4.0";resolution:=optional,
- javax.servlet;version="2.5.0",
- javax.servlet.http;version="2.5.0",
+ javax.servlet;version="3.0",
+ javax.servlet.http;version="3.0",
javax.transaction;version="1.1.0";resolution:=optional,
javax.transaction.xa;version="1.1.0";resolution:=optional,
+ org.eclipse.jetty.nested;version="8.0.0";resolution:=optional,
+ org.eclipse.jetty.annotations;version="8.0.0";resolution:=optional,
org.osgi.framework,
org.osgi.service.cm;version="1.2.0",
org.osgi.service.packageadmin,
@@ -25,28 +27,27 @@ Import-Package: javax.mail;version="1.4.0";resolution:=optional,
org.slf4j.spi;resolution:=optional,
org.xml.sax,
org.xml.sax.helpers
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-Classpath: .
-Require-Bundle: org.eclipse.jetty.ajp;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.annotations;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.client;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.continuation;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.deploy;bundle-version="[7.0,8)",
- org.eclipse.jetty.http;bundle-version="[7.0,8)",
- org.eclipse.jetty.io;bundle-version="[7.0,8)",
- org.eclipse.jetty.jmx;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.jndi;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.nested;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.plus;bundle-version="[7.0,8.0)";resolution:=optional,
- org.eclipse.jetty.rewrite;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.security;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.server;bundle-version="[7.0,8)",
- org.eclipse.jetty.servlet;bundle-version="[7.0,8)",
- org.eclipse.jetty.servlets;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.util;bundle-version="[7.0,8)",
- org.eclipse.jetty.webapp;bundle-version="[7.0,8)",
- org.eclipse.jetty.websocket;bundle-version="[7.0,8)";resolution:=optional,
- org.eclipse.jetty.xml;bundle-version="[7.0,8)"
-Export-Package: org.eclipse.jetty.osgi.boot;version="7.4.0",
- org.eclipse.jetty.osgi.nested;version="7.4.0",
- org.eclipse.jetty.osgi.boot.utils;version="7.4.0"
+Require-Bundle: org.eclipse.jetty.ajp;bundle-version="[8.0,9)";resolution:=optional,
+ org.eclipse.jetty.annotations;bundle-version="[8.0,9)";resolution:=optional,
+ org.eclipse.jetty.client;bundle-version="[8.0,9)";resolution:=optional,
+ org.eclipse.jetty.continuation;bundle-version="[7.0,9)";resolution:=optional,
+ org.eclipse.jetty.deploy;bundle-version="[8.0,9)",
+ org.eclipse.jetty.http;bundle-version="[8.0,9)",
+ org.eclipse.jetty.io;bundle-version="[8.0,9)",
+ org.eclipse.jetty.jmx;bundle-version="[8.0,9)";resolution:=optional,
+ org.eclipse.jetty.jndi;bundle-version="[8.0,9)";resolution:=optional,
+ org.eclipse.jetty.plus;bundle-version="[8.0,9.0)";resolution:=optional,
+ org.eclipse.jetty.rewrite;bundle-version="[8.0,9)";resolution:=optional,
+ org.eclipse.jetty.security;bundle-version="[8.0,9)";resolution:=optional,
+ org.eclipse.jetty.server;bundle-version="[8.0,9)",
+ org.eclipse.jetty.servlet;bundle-version="[8.0,9)",
+ org.eclipse.jetty.servlets;bundle-version="[8.0,9)";resolution:=optional,
+ org.eclipse.jetty.util;bundle-version="[8.0,9)",
+ org.eclipse.jetty.webapp;bundle-version="[8.0,9)",
+ org.eclipse.jetty.websocket;bundle-version="[8.0,9)";resolution:=optional,
+ org.eclipse.jetty.xml;bundle-version="[8.0,9)"
+Export-Package: org.eclipse.jetty.osgi.boot;version="8.0.0",
+ org.eclipse.jetty.osgi.boot.utils;version="8.0.0",
+ org.eclipse.jetty.osgi.annotations;version="8.0.0"
diff --git a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-osgi-default.xml b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-osgi-default.xml
index 49bf343dc6..7ee9427090 100644
--- a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-osgi-default.xml
+++ b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty-osgi-default.xml
@@ -123,7 +123,6 @@
</New>
</Arg>
</Call>
-
</New>
</Arg>
</Call>
diff --git a/jetty-osgi/jetty-osgi-boot/pom.xml b/jetty-osgi/jetty-osgi-boot/pom.xml
index ed786dfa0f..ce61229939 100644
--- a/jetty-osgi/jetty-osgi-boot/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.osgi</groupId>
<artifactId>jetty-osgi-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -14,6 +14,10 @@
<bundle-symbolic-name>${project.groupId}.boot</bundle-symbolic-name>
</properties>
<dependencies>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-annotations</artifactId>
+ </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
@@ -40,62 +44,6 @@
</dependency>
</dependencies>
- <!--build>
- <plugins>
- <plugin>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
- <execution>
- <phase>process-resources</phase>
- <configuration>
- <tasks>
- <replace file="target/classes/META-INF/MANIFEST.MF" token="Bundle-Version: 7.3.0.qualifier" value="Bundle-Version: ${parsedVersion.osgiVersion}" />
- <copy todir="target/classes/jettyhome">
- <fileset dir="jettyhome">
- <exclude name="**/*.log" />
- </fileset>
- </copy>
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <executions>
- <execution>
- <id>artifact-jar</id>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- <execution>
- <id>test-jar</id>
- <goals>
- <goal>test-jar</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <archive>
- <manifestFile>target/classes/META-INF/MANIFEST.MF</manifestFile>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>findbugs-maven-plugin</artifactId>
- <configuration>
- <onlyAnalyze>org.eclipse.jetty.osgi.boot.*</onlyAnalyze>
- </configuration>
- </plugin>
- </plugins>
- </build-->
-
<build>
<plugins>
<plugin>
@@ -173,6 +121,8 @@
javax.servlet.http;version="2.5.0",
javax.transaction;version="1.1.0";resolution:=optional,
javax.transaction.xa;version="1.1.0";resolution:=optional,
+ org.eclipse.jetty.nested;version="8.0.0";resolution:=optional,
+ org.eclipse.jetty.annotations;version="8.0.0";resolution:=optional,
org.osgi.framework,
org.osgi.service.cm;version="1.2.0",
org.osgi.service.packageadmin,
@@ -184,12 +134,11 @@
org.slf4j.helpers;resolution:=optional,
org.xml.sax,
org.xml.sax.helpers,
- org.eclipse.jetty.nested;resolution:=optional,
*
</Import-Package>
- <DynamicImport-Package>org.eclipse.jetty.*;version="[7.3,8)"</DynamicImport-Package>
+ <DynamicImport-Package>org.eclipse.jetty.*;version="[8.0.0,9.0.0)"</DynamicImport-Package>
<!--Require-Bundle/-->
- <Bundle-RequiredExecutionEnvironment>J2SE-1.5</Bundle-RequiredExecutionEnvironment>
+ <Bundle-RequiredExecutionEnvironment>JavaSE-1.6</Bundle-RequiredExecutionEnvironment>
</instructions>
</configuration>
</plugin>
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java
new file mode 100644
index 0000000000..7706b859f5
--- /dev/null
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java
@@ -0,0 +1,197 @@
+// ========================================================================
+// Copyright (c) 2006-2011 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.osgi.annotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.annotations.ClassNameResolver;
+import org.eclipse.jetty.osgi.boot.OSGiWebappConstants;
+import org.eclipse.jetty.osgi.boot.utils.internal.PackageAdminServiceTracker;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.webapp.DiscoveredAnnotation;
+import org.eclipse.jetty.webapp.WebAppContext;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+
+/**
+ * Extend the AnnotationConfiguration to support OSGi:
+ * Look for annotations inside WEB-INF/lib and also in the fragments and required bundles.
+ * Discover them using a scanner adapted to OSGi instead of the jarscanner.
+ */
+public class AnnotationConfiguration extends org.eclipse.jetty.annotations.AnnotationConfiguration
+{
+
+ /**
+ * This parser scans the bundles using the OSGi APIs instead of assuming a jar.
+ */
+ @Override
+ protected org.eclipse.jetty.annotations.AnnotationParser createAnnotationParser()
+ {
+ return new AnnotationParser();
+ }
+
+ /**
+ * Here is the order in which jars and osgi artifacts are scanned for discoverable annotations.
+ * <ol>
+ * <li>The container jars are scanned.</li>
+ * <li>The WEB-INF/classes are scanned</li>
+ * <li>The osgi fragment to the web bundle are parsed.</li>
+ * <li>The WEB-INF/lib are scanned</li>
+ * <li>The required bundles are parsed</li>
+ * </ol>
+ */
+ @Override
+ public void parseWebInfLib (WebAppContext context, org.eclipse.jetty.annotations.AnnotationParser parser)
+ throws Exception
+ {
+ AnnotationParser oparser = (AnnotationParser)parser;
+
+ Bundle webbundle = (Bundle) context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE);
+ Bundle[] fragAndRequiredBundles = PackageAdminServiceTracker.INSTANCE.getFragmentsAndRequiredBundles(webbundle);
+ if (fragAndRequiredBundles != null)
+ {
+ //index:
+ for (Bundle bundle : fragAndRequiredBundles)
+ {
+ Resource bundleRes = oparser.indexBundle(bundle);
+ if (!context.getMetaData().getWebInfJars().contains(bundleRes))
+ {
+ context.getMetaData().addWebInfJar(bundleRes);
+ }
+ }
+
+ //scan the fragments
+ for (Bundle fragmentBundle : fragAndRequiredBundles)
+ {
+ if (fragmentBundle.getHeaders().get(Constants.FRAGMENT_HOST) != null)
+ {
+ //a fragment indeed:
+ parseFragmentBundle(context,oparser,webbundle,fragmentBundle);
+ }
+ }
+ }
+ //scan ourselves
+ parseWebBundle(context,oparser,webbundle);
+
+ //scan the WEB-INF/lib
+ super.parseWebInfLib(context,parser);
+ if (fragAndRequiredBundles != null)
+ {
+ //scan the required bundles
+ for (Bundle requiredBundle : fragAndRequiredBundles)
+ {
+ if (requiredBundle.getHeaders().get(Constants.FRAGMENT_HOST) == null)
+ {
+ //a bundle indeed:
+ parseRequiredBundle(context,oparser,webbundle,requiredBundle);
+ }
+ }
+ }
+ }
+
+ /**
+ * Scan a fragment bundle for servlet annotations
+ * @param context The webapp context
+ * @param parser The parser
+ * @param webbundle The current webbundle
+ * @param fragmentBundle The OSGi fragment bundle to scan
+ * @throws Exception
+ */
+ protected void parseFragmentBundle(WebAppContext context, AnnotationParser parser,
+ Bundle webbundle, Bundle fragmentBundle) throws Exception
+ {
+ parseBundle(context,parser,webbundle,fragmentBundle);
+ }
+
+ /**
+ * Scan a bundle required by the webbundle for servlet annotations
+ * @param context The webapp context
+ * @param parser The parser
+ * @param webbundle The current webbundle
+ * @param fragmentBundle The OSGi required bundle to scan
+ * @throws Exception
+ */
+ protected void parseWebBundle(WebAppContext context, AnnotationParser parser, Bundle webbundle)
+ throws Exception
+ {
+ parseBundle(context,parser,webbundle,webbundle);
+ }
+
+ /**
+ * Scan a bundle required by the webbundle for servlet annotations
+ * @param context The webapp context
+ * @param parser The parser
+ * @param webbundle The current webbundle
+ * @param fragmentBundle The OSGi required bundle to scan
+ * @throws Exception
+ */
+ protected void parseRequiredBundle(WebAppContext context, AnnotationParser parser,
+ Bundle webbundle, Bundle requiredBundle) throws Exception
+ {
+ parseBundle(context,parser,webbundle,requiredBundle);
+ }
+
+ protected void parseBundle(WebAppContext context, AnnotationParser parser,
+ Bundle webbundle, Bundle bundle) throws Exception
+ {
+ Resource bundleRes = parser.getResource(bundle);
+ parser.parse(bundle,createClassNameResolver(context));
+ List<DiscoveredAnnotation> annotations = new ArrayList<DiscoveredAnnotation>();
+ gatherAnnotations(annotations, parser.getAnnotationHandlers());
+ if (webbundle == bundle)
+ {
+ //just like the super with its question about annotations in WEB-INF/classes:
+ //"TODO - where to set the annotations discovered from WEB-INF/classes?"
+ context.getMetaData().addDiscoveredAnnotations(annotations);
+ }
+ else
+ {
+ context.getMetaData().addDiscoveredAnnotations(bundleRes, annotations);
+ }
+ }
+
+ /**
+ * Returns the same classname resolver than for the webInfjar scanner
+ * @param context
+ * @return
+ */
+ protected ClassNameResolver createClassNameResolver(final WebAppContext context)
+ {
+ return createClassNameResolver(context,true,false,false,false);
+ }
+
+ protected ClassNameResolver createClassNameResolver(final WebAppContext context,
+ final boolean excludeSysClass, final boolean excludeServerClass, final boolean excludeEverythingElse,
+ final boolean overrideIsParenLoaderIsPriority)
+ {
+ return new ClassNameResolver ()
+ {
+ public boolean isExcluded (String name)
+ {
+ if (context.isSystemClass(name)) return excludeSysClass;
+ if (context.isServerClass(name)) return excludeServerClass;
+ return excludeEverythingElse;
+ }
+
+ public boolean shouldOverride (String name)
+ {
+ //looking at system classpath
+ if (context.isParentLoaderPriority())
+ return overrideIsParenLoaderIsPriority;
+ return !overrideIsParenLoaderIsPriority;
+ }
+ };
+ }
+
+}
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationParser.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationParser.java
new file mode 100644
index 0000000000..fa7732f791
--- /dev/null
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationParser.java
@@ -0,0 +1,192 @@
+// ========================================================================
+// Copyright (c) 2006-2009 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.osgi.annotations;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URL;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeSet;
+
+import org.eclipse.jetty.annotations.ClassNameResolver;
+import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
+import org.eclipse.jetty.util.resource.Resource;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+
+/**
+ *
+ */
+public class AnnotationParser extends org.eclipse.jetty.annotations.AnnotationParser
+{
+ private Set<URI> _alreadyParsed = new HashSet<URI>();
+
+ private Map<URI,Bundle> _uriToBundle = new HashMap<URI, Bundle>();
+ private Map<Bundle,Resource> _resourceToBundle = new HashMap<Bundle,Resource>();
+ private Map<Bundle,URI> _bundleToUri = new HashMap<Bundle, URI>();
+
+ /**
+ * Keep track of a jetty URI Resource and its associated OSGi bundle.
+ * @param uri
+ * @param bundle
+ * @throws Exception
+ */
+ protected Resource indexBundle(Bundle bundle) throws Exception
+ {
+ File bundleFile = BundleFileLocatorHelper.DEFAULT.getBundleInstallLocation(bundle);
+ Resource resource = Resource.newResource(bundleFile.toURI());
+ URI uri = resource.getURI();
+ _uriToBundle.put(uri,bundle);
+ _bundleToUri.put(bundle,uri);
+ _resourceToBundle.put(bundle,resource);
+ return resource;
+ }
+ protected URI getURI(Bundle bundle)
+ {
+ return _bundleToUri.get(bundle);
+ }
+ protected Resource getResource(Bundle bundle)
+ {
+ return _resourceToBundle.get(bundle);
+ }
+ /**
+ *
+ */
+ @Override
+ public void parse (URI[] uris, ClassNameResolver resolver)
+ throws Exception
+ {
+ for (URI uri : uris)
+ {
+ Bundle associatedBundle = _uriToBundle.get(uri);
+ if (associatedBundle == null)
+ {
+ if (!_alreadyParsed.add(uri))
+ {
+ continue;
+ }
+ //a jar in WEB-INF/lib or the WEB-INF/classes
+ //use the behavior of the super class for a standard jar.
+ super.parse(new URI[] {uri},resolver);
+ }
+ else
+ {
+ parse(associatedBundle,resolver);
+ }
+ }
+ }
+
+ protected void parse(Bundle bundle, ClassNameResolver resolver)
+ throws Exception
+ {
+ URI uri = _bundleToUri.get(bundle);
+ if (!_alreadyParsed.add(uri))
+ {
+ return;
+ }
+
+ String bundleClasspath = (String)bundle.getHeaders().get(Constants.BUNDLE_CLASSPATH);
+ if (bundleClasspath == null)
+ {
+ bundleClasspath = ".";
+ }
+ //order the paths first by the number of tokens in the path second alphabetically.
+ TreeSet<String> paths = new TreeSet<String>(
+ new Comparator<String>()
+ {
+ public int compare(String o1, String o2)
+ {
+ int paths1 = new StringTokenizer(o1,"/",false).countTokens();
+ int paths2 = new StringTokenizer(o2,"/",false).countTokens();
+ if (paths1 == paths2)
+ {
+ return o1.compareTo(o2);
+ }
+ return paths2 - paths1;
+ }
+ });
+ boolean hasDotPath = false;
+ StringTokenizer tokenizer = new StringTokenizer(bundleClasspath, ",;", false);
+ while (tokenizer.hasMoreTokens())
+ {
+ String token = tokenizer.nextToken().trim();
+ if (!token.startsWith("/"))
+ {
+ token = "/" + token;
+ }
+ if (token.equals("/."))
+ {
+ hasDotPath = true;
+ }
+ else if (!token.endsWith(".jar") && !token.endsWith("/"))
+ {
+ paths.add(token+"/");
+ }
+ else
+ {
+ paths.add(token);
+ }
+ }
+ //support the development environment: maybe the classes are inside bin or target/classes
+ //this is certainly not useful in production.
+ //however it makes our life so much easier during development.
+ if (bundle.getEntry("/.classpath") != null)
+ {
+ if (bundle.getEntry("/bin/") != null)
+ {
+ paths.add("/bin/");
+ }
+ else if (bundle.getEntry("/target/classes/") != null)
+ {
+ paths.add("/target/classes/");
+ }
+ }
+ Enumeration classes = bundle.findEntries("/","*.class",true);
+ if (classes == null)
+ {
+ return;
+ }
+ while (classes.hasMoreElements())
+ {
+ URL classUrl = (URL) classes.nextElement();
+ String path = classUrl.getPath();
+ //remove the longest path possible:
+ String name = null;
+ for (String prefixPath : paths)
+ {
+ if (path.startsWith(prefixPath))
+ {
+ name = path.substring(prefixPath.length());
+ break;
+ }
+ }
+ if (name == null && hasDotPath)
+ {
+ //remove the starting '/'
+ name = path.substring(1);
+ }
+ //transform into a classname to pass to the resolver
+ String shortName = name.replace('/', '.').substring(0,name.length()-6);
+ if ((resolver == null)|| (!resolver.isExcluded(shortName) && (!isParsed(shortName) || resolver.shouldOverride(shortName))))
+ scanClass(classUrl.openStream());
+ }
+ }
+
+}
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiAppProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiAppProvider.java
index efb27ee819..4fa93cebad 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiAppProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiAppProvider.java
@@ -50,6 +50,7 @@ public class OSGiAppProvider extends ScanningAppProvider implements AppProvider
private boolean _parentLoaderPriority = false;
private String _defaultsDescriptor;
private String _tldBundles;
+ private String[] _configurationClasses;
/**
* When a context file corresponds to a deployed bundle and is changed we
@@ -144,15 +145,20 @@ public class OSGiAppProvider extends ScanningAppProvider implements AppProvider
public ContextHandler createContextHandler(App app) throws Exception
{
// return pre-created Context
- if (app.getContextHandler() != null)
+ ContextHandler wah = app.getContextHandler();
+ if (wah == null)
{
- return app.getContextHandler();
+ // for some reason it was not defined when the App was constructed.
+ // we don't support this situation at this point.
+ // once the WebAppRegistrationHelper is refactored, the code
+ // that creates the ContextHandler will actually be here.
+ throw new IllegalStateException("The App must be passed the " + "instance of the ContextHandler when it is construsted");
}
- // for some reason it was not defined when the App was constructed.
- // we don't support this situation at this point.
- // once the WebAppRegistrationHelper is refactored, the code
- // that creates the ContextHandler will actually be here.
- throw new IllegalStateException("The App must be passed the " + "instance of the ContextHandler when it is construsted");
+ if (_configurationClasses != null && wah instanceof WebAppContext)
+ {
+ ((WebAppContext)wah).setConfigurationClasses(_configurationClasses);
+ }
+ return app.getContextHandler();
}
/**
@@ -187,7 +193,7 @@ public class OSGiAppProvider extends ScanningAppProvider implements AppProvider
// TODO apply configuration specific to this provider
if (context instanceof WebAppContext)
{
- ((WebAppContext)context).setExtractWAR(isExtract());
+ ((WebAppContext)context).setExtractWAR(isExtract());
}
// wrap context as an App
@@ -381,5 +387,23 @@ public class OSGiAppProvider extends ScanningAppProvider implements AppProvider
{
return _tldBundles;
}
+
+ /**
+ * @param configurations The configuration class names.
+ */
+ public void setConfigurationClasses(String[] configurations)
+ {
+ _configurationClasses = configurations==null?null:(String[])configurations.clone();
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ *
+ */
+ public String[] getConfigurationClasses()
+ {
+ return _configurationClasses;
+ }
+
}
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java
index 87e6ef4f79..3911a9309e 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java
@@ -500,6 +500,13 @@ public class WebBundleDeployerHelper implements IWebBundleDeployerHelper
//can pick it up.
wah.setAttribute(OSGiWebappConstants.REQUIRE_TLD_BUNDLE, requireTldBundle);
+ if (wah instanceof WebAppContext)
+ {
+ if (_wrapper.getOSGiAppProvider().getConfigurationClasses() != null)
+ {
+ ((WebAppContext)wah).setConfigurationClasses(_wrapper.getOSGiAppProvider().getConfigurationClasses());
+ }
+ }
Bundle[] fragments = PackageAdminServiceTracker.INSTANCE.getFragmentsAndRequiredBundles(contributor);
if (fragments != null && fragments.length != 0)
@@ -803,3 +810,4 @@ public class WebBundleDeployerHelper implements IWebBundleDeployerHelper
}
+
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleTrackerCustomizer.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleTrackerCustomizer.java
index e5cb24c8ad..f83e40d19b 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleTrackerCustomizer.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleTrackerCustomizer.java
@@ -17,7 +17,6 @@ import java.util.Dictionary;
import org.eclipse.jetty.osgi.boot.JettyBootstrapActivator;
import org.eclipse.jetty.osgi.boot.OSGiWebappConstants;
-import org.eclipse.jetty.util.log.Log;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleEvent;
import org.osgi.util.tracker.BundleTracker;
@@ -149,7 +148,7 @@ public class WebBundleTrackerCustomizer implements BundleTrackerCustomizer {
String warFolderRelativePath = (String)dic.get(OSGiWebappConstants.JETTY_WAR_FOLDER_PATH);
if (warFolderRelativePath != null)
{
- String contextPath = getWebContextPath(bundle, dic, false);//(String)dic.get(OSGiWebappConstants.RFC66_WEB_CONTEXTPATH);
+ String contextPath = (String)dic.get(OSGiWebappConstants.RFC66_WEB_CONTEXTPATH);
if (contextPath == null || !contextPath.startsWith("/"))
{
throw new IllegalArgumentException();
@@ -210,7 +209,7 @@ public class WebBundleTrackerCustomizer implements BundleTrackerCustomizer {
// pointing to files and folders inside WEB-INF. We should
// filter-out
// META-INF too
- String rfc66ContextPath = getWebContextPath(bundle,dic,rfc66Webxml==null);
+ String rfc66ContextPath = getWebContextPath(bundle,dic);
try
{
JettyBootstrapActivator.registerWebapplication(bundle,".",rfc66ContextPath);
@@ -225,14 +224,11 @@ public class WebBundleTrackerCustomizer implements BundleTrackerCustomizer {
}
}
- private String getWebContextPath(Bundle bundle, Dictionary<?, ?> dic, boolean webinfWebxmlExists)
+ private String getWebContextPath(Bundle bundle, Dictionary<?, ?> dic)
{
String rfc66ContextPath = (String)dic.get(OSGiWebappConstants.RFC66_WEB_CONTEXTPATH);
if (rfc66ContextPath == null)
{
- if (!webinfWebxmlExists) {
- return null;
- }
// extract from the last token of the bundle's location:
// (really ?
// could consider processing the symbolic name as an alternative
@@ -245,7 +241,7 @@ public class WebBundleTrackerCustomizer implements BundleTrackerCustomizer {
int lastDot = rfc66ContextPath.lastIndexOf('.');
if (lastDot != -1)
{
- rfc66ContextPath = rfc66ContextPath.substring(0,lastDot);
+ rfc66ContextPath = rfc66ContextPath.substring(0,lastDot);
}
}
if (!rfc66ContextPath.startsWith("/"))
@@ -254,7 +250,7 @@ public class WebBundleTrackerCustomizer implements BundleTrackerCustomizer {
}
return rfc66ContextPath;
}
-
+
private void unregister(Bundle bundle)
{
// nothing to do: when the bundle is stopped, each one of its service
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultFileLocatorHelper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultFileLocatorHelper.java
index 4525a11513..88d15559b0 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultFileLocatorHelper.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/DefaultFileLocatorHelper.java
@@ -72,7 +72,7 @@ public class DefaultFileLocatorHelper implements BundleFileLocatorHelper
{
// some osgi frameworks do use the file protocole directly in some
// situations. Do use the FileResource to transform the URL into a File: URL#toURI is broken
- return new FileResource(url).getFile().getParentFile().getParentFile();
+ return new FileResource(url).getFile().getParentFile().getParentFile();
}
else if (url.getProtocol().equals("bundleentry"))
{
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java
index ce8127a60a..386ae779a1 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java
@@ -275,3 +275,4 @@ public class PackageAdminServiceTracker implements ServiceListener
}
}
+
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/META-INF/MANIFEST.MF b/jetty-osgi/jetty-osgi-equinoxtools/META-INF/MANIFEST.MF
deleted file mode 100644
index 0d122db435..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Console
-Bundle-SymbolicName: org.eclipse.jetty.osgi.equinoxtools
-Bundle-Description: Example application: equinox console accesssible on the web
-Bundle-Version: 7.4.2.qualifier
-Bundle-Activator: org.eclipse.jetty.osgi.equinoxtools.WebEquinoxToolsActivator
-Import-Package: javax.servlet;version="2.5.0",
- javax.servlet.http;version="2.5.0",
- org.eclipse.jetty.continuation;version="7.4.0",
- org.eclipse.jetty.io;version="7.4.0",
- org.eclipse.jetty.util;version="7.4.0",
- org.eclipse.jetty.util.log;version="7.4.0",
- org.eclipse.jetty.websocket;version="7.4.0",
- org.eclipse.osgi.framework.console;version="1.1.0",
- org.osgi.framework;version="1.3.0",
- org.osgi.service.http;version="1.2.0",
- org.osgi.util.tracker;version="1.3.0"
-Export-Package: org.eclipse.jetty.osgi.equinoxtools;x-internal:=true;version="7.4.2.qualifier",
- org.eclipse.jetty.osgi.equinoxtools.console;x-internal:=true;version="7.4.2.qualifier"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/build.properties b/jetty-osgi/jetty-osgi-equinoxtools/build.properties
deleted file mode 100644
index 05786b032b..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
- equinoxconsole/,\
- .
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/equinoxconsole/index.html b/jetty-osgi/jetty-osgi-equinoxtools/equinoxconsole/index.html
deleted file mode 100644
index 4deba32c28..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/equinoxconsole/index.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<html><head>
- <title>Async Equinox Console</title>
- <script type='text/javascript'>
- function $() { return document.getElementById(arguments[0]); }
- function $F() { return document.getElementById(arguments[0]).value; }
- function getKeyCode(ev) { if (window.event) return window.event.keyCode; return ev.keyCode; }
- function xhr(method,uri,body,handler) {
- var req=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');
- req.onreadystatechange=function() { if (req.readyState==4 && handler) { eval('var o='+req.responseText);handler(o);} }
- req.open(method,uri,true);
- req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
- req.send(body);
- };
- function send(action,user,message,handler){
- if (message) message=message.replace('%','%25').replace('&','%26').replace('=','%3D');
- if (user) user=user.replace('%','%25').replace('&','%26').replace('=','%3D');
- xhr('POST','chat','action='+action+'&user='+user+'&message='+message,handler);
- };
-
- var room = {
- join: function(name) {
- this._username=name;
- $('join').className='hidden';
- $('joined').className='';
- $('phrase').focus();
- send('join', room._username,null);
- send('chat', room._username,'has joined!');
- send('poll', room._username,null, room._poll);
- },
- chat: function(text) {
- if (text != null && text.length>0 )
- send('chat',room._username,text);
- },
- _poll: function(m) {
- //console.debug(m);
- if (m.chat){
- var chat=document.getElementById('chat');
- var spanFrom = document.createElement('span');
- spanFrom.className='from';
- spanFrom.innerHTML=m.from+'&nbsp;';
- var spanText = document.createElement('span');
- spanText.className='text';
- spanText.innerHTML=m.chat;
- var lineBreak = document.createElement('br');
- chat.appendChild(spanFrom);
- chat.appendChild(spanText);
- chat.appendChild(lineBreak);
- chat.scrollTop = chat.scrollHeight - chat.clientHeight;
- }
- if (m.action=='poll')
- send('poll', room._username,null, room._poll);
- },
- _end:''
- };
- </script>
- <style type='text/css'>
- div { border: 0px solid black; }
- div#chat { clear: both; width: 40em; height: 20ex; overflow: auto; background-color: #f0f0f0; padding: 4px; border: 1px solid black; }
- div#input { clear: both; width: 40em; padding: 4px; background-color: #e0e0e0; border: 1px solid black; border-top: 0px }
- input#phrase { width:30em; background-color: #e0f0f0; }
- input#username { width:14em; background-color: #e0f0f0; }
- div.hidden { display: none; }
- span.from { font-weight: bold; }
- span.alert { font-style: italic; }
- </style>
-</head><body>
-<div id='chat'></div>
-<div id='input'>
- <div id='join' >
- Username:&nbsp;<input id='username' type='text'/><input id='joinB' class='button' type='submit' name='join' value='Join'/>
- </div>
- <div id='joined' class='hidden'>
- OSGi:&nbsp;<input id='phrase' type='text'/>
- <input id='sendB' class='button' type='submit' name='join' value='Send'/>
- </div>
-</div>
-<script type='text/javascript'>
-$('username').setAttribute('autocomplete','OFF');
-$('username').onkeyup = function(ev) { var keyc=getKeyCode(ev); if (keyc==13 || keyc==10) { room.join($F('username')); return false; } return true; } ;
-$('joinB').onclick = function(event) { room.join($F('username')); return false; };
-$('phrase').setAttribute('autocomplete','OFF');
-$('phrase').onkeyup = function(ev) { var keyc=getKeyCode(ev); if (keyc==13 || keyc==10) { room.chat($F('phrase')); $('phrase').value=''; return false; } return true; };
-$('sendB').onclick = function(event) { room.chat($F('phrase')); $('phrase').value=''; return false; };
-</script>
-</body></html>
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/equinoxconsole/ws/index.html b/jetty-osgi/jetty-osgi-equinoxtools/equinoxconsole/ws/index.html
deleted file mode 100644
index 4d5acc96d7..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/equinoxconsole/ws/index.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<html><head>
- <title>Equinox Console (WebSocket)</title>
- <script type='text/javascript'>
-
- if (!window.WebSocket)
- alert("WebSocket not supported by this browser");
-
- function $() { return document.getElementById(arguments[0]); }
- function $F() { return document.getElementById(arguments[0]).value; }
-
- function getKeyCode(ev) { if (window.event) return window.event.keyCode; return ev.keyCode; }
-
- var room = {
- join: function(name) {
- this._username=name;
- var location = document.location.toString().replace('http://','ws://').replace('https://','wss://').replace('/index.html','');
- this._ws=new WebSocket(location);
- this._ws.onopen=this._onopen;
- this._ws.onmessage=this._onmessage;
- this._ws.onclose=this._onclose;
- },
-
- _onopen: function(){
- $('join').className='hidden';
- $('joined').className='';
- $('phrase').focus();
- room._send(room._username,'has joined!');
- },
-
- _send: function(user,message){
- user=user.replace(':','_');
- if (this._ws)
- this._ws.send(user+':'+message);
- },
-
- chat: function(text) {
- if (text != null && text.length>0 )
- room._send(room._username,text);
- },
-
- _onmessage: function(m) {
- if (m.data){
- var c=m.data.indexOf(':');
- var from=m.data.substring(0,c).replace('<','&lt;').replace('>','&gt;');
- var text=m.data.substring(c+1).replace('<','&lt;').replace('>','&gt;');
-
- var chat=$('chat');
- var spanFrom = document.createElement('span');
- spanFrom.className='from';
- spanFrom.innerHTML=from+':&nbsp;';
- var spanText = document.createElement('span');
- spanText.className='text';
- spanText.innerHTML=text;
- var lineBreak = document.createElement('br');
- chat.appendChild(spanFrom);
- chat.appendChild(spanText);
- chat.appendChild(lineBreak);
- chat.scrollTop = chat.scrollHeight - chat.clientHeight;
- }
- },
-
- _onclose: function(m) {
- this._ws=null;
- $('join').className='';
- $('joined').className='hidden';
- $('username').focus();
- $('chat').innerHTML='';
- }
-
- };
-
- </script>
- <style type='text/css'>
- div { border: 0px solid black; }
- div#chat { clear: both; width: 40em; height: 20ex; overflow: auto; background-color: #f0f0f0; padding: 4px; border: 1px solid black; }
- div#input { clear: both; width: 40em; padding: 4px; background-color: #e0e0e0; border: 1px solid black; border-top: 0px }
- input#phrase { width:30em; background-color: #e0f0f0; }
- input#username { width:14em; background-color: #e0f0f0; }
- div.hidden { display: none; }
- span.from { font-weight: bold; }
- span.alert { font-style: italic; }
- </style>
-</head><body>
-<div id='chat'></div>
-<div id='input'>
- <div id='join' >
- Username:&nbsp;<input id='username' type='text'/><input id='joinB' class='button' type='submit' name='join' value='Join'/>
- </div>
- <div id='joined' class='hidden'>
- Chat:&nbsp;<input id='phrase' type='text'/>
- <input id='sendB' class='button' type='submit' name='join' value='Send'/>
- </div>
-</div>
-<script type='text/javascript'>
-$('username').setAttribute('autocomplete','OFF');
-$('username').onkeyup = function(ev) { var keyc=getKeyCode(ev); if (keyc==13 || keyc==10) { room.join($F('username')); return false; } return true; } ;
-$('joinB').onclick = function(event) { room.join($F('username')); return false; };
-$('phrase').setAttribute('autocomplete','OFF');
-$('phrase').onkeyup = function(ev) { var keyc=getKeyCode(ev); if (keyc==13 || keyc==10) { room.chat($F('phrase')); $('phrase').value=''; return false; } return true; };
-$('sendB').onclick = function(event) { room.chat($F('phrase')); $('phrase').value=''; return false; };
-</script>
-
-<p>
-This is a demonstration of the Jetty websocket server.
-</p>
-</body></html>
-
-
-
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/pom.xml b/jetty-osgi/jetty-osgi-equinoxtools/pom.xml
deleted file mode 100644
index 7a71f4dffe..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/pom.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <parent>
- <groupId>org.eclipse.jetty.osgi</groupId>
- <artifactId>jetty-osgi-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>jetty-osgi-equinoxtools</artifactId>
- <name>Jetty :: OSGi :: Example Equinox Tools</name>
- <description>Jetty OSGi Example Equinox Tools</description>
- <properties>
- <bundle-symbolic-name>${project.groupId}.equinoxtools</bundle-symbolic-name>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-webapp</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-servlet</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.osgi</groupId>
- <artifactId>org.eclipse.osgi</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.osgi</groupId>
- <artifactId>org.eclipse.osgi.services</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
- <execution>
- <phase>process-resources</phase>
- <configuration>
- <tasks>
- <replace file="target/classes/META-INF/MANIFEST.MF" token="Bundle-Version: 7.4.2.qualifier" value="Bundle-Version: ${parsedVersion.osgiVersion}" />
- <copy todir="target/classes/equinoxconsole">
- <fileset dir="equinoxconsole" />
- </copy>
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <executions>
- <execution>
- <id>artifact-jar</id>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- <execution>
- <id>test-jar</id>
- <goals>
- <goal>test-jar</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <archive>
- <manifestFile>target/classes/META-INF/MANIFEST.MF</manifestFile>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>findbugs-maven-plugin</artifactId>
- <configuration>
- <onlyAnalyze>org.eclipse.jetty.osgi.equinoxtools.*</onlyAnalyze>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/WebEquinoxToolsActivator.java b/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/WebEquinoxToolsActivator.java
deleted file mode 100644
index 23de6fd8a5..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/WebEquinoxToolsActivator.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// ========================================================================
-// Copyright (c) 2006-2011 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.osgi.equinoxtools;
-
-import javax.servlet.ServletException;
-
-import org.eclipse.jetty.osgi.equinoxtools.console.EquinoxChattingSupport;
-import org.eclipse.jetty.osgi.equinoxtools.console.EquinoxConsoleContinuationServlet;
-import org.eclipse.jetty.osgi.equinoxtools.console.EquinoxConsoleSyncServlet;
-import org.eclipse.jetty.osgi.equinoxtools.console.EquinoxConsoleWebSocketServlet;
-import org.eclipse.jetty.osgi.equinoxtools.console.WebConsoleSession;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.osgi.framework.console.ConsoleSession;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.http.HttpService;
-import org.osgi.service.http.NamespaceException;
-import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-
-/**
- * When started will register on the HttpService 3 servlets for 3 different styles of equinox consoles.
- */
-public class WebEquinoxToolsActivator implements BundleActivator
-{
-
- private static BundleContext context;
- public static BundleContext getContext()
- {
- return context;
- }
-
- private HttpService _httpService;
- private ServiceTracker _tracker;
- private EquinoxChattingSupport _equinoxChattingSupport;
-
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- public void start(BundleContext bundleContext) throws Exception
- {
- WebEquinoxToolsActivator.context = bundleContext;
-
- ServiceTrackerCustomizer httpServiceTrackerCustomizer = new ServiceTrackerCustomizer()
- {
- @Override
- public void removedService(ServiceReference reference, Object service)
- {
- _httpService = null;
- }
-
- @Override
- public void modifiedService(ServiceReference reference, Object service)
- {
- _httpService = (HttpService)context.getService(reference);
- }
-
- @Override
- public Object addingService(ServiceReference reference)
- {
- _httpService = (HttpService)context.getService(reference);
- try
- {
- //TODO; some effort to use the same console session on the 2 async console servlets?
-
- //websocket:
-// WebConsoleSession wsSession = new WebConsoleSession();
-// WebEquinoxConsoleActivator.context.registerService(ConsoleSession.class.getName(), wsSession, null);
-// EquinoxChattingSupport wsEquinoxChattingSupport = new EquinoxChattingSupport(wsSession);
- _httpService.registerResources("/equinoxconsole/ws/index.html","/equinoxconsole/ws/index.html",null);
- _httpService.registerServlet("/equinoxconsole/ws",new EquinoxConsoleWebSocketServlet(/*wsSession, wsEquinoxChattingSupport*/),null,null);
-
- //continuations:
-// WebConsoleSession contSession = new WebConsoleSession();
-// WebEquinoxConsoleActivator.context.registerService(ConsoleSession.class.getName(), contSession, null);
-// EquinoxChattingSupport contEquinoxChattingSupport = new EquinoxChattingSupport(contSession);
- _httpService.registerResources("/equinoxconsole/index.html","/equinoxconsole/index.html",null);
- _httpService.registerServlet("/equinoxconsole",new EquinoxConsoleContinuationServlet(/*contSession, contEquinoxChattingSupport*/),null,null);
-
- //legacy synchroneous; keep it in a separate console session.
- WebConsoleSession syncSession = new WebConsoleSession();
- WebEquinoxToolsActivator.context.registerService(ConsoleSession.class.getName(), syncSession, null);
- _httpService.registerServlet("/equinoxconsole/sync",new EquinoxConsoleSyncServlet(syncSession),null,null);
- }
- catch (ServletException e)
- {
- Log.warn(e);
- }
- catch (NamespaceException e)
- {
- Log.warn(e);
- }
- return _httpService;
- }
- };
-
- _tracker = new ServiceTracker(context,HttpService.class.getName(),httpServiceTrackerCustomizer);
- _tracker.open();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- public void stop(BundleContext bundleContext) throws Exception
- {
- _tracker.close();
- WebEquinoxToolsActivator.context = null;
- }
-
-
-}
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxChattingSupport.java b/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxChattingSupport.java
deleted file mode 100644
index fbb9cfaa1a..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxChattingSupport.java
+++ /dev/null
@@ -1,150 +0,0 @@
-// ========================================================================
-// Copyright (c) 2006-2011 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.osgi.equinoxtools.console;
-
-import java.util.LinkedList;
-import java.util.Queue;
-
-import org.eclipse.jetty.osgi.equinoxtools.console.WebConsoleWriterOutputStream.OnFlushListener;
-
-/**
- * Processing of the messages to be received and sent to the chat servlets.
- * Made to be extended for filtering of the messages and commands.
- */
-public class EquinoxChattingSupport
-{
-
- private WebConsoleSession _consoleSession;
-
- public EquinoxChattingSupport(WebConsoleSession consoleSession)
- {
- _consoleSession = consoleSession;
- }
-
- /**
- * Split the output into multiple lines.
- * Format them for the json messages sent to the chat.
- * Empties the console output from what is already displayed in the chat.
- * @return The lines to add to the message queue of each client.
- */
- protected Queue<String> processConsoleOutput(boolean escape, OnFlushListener onflush)
- {
- Queue<String> result = new LinkedList<String>();
- String toDisplay = _consoleSession.getOutputAsWriter().getBuffer().toString();
- //the last listener to be called is in charge of clearing the console.
- boolean clearConsole = _consoleSession.getOnFlushListeners().indexOf(onflush) == _consoleSession.getOnFlushListeners().size();
- if (clearConsole)
- {
- _consoleSession.clearOutput();
- }
- boolean lastLineIsComplete = toDisplay.endsWith("\n") || toDisplay.endsWith("\r");
- String[] lines = toDisplay.split("\n");
- String lastLine = lastLineIsComplete ? null : lines[lines.length-1];
- if (clearConsole)
- {
- _consoleSession.getOutputAsWriter().append(lastLine);
- }
- for (int lnNb = 0; lnNb < (lastLineIsComplete ? lines.length : lines.length-1); lnNb++)
- {
- String line = lines[lnNb];
- while (line.trim().startsWith("null"))
- {//hum..
- line = line.trim().substring("null".length()).trim();
- }
- if (line.startsWith("osgi>"))
- {
- result.add("osgi>");
- result.add(escape ? jsonEscapeString(line.substring("osgi>".length())) : line.substring("osgi>".length()));
- }
- else
- {
- result.add("&#10;");
- result.add(escape ? jsonEscapeString(line) : line);
- }
- }
- return result;
- }
-
- /**
- * http://www.ietf.org/rfc/rfc4627.txt
- * @param str
- * @return The same string escaped according to the JSON RFC.
- */
- public static String jsonEscapeString(String str)
- {
- StringBuilder sb = new StringBuilder();
- char[] asChars = str.toCharArray();
- for (char ch : asChars)
- {
- switch (ch)
- {
- //the reserved characters
- case '"':
- sb.append("\\\"");
- break;
- case '\\':
- sb.append("\\\\");
- break;
- case '\b':
- sb.append("\\b");
- break;
- case '\f':
- sb.append("\\f");
- break;
- case '\n':
- sb.append("\\n");
- break;
- case '\r':
- sb.append("\\r");
- break;
- case '\t':
- sb.append("\\t");
- break;
- case '/':
- sb.append("\\/");
- break;
- default:
- //The non reserved characters
- if (ch >= '\u0000' && ch <= '\u001F')
- {
- //escape as a unicode number when out of range.
- String ss = Integer.toHexString(ch);
- sb.append("\\u");
- for (int i = 0; i < 4 - ss.length(); i++)
- {
- //padding
- sb.append('0');
- }
- sb.append(ss.toUpperCase());
- }
- else
- {
- sb.append(ch);
- }
- }
- }
- return sb.toString();
- }
-
- public void broadcast(OnFlushListener source)
- {
- for (OnFlushListener onflush : _consoleSession.getOnFlushListeners())
- {
- if (onflush != source)
- {
- onflush.onFlush();
- }
- }
- }
-
-}
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleContinuationServlet.java b/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleContinuationServlet.java
deleted file mode 100644
index 4c99ce0ff2..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleContinuationServlet.java
+++ /dev/null
@@ -1,246 +0,0 @@
-// ========================================================================
-// Copyright (c) 2006-2011 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.osgi.equinoxtools.console;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Queue;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.continuation.Continuation;
-import org.eclipse.jetty.continuation.ContinuationSupport;
-import org.eclipse.jetty.osgi.equinoxtools.WebEquinoxToolsActivator;
-import org.eclipse.jetty.osgi.equinoxtools.console.WebConsoleWriterOutputStream.OnFlushListener;
-import org.eclipse.osgi.framework.console.ConsoleSession;
-
-/**
- * Async servlet with jetty continuations to interact with the equinox console.
- * Ported from jetty's example 'ChatServlet'
- */
-public class EquinoxConsoleContinuationServlet extends HttpServlet implements OnFlushListener
-{
-
- private static final long serialVersionUID = 1L;
- private Map<String,ConsoleUser> _consoleUsers = new HashMap<String, ConsoleUser>();
- private WebConsoleSession _consoleSession;
- private EquinoxChattingSupport _support;
-
- /**
- * @param consoleSession
- */
- public EquinoxConsoleContinuationServlet()
- {
-
- }
- /**
- * @param consoleSession
- */
- public EquinoxConsoleContinuationServlet(WebConsoleSession consoleSession, EquinoxChattingSupport support)
- {
- _consoleSession = consoleSession;
- _support = support;
- }
- @Override
- public void init() throws ServletException
- {
- if (_consoleSession == null)
- {
- _consoleSession = new WebConsoleSession();
- WebEquinoxToolsActivator.getContext().registerService(ConsoleSession.class.getName(), _consoleSession, null);
- }
- if (_support == null)
- {
- _support = new EquinoxChattingSupport(_consoleSession);
- }
- _consoleSession.addOnFlushListener(this);
- }
- @Override
- public void destroy()
- {
- _consoleSession.removeOnFlushListener(this);
- }
-
- // Serve the HTML with embedded CSS and Javascript.
- // This should be static content and should use real JS libraries.
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
- {
- if (request.getParameter("action")!=null)
- doPost(request,response);
- else
- response.sendRedirect("index.html");
- }
-
- // Handle Ajax calls from browser
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
- {
- // Ajax calls are form encoded
- String action = request.getParameter("action");
- String message = request.getParameter("message");
- String username = request.getParameter("user");
-
- if (action.equals("join"))
- join(request,response,username);
- else if (action.equals("poll"))
- poll(request,response,username);
- else if (action.equals("chat"))
- chat(request,response,username,message);
- }
-
- private synchronized void join(HttpServletRequest request,HttpServletResponse response,String username)
- throws IOException
- {
- ConsoleUser member = new ConsoleUser(username);
- _consoleUsers.put(username,member);
- response.setContentType("text/json;charset=utf-8");
- PrintWriter out=response.getWriter();
- out.print("{action:\"join\"}");
- }
-
- private synchronized void poll(HttpServletRequest request,HttpServletResponse response,String username)
- throws IOException
- {
- ConsoleUser member = _consoleUsers.get(username);
- if (member==null)
- {
- response.sendError(503);
- return;
- }
-
- synchronized(member)
- {
- if (member.getMessageQueue().size()>0)
- {
- // Send one chat message
- response.setContentType("text/json;charset=utf-8");
- StringBuilder buf=new StringBuilder();
-
- buf.append("{\"action\":\"poll\",");
- buf.append("\"from\":\"");
- buf.append(member.getMessageQueue().poll());
- buf.append("\",");
-
- String message = member.getMessageQueue().poll();
- int quote=message.indexOf('"');
- while (quote>=0)
- {
- message=message.substring(0,quote)+'\\'+message.substring(quote);
- quote=message.indexOf('"',quote+2);
- }
- buf.append("\"chat\":\"");
- buf.append(message);
- buf.append("\"}");
- byte[] bytes = buf.toString().getBytes("utf-8");
- response.setContentLength(bytes.length);
- response.getOutputStream().write(bytes);
- }
- else
- {
- Continuation continuation = ContinuationSupport.getContinuation(request);
- if (continuation.isInitial())
- {
- // No chat in queue, so suspend and wait for timeout or chat
- continuation.setTimeout(20000);
- continuation.suspend();
- member.setContinuation(continuation);
- }
- else
- {
- // Timeout so send empty response
- response.setContentType("text/json;charset=utf-8");
- PrintWriter out=response.getWriter();
- out.print("{action:\"poll\"}");
- }
- }
- }
- }
-
- private synchronized void chat(HttpServletRequest request,HttpServletResponse response,String username,String message)
- throws IOException
- {
- if (!message.endsWith("has joined!"))
- {
- _consoleSession.processCommand(message, false);
- }
- // Post chat to all members
- onFlush();
-
- response.setContentType("text/json;charset=utf-8");
- PrintWriter out=response.getWriter();
- out.print("{action:\"chat\"}");
- }
-
- /**
- * Called right after the flush method on the output stream has been executed.
- */
- public void onFlush()
- {
- Queue<String> pendingConsoleOutputMessages = _support.processConsoleOutput(true, this);
- for (ConsoleUser m:_consoleUsers.values())
- {
- synchronized (m)
- {
-// m.getMessageQueue().add("osgi>"); // from
-// m.getMessageQueue().add("something was printed"); // chat
- m.getMessageQueue().addAll(pendingConsoleOutputMessages);
-
- // wakeup member if polling
- if (m.getContinuation()!=null)
- {
- m.getContinuation().resume();
- m.setContinuation(null);
- }
- }
- }
- }
-
- class ConsoleUser
- {
- private String _name;
- private Continuation _continuation;
- private Queue<String> _queue = new LinkedList<String>();
-
- public ConsoleUser(String name)
- {
- _name = name;
- }
-
- public String getName()
- {
- return _name;
- }
-
- public void setContinuation(Continuation continuation)
- {
- _continuation = continuation;
- }
-
- public Continuation getContinuation()
- {
- return _continuation;
- }
- public Queue<String> getMessageQueue()
- {
- return _queue;
- }
-
- }
-}
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleSyncServlet.java b/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleSyncServlet.java
deleted file mode 100644
index 5ada26187e..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleSyncServlet.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// ========================================================================
-// Copyright (c) 2006-2011 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.osgi.equinoxtools.console;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-
-/**
- * Take the example ChatServlet and use it to make an Equinox Console on the web.
- */
-public class EquinoxConsoleSyncServlet extends HttpServlet
-{
-
- private static final long serialVersionUID = 1L;
-
- private WebConsoleSession _consoleSession;
-
- public EquinoxConsoleSyncServlet(WebConsoleSession consoleSession)
- {
- _consoleSession = consoleSession;
- }
-
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
- {
- String cmd = request.getParameter("cmd");
- String Action = request.getParameter("Action");
- if (Action != null && Action.toLowerCase().indexOf("clear") != -1)
- {
- _consoleSession.clearOutput();
- }
- if (cmd != null)
- {
- _consoleSession.processCommand(cmd, true);
- }
-
- response.setContentType("text/html;charset=utf-8");
- PrintWriter p = response.getWriter();
- p.println("<html><head><title>Equinox Console (Synchroneous)</title></head><body>");
- p.println("<textarea rows=\"30\" cols=\"110\">");
- p.println(_consoleSession.getOutputAsWriter().toString());
- p.println("</textarea>");
- p.println("<form method=\"GET\" action=\""+response.encodeURL(getURI(request))+"\">");
- p.println("osgi>&nbsp;<input type=\"text\" name=\"cmd\" value=\"\"/><br/>\n");
- p.println("<input type=\"submit\" name=\"Action\" value=\"Submit or Refresh\"><br/>");
- p.println("<input type=\"submit\" name=\"Action\" value=\"Clear and Submit\"><br/>");
- p.println("</form>");
- p.println("<br/>");
- }
-
-
- private String getURI(HttpServletRequest request)
- {
- String uri= (String)request.getAttribute("javax.servlet.forward.request_uri");
- if (uri == null)
- uri= request.getRequestURI();
- return uri;
- }
-
-}
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleWebSocketServlet.java b/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleWebSocketServlet.java
deleted file mode 100644
index 5f05c49272..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/EquinoxConsoleWebSocketServlet.java
+++ /dev/null
@@ -1,168 +0,0 @@
-// ========================================================================
-// Copyright (c) 2006-2011 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.osgi.equinoxtools.console;
-
-import java.io.IOException;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.osgi.equinoxtools.WebEquinoxToolsActivator;
-import org.eclipse.jetty.osgi.equinoxtools.console.WebConsoleWriterOutputStream.OnFlushListener;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.websocket.WebSocket;
-import org.eclipse.jetty.websocket.WebSocketServlet;
-import org.eclipse.osgi.framework.console.ConsoleSession;
-
-/**
- * Websocket version of the Chat with equinox.
- * Ported from jetty's example 'WebSocketChatServlet'
- */
-public class EquinoxConsoleWebSocketServlet extends WebSocketServlet implements OnFlushListener
-{
- private final Set<ChatWebSocket> _members = new CopyOnWriteArraySet<ChatWebSocket>();
- private static final long serialVersionUID = 1L;
- private WebConsoleSession _consoleSession;
- private EquinoxChattingSupport _support;
-
- public EquinoxConsoleWebSocketServlet()
- {
-
- }
- public EquinoxConsoleWebSocketServlet(WebConsoleSession consoleSession, EquinoxChattingSupport support)
- {
- _consoleSession = consoleSession;
- _support = support;
- }
- @Override
- public void init() throws ServletException
- {
- if (_consoleSession == null)
- {
- _consoleSession = new WebConsoleSession();
- WebEquinoxToolsActivator.getContext().registerService(ConsoleSession.class.getName(), _consoleSession, null);
- }
- if (_support == null)
- {
- _support = new EquinoxChattingSupport(_consoleSession);
- }
- super.init();
- _consoleSession.addOnFlushListener(this);
- }
-
- @Override
- public void destroy()
- {
- _consoleSession.removeOnFlushListener(this);
- }
-
-
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws javax.servlet.ServletException ,IOException
- {
- //getServletContext().getNamedDispatcher("default").forward(request,response);
- response.sendRedirect(request.getContextPath() + request.getServletPath()
- + (request.getPathInfo() != null ? request.getPathInfo() : "") + "/index.html");
- };
-
- public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
- {
- return new ChatWebSocket();
- }
-
- /* ------------------------------------------------------------ */
- /* ------------------------------------------------------------ */
- class ChatWebSocket implements WebSocket.OnTextMessage
- {
- Connection _connection;
- String _username;
-
- public void onOpen(Connection connection)
- {
- // Log.info(this+" onConnect");
- _connection=connection;
- _members.add(this);
- }
-
- public void onMessage(byte frame, byte[] data,int offset, int length)
- {
- // Log.info(this+" onMessage: "+TypeUtil.toHexString(data,offset,length));
- }
-
- public void onMessage(String data)
- {
- Log.info("onMessage: {}",data);
- if (data.indexOf("disconnect")>=0)
- _connection.disconnect();
- else
- {
- if (!data.endsWith(":has joined!"))
- {
- if (_username != null)
- {
- if (data.startsWith(_username + ":"))
- {
- data = data.substring(_username.length()+1);
- }
- else
- {
- //we should not be here?
- }
- }
- _consoleSession.processCommand(data, false);
- }
- else
- {
- _username = data.substring(0, data.length()-":has joined!".length());
- }
- // Log.info(this+" onMessage: "+data);
- onFlush();
- }
- }
-
- public void onClose(int code, String message)
- {
- // Log.info(this+" onDisconnect");
- _members.remove(this);
- }
-
- }
-
-
- /**
- * Called right after the flush method on the output stream has been executed.
- */
- public void onFlush()
- {
- Queue<String> pendingConsoleOutputMessages = _support.processConsoleOutput(false, this);
- for (ChatWebSocket member : _members)
- {
- try
- {
- for (String line : pendingConsoleOutputMessages)
- {
- member._connection.sendMessage(line);
- }
- }
- catch(IOException e)
- {
- Log.warn(e);
- }
- }
- }
-
-}
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/WebConsoleSession.java b/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/WebConsoleSession.java
deleted file mode 100644
index 614c0fc6c2..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/WebConsoleSession.java
+++ /dev/null
@@ -1,183 +0,0 @@
-// ========================================================================
-// Copyright (c) 2006-2011 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.osgi.equinoxtools.console;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.io.PrintStream;
-import java.io.StringWriter;
-import java.util.List;
-
-import org.eclipse.jetty.osgi.equinoxtools.console.WebConsoleWriterOutputStream.OnFlushListener;
-import org.eclipse.osgi.framework.console.ConsoleSession;
-
-/**
- * A simple console session for equinox.
- *
- * @author hmalphettes
- */
-public class WebConsoleSession extends ConsoleSession
-{
-
- private OutputStream _out;
- private StringWriter _outWriter;
- private PrintStream _source;
- private InputStream _in;
-
- public WebConsoleSession()
- {
- _outWriter = new StringWriter();
- _out = new WebConsoleWriterOutputStream(_outWriter,"UTF-8");
- try
- {
- PipedOutputStream source = new PipedOutputStream();
- PipedInputStream sink = new PipedInputStream(source);
- _in = sink;
- _source = new PrintStream(source);
- }
- catch (IOException e)
- {
- //this never happens?
- e.printStackTrace();
- }
- }
-
- @Override
- protected void doClose()
- {
- if (_out != null) try { _out.close(); } catch (IOException e) {}
- if (_in != null) try { _in.close(); } catch (IOException ioe) {}
- }
-
- @Override
- public InputStream getInput()
- {
- return _in;
- }
-
- @Override
- public OutputStream getOutput()
- {
- return _out;
- }
-
- /**
- * For the output we are using a string writer in fact.
- * @return
- */
- public StringWriter getOutputAsWriter()
- {
- return _outWriter;
- }
-
- /**
- * @return The print stream where commands can be written.
- */
- public PrintStream getSource()
- {
- return _source;
- }
-
- /**
- * Issue a command on the console.
- * @param cmd
- */
- public void issueCommand(String cmd)
- {
- if (cmd != null)
- {
- getSource().println(cmd);
- }
- }
-
- /**
- * @param flushListener Object that is called back when the outputstream is flushed.
- */
- public void addOnFlushListener(OnFlushListener flushListener)
- {
- ((WebConsoleWriterOutputStream)_out).addOnFlushListener(flushListener);
- }
- /**
- * @param flushListener Object that is called back when the outputstream is flushed.
- */
- public boolean removeOnFlushListener(OnFlushListener flushListener)
- {
- return ((WebConsoleWriterOutputStream)_out).removeOnFlushListener(flushListener);
- }
-
- /**
- * Process command comming from a web UI
- * @param cmd
- */
- public void processCommand(String cmd, boolean wait)
- {
- cmd = cmd.trim();
- while (cmd.startsWith("osgi>"))
- {
- cmd = cmd.substring("osgi>".length()).trim();
- }
- if (cmd.equals("clear"))
- {
- clearOutput();
- }
- else
- {
- getOutputAsWriter().append(cmd + "\n");
- int originalOutputLength = getOutputAsWriter().getBuffer().length();
- issueCommand(cmd);
-
- if (wait)
- {
- //it does not get uglier than this:
- //give a little time to equinox to interpret the command so we see the response
- //we could do a lot better, but we might as well use the async servlets anyways.
- int waitLoopNumber = 0;
- int lastWaitOutputLength = -1;
- while (waitLoopNumber < 10)
- {
- waitLoopNumber++;
- try
- {
- Thread.sleep(100);
- }
- catch (InterruptedException e)
- {
- break;
- }
- int newOutputLength = getOutputAsWriter().getBuffer().length();
- if (newOutputLength > originalOutputLength && newOutputLength == lastWaitOutputLength)
- {
- break;
- }
- lastWaitOutputLength = newOutputLength;
- }
- }
- }
-
- }
-
- public void clearOutput()
- {
- StringBuffer buf = getOutputAsWriter().getBuffer();
- if (buf.length() > 0) buf.delete(0,buf.length()-1);
- }
-
- public List<OnFlushListener> getOnFlushListeners()
- {
- return ((WebConsoleWriterOutputStream)_out).getOnFlushListeners();
- }
-
-}
diff --git a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/WebConsoleWriterOutputStream.java b/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/WebConsoleWriterOutputStream.java
deleted file mode 100644
index d9d26ea58a..0000000000
--- a/jetty-osgi/jetty-osgi-equinoxtools/src/main/java/org/eclipse/jetty/osgi/equinoxtools/console/WebConsoleWriterOutputStream.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// ========================================================================
-// Copyright (c) 2006-2011 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.osgi.equinoxtools.console;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Can be set with a listener that is called back right after the flush method is called.
- */
-public class WebConsoleWriterOutputStream extends org.eclipse.jetty.io.WriterOutputStream
-{
-
- /**
- * Interface called back after the outputstream is flushed.
- */
- public interface OnFlushListener
- {
- /**
- * Called right after the flush method on the output stream has been executed.
- */
- public void onFlush();
-
- }
-
- public interface MessageBroadcaster
- {
- public void broadcast();
- }
-
- private List<OnFlushListener> _callBacks;
-
- public WebConsoleWriterOutputStream(Writer writer, String encoding)
- {
- super(writer, encoding);
- }
-
- @Override
- public synchronized void flush() throws IOException
- {
- super.flush();
- if (_callBacks != null)
- {
- for (OnFlushListener listener : _callBacks)
- {
- listener.onFlush();
- }
- }
- }
-
- public synchronized void addOnFlushListener(OnFlushListener callback)
- {
- if (_callBacks == null)
- {
- _callBacks = new ArrayList<WebConsoleWriterOutputStream.OnFlushListener>();
- }
- if (!_callBacks.contains(callback))
- {
- _callBacks.add(callback);
- }
- }
- public synchronized boolean removeOnFlushListener(OnFlushListener callback)
- {
- if (_callBacks != null)
- {
- return _callBacks.remove(callback);
- }
- return false;
- }
- public synchronized List<OnFlushListener> getOnFlushListeners()
- {
- return _callBacks;
- }
-
-}
diff --git a/jetty-osgi/jetty-osgi-httpservice/META-INF/MANIFEST.MF b/jetty-osgi/jetty-osgi-httpservice/META-INF/MANIFEST.MF
index e148da8219..688b721821 100644
--- a/jetty-osgi/jetty-osgi-httpservice/META-INF/MANIFEST.MF
+++ b/jetty-osgi/jetty-osgi-httpservice/META-INF/MANIFEST.MF
@@ -1,16 +1,17 @@
+Manifest-Version: 1.0
Bundle-ManifestVersion: 2
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Name: OSGi HttpService provided by equinox HttpServiceServlet deployed on jetty
Bundle-SymbolicName: org.eclipse.jetty.osgi.httpservice
-Bundle-Version: 7.4.2.qualifier
+Bundle-Version: 8.0.0.qualifier
Bundle-Vendor: Mort Bay Consulting
-Bundle-Name: OSGi HttpService provided by equinox HttpServiceServlet deployed on jetty
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Jetty-ContextFilePath: contexts/httpservice.xml
-Import-Package: javax.servlet;version="2.5.0",
- javax.servlet.http;version="2.5.0",
+Import-Package: javax.servlet;version="3.0",
+ javax.servlet.http;version="3.0",
org.eclipse.equinox.http.servlet,
org.eclipse.jetty.server;version="7.0.0",
org.eclipse.jetty.server.handler;version="7.0.0",
org.eclipse.jetty.servlet;version="7.4.0",
org.eclipse.jetty.util.component;version="7.0.0"
-Export-Package: org.eclipse.jetty.osgi.httpservice;version="7.4.2"
+Export-Package: org.eclipse.jetty.osgi.httpservice;version="8.0.0"
diff --git a/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml b/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml
index 95757f6c80..211a8e8ce2 100644
--- a/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml
+++ b/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<!--
- Copyright (c) 2009 Intalio, Inc.
+ Copyright (c) 2009-2011 Intalio, Inc.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
@@ -29,4 +29,4 @@
<Set name="ErrorHandler">
<New class="org.eclipse.jetty.osgi.httpservice.HttpServiceErrorPageErrorHandler"/>
</Set>
-</Configure> \ No newline at end of file
+</Configure>
diff --git a/jetty-osgi/jetty-osgi-httpservice/pom.xml b/jetty-osgi/jetty-osgi-httpservice/pom.xml
index 2adff78949..07b8ba72f5 100644
--- a/jetty-osgi/jetty-osgi-httpservice/pom.xml
+++ b/jetty-osgi/jetty-osgi-httpservice/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.osgi</groupId>
<artifactId>jetty-osgi-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -31,8 +31,8 @@
<artifactId>org.eclipse.osgi</artifactId>
</dependency>
<dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
</dependency>
</dependencies>
@@ -45,7 +45,7 @@
<phase>process-resources</phase>
<configuration>
<tasks>
- <replace file="target/classes/META-INF/MANIFEST.MF" token="Bundle-Version: 7.4.2.qualifier" value="Bundle-Version: ${parsedVersion.osgiVersion}" />
+ <replace file="target/classes/META-INF/MANIFEST.MF" token="Bundle-Version: 8.0.0.qualifier" value="Bundle-Version: ${parsedVersion.osgiVersion}" />
<copy todir="target/classes/contexts">
<fileset dir="contexts" />
</copy>
diff --git a/jetty-osgi/jetty-osgi-httpservice/pom.xml.tycho b/jetty-osgi/jetty-osgi-httpservice/pom.xml.tycho
deleted file mode 100644
index c6efbeb50f..0000000000
--- a/jetty-osgi/jetty-osgi-httpservice/pom.xml.tycho
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>jetty-osgi</artifactId>
- <groupId>org.eclipse.jetty.osgi</groupId>
- <version>7.0.1-SNAPSHOT</version>
- </parent>
- <artifactId>org.eclipse.jetty.osgi.httpservice</artifactId>
- <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/jetty-osgi/jetty-osgi-servletbridge/pom.xml b/jetty-osgi/jetty-osgi-servletbridge/pom.xml
deleted file mode 100644
index 7c89dc4814..0000000000
--- a/jetty-osgi/jetty-osgi-servletbridge/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <parent>
- <groupId>org.eclipse.jetty.osgi</groupId>
- <artifactId>jetty-osgi-project</artifactId>
- <version>7.4.1-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.eclipse.jetty.osgi</groupId>
- <artifactId>jetty-osgi-servletbridge</artifactId>
- <name>Jetty :: OSGi :: Servletbridge</name>
- <description>Jetty OSGi Servletbridge webapp</description>
- <packaging>war</packaging>
- <dependencies>
- <dependency>
- <groupId>org.eclipse.equinox</groupId>
- <artifactId>org.eclipse.equinox.servletbridge</artifactId>
- <version>1.2.0.v20100503</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.osgi</groupId>
- <artifactId>org.eclipse.osgi</artifactId>
- <version>3.6.0.v20100517</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
- <repositories>
- <!-- can't find equinox servlet bridge jar on maven central.
- uploaded it to intalio.org for now. -->
- <repository>
- <id>intalio-org</id>
- <url>http://intalio.org/public/maven2</url>
- </repository>
- </repositories>
-</project>
diff --git a/jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/nested/Dump.java b/jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/nested/Dump.java
deleted file mode 100644
index 6895129e4f..0000000000
--- a/jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/nested/Dump.java
+++ /dev/null
@@ -1,1140 +0,0 @@
-package org.eclipse.jetty.nested;
-// ========================================================================
-// Copyright (c) 1996-2009 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.
-// ========================================================================
-
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.Statement;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Locale;
-import java.util.Map.Entry;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletRequestWrapper;
-import javax.servlet.ServletResponse;
-import javax.servlet.ServletResponseWrapper;
-import javax.servlet.UnavailableException;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-import javax.sql.DataSource;
-
-//import org.eclipse.jetty.continuation.Continuation;
-//import org.eclipse.jetty.continuation.ContinuationListener;
-//import org.eclipse.jetty.continuation.ContinuationSupport;
-//import org.eclipse.jetty.http.HttpHeaders;
-//import org.eclipse.jetty.util.StringUtil;
-//import org.eclipse.jetty.util.log.Log;
-
-
-
-/* ------------------------------------------------------------ */
-/** Dump Servlet Request.
- *
- */
-public class Dump extends HttpServlet
-{
- boolean fixed;
-
- /* ------------------------------------------------------------ */
- @Override
- public void init(ServletConfig config) throws ServletException
- {
- super.init(config);
-
- if (config.getInitParameter("unavailable")!=null && !fixed)
- {
-
- fixed=true;
- throw new UnavailableException("Unavailable test",Integer.parseInt(config.getInitParameter("unavailable")));
- }
- }
-
- /* ------------------------------------------------------------ */
- @Override
- public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
- {
- doGet(request, response);
- }
-
- /* ------------------------------------------------------------ */
- @Override
- public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
- {
- // Handle a dump of data
- final String data= request.getParameter("data");
- final String chars= request.getParameter("chars");
- final String block= request.getParameter("block");
- final String dribble= request.getParameter("dribble");
- final boolean flush= request.getParameter("flush")!=null?Boolean.parseBoolean(request.getParameter("flush")):false;
-
-
- if(request.getPathInfo()!=null && request.getPathInfo().toLowerCase().indexOf("script")!=-1)
- {
- response.sendRedirect(response.encodeRedirectURL(getServletContext().getContextPath() + "/dump/info"));
- return;
- }
-
- request.setCharacterEncoding("UTF-8");
-
- if (request.getParameter("empty")!=null)
- {
- response.setStatus(200);
- response.flushBuffer();
- return;
- }
-
-/* if (request.getParameter("sleep")!=null)
- {
- try
- {
- long s = Long.parseLong(request.getParameter("sleep"));
- if (request.getHeader(HttpHeaders.EXPECT)!=null &&request.getHeader(HttpHeaders.EXPECT).indexOf("102")>=0)
- {
- Thread.sleep(s/2);
- response.sendError(102);
- Thread.sleep(s/2);
- }
- else
- Thread.sleep(s);
- }
- catch (InterruptedException e)
- {
- return;
- }
- catch (Exception e)
- {
- throw new ServletException(e);
- }
- }
-
- if (request.getAttribute("RESUME")==null && request.getParameter("resume")!=null)
- {
- request.setAttribute("RESUME",Boolean.TRUE);
-
- final long resume=Long.parseLong(request.getParameter("resume"));
- new Thread(new Runnable()
- {
- public void run()
- {
- try
- {
- Thread.sleep(resume);
- }
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }
- Continuation continuation = ContinuationSupport.getContinuation(request);
- continuation.resume();
- }
-
- }).start();
- }
-
- if (request.getParameter("complete")!=null)
- {
- final long complete=Long.parseLong(request.getParameter("complete"));
- new Thread(new Runnable()
- {
- public void run()
- {
- try
- {
- Thread.sleep(complete);
- }
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }
- try
- {
- response.setContentType("text/html");
- response.getOutputStream().println("<h1>COMPLETED</h1>");
- Continuation continuation = ContinuationSupport.getContinuation(request);
- continuation.complete();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
-
- }).start();
- }
-
- if (request.getParameter("suspend")!=null && request.getAttribute("SUSPEND")!=Boolean.TRUE)
- {
- request.setAttribute("SUSPEND",Boolean.TRUE);
- try
- {
- Continuation continuation = ContinuationSupport.getContinuation(request);
- continuation.setTimeout(Long.parseLong(request.getParameter("suspend")));
- continuation.suspend();
-
- continuation.addContinuationListener(new ContinuationListener()
- {
- public void onTimeout(Continuation continuation)
- {
- response.addHeader("Dump","onTimeout");
- try
- {
- dump(response,data,chars,block,dribble,flush);
- continuation.complete();
- }
- catch (IOException e)
- {
- Log.ignore(e);
- }
- }
-
- public void onComplete(Continuation continuation)
- {
- response.addHeader("Dump","onComplete");
- }
- });
-
- continuation.undispatch();
- }
- catch(Exception e)
- {
- throw new ServletException(e);
- }
- } */
-
- request.setAttribute("Dump", this);
- getServletContext().setAttribute("Dump",this);
- // getServletContext().log("dump "+request.getRequestURI());
-
- // Force a content length response
- String length= request.getParameter("length");
- if (length != null && length.length() > 0)
- {
- response.setContentLength(Integer.parseInt(length));
- }
-
- // Handle a dump of data
- if (dump(response,data,chars,block,dribble,flush))
- return;
-
- // handle an exception
- String info= request.getPathInfo();
- if (info != null && info.endsWith("Exception"))
- {
- try
- {
- throw (Throwable) Thread.currentThread().getContextClassLoader().loadClass(info.substring(1)).newInstance();
- }
- catch (Throwable th)
- {
- throw new ServletException(th);
- }
- }
-
- // test a reset
- String reset= request.getParameter("reset");
- if (reset != null && reset.length() > 0)
- {
- response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
- response.setHeader("SHOULD_NOT","BE SEEN");
- response.reset();
- }
-
-
- // handle an redirect
- String redirect= request.getParameter("redirect");
- if (redirect != null && redirect.length() > 0)
- {
- response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
- response.sendRedirect(response.encodeRedirectURL(redirect));
- try
- {
- response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
- }
- catch(IOException e)
- {
- // ignored as stream is closed.
- }
- return;
- }
-
- // handle an error
- String error= request.getParameter("error");
- if (error != null && error.length() > 0 && request.getAttribute("javax.servlet.error.status_code")==null)
- {
- response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
- response.sendError(Integer.parseInt(error));
- try
- {
- response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
- }
- catch(IllegalStateException e)
- {
- try
- {
- response.getWriter().println("NOR THIS!!");
- }
- catch(IOException e2){}
- }
- catch(IOException e){}
- return;
- }
-
- // Handle a extra headers
- String headers= request.getParameter("headers");
- if (headers != null && headers.length() > 0)
- {
- long h=Long.parseLong(headers);
- for (int i=0;i<h;i++)
- response.addHeader("Header"+i,"Value"+i);
- }
-
- String buffer= request.getParameter("buffer");
- if (buffer != null && buffer.length() > 0)
- response.setBufferSize(Integer.parseInt(buffer));
-
- String charset= request.getParameter("charset");
- if (charset==null)
- charset="UTF-8";
- response.setCharacterEncoding(charset);
- response.setContentType("text/html");
-
- if (info != null && info.indexOf("Locale/") >= 0)
- {
- try
- {
- String locale_name= info.substring(info.indexOf("Locale/") + 7);
- Field f= java.util.Locale.class.getField(locale_name);
- response.setLocale((Locale)f.get(null));
- }
- catch (Exception e)
- {
- e.printStackTrace();
- response.setLocale(Locale.getDefault());
- }
- }
-
- String cn= request.getParameter("cookie");
- String cv=request.getParameter("cookiev");
- if (cn!=null && cv!=null)
- {
- Cookie cookie= new Cookie(cn, cv);
- if (request.getParameter("version")!=null)
- cookie.setVersion(Integer.parseInt(request.getParameter("version")));
- cookie.setComment("Cookie from dump servlet");
- response.addCookie(cookie);
- }
-
- String pi= request.getPathInfo();
- if (pi != null && pi.startsWith("/ex"))
- {
- OutputStream out= response.getOutputStream();
- out.write("</H1>This text should be reset</H1>".getBytes());
- if ("/ex0".equals(pi))
- throw new ServletException("test ex0", new Throwable());
- else if ("/ex1".equals(pi))
- throw new IOException("test ex1");
- else if ("/ex2".equals(pi))
- throw new UnavailableException("test ex2");
- else if (pi.startsWith("/ex3/"))
- throw new UnavailableException("test ex3",Integer.parseInt(pi.substring(5)));
- throw new RuntimeException("test");
- }
-
- if ("true".equals(request.getParameter("close")))
- response.setHeader("Connection","close");
-
- String buffered= request.getParameter("buffered");
-
- PrintWriter pout=null;
-
- try
- {
- pout =response.getWriter();
- }
- catch(IllegalStateException e)
- {
- pout=new PrintWriter(new OutputStreamWriter(response.getOutputStream(),charset));
- }
- if (buffered!=null)
- pout = new PrintWriter(new BufferedWriter(pout,Integer.parseInt(buffered)));
-
- try
- {
- pout.write("<html>\n<body>\n");
- pout.write("<h1>Dump Servlet</h1>\n");
- pout.write("<table width=\"95%\">");
- pout.write("<tr>\n");
- pout.write("<th align=\"right\">getMethod:&nbsp;</th>");
- pout.write("<td>" + notag(request.getMethod())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getContentLength:&nbsp;</th>");
- pout.write("<td>"+Integer.toString(request.getContentLength())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getContentType:&nbsp;</th>");
- pout.write("<td>"+notag(request.getContentType())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getRequestURI:&nbsp;</th>");
- pout.write("<td>"+notag(request.getRequestURI())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getRequestURL:&nbsp;</th>");
- pout.write("<td>"+notag(request.getRequestURL().toString())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getContextPath:&nbsp;</th>");
- pout.write("<td>"+request.getContextPath()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getServletPath:&nbsp;</th>");
- pout.write("<td>"+notag(request.getServletPath())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getPathInfo:&nbsp;</th>");
- pout.write("<td>"+notag(request.getPathInfo())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getPathTranslated:&nbsp;</th>");
- pout.write("<td>"+notag(request.getPathTranslated())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getQueryString:&nbsp;</th>");
- pout.write("<td>"+notag(request.getQueryString())+"</td>");
- pout.write("</tr><tr>\n");
-
- pout.write("<th align=\"right\">getProtocol:&nbsp;</th>");
- pout.write("<td>"+request.getProtocol()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getScheme:&nbsp;</th>");
- pout.write("<td>"+request.getScheme()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getServerName:&nbsp;</th>");
- pout.write("<td>"+notag(request.getServerName())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getServerPort:&nbsp;</th>");
- pout.write("<td>"+Integer.toString(request.getServerPort())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getLocalName:&nbsp;</th>");
- pout.write("<td>"+request.getLocalName()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getLocalAddr:&nbsp;</th>");
- pout.write("<td>"+request.getLocalAddr()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getLocalPort:&nbsp;</th>");
- pout.write("<td>"+Integer.toString(request.getLocalPort())+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getRemoteUser:&nbsp;</th>");
- pout.write("<td>"+request.getRemoteUser()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getUserPrincipal:&nbsp;</th>");
- pout.write("<td>"+request.getUserPrincipal()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getRemoteAddr:&nbsp;</th>");
- pout.write("<td>"+request.getRemoteAddr()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getRemoteHost:&nbsp;</th>");
- pout.write("<td>"+request.getRemoteHost()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getRemotePort:&nbsp;</th>");
- pout.write("<td>"+request.getRemotePort()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getRequestedSessionId:&nbsp;</th>");
- pout.write("<td>"+request.getRequestedSessionId()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">isSecure():&nbsp;</th>");
- pout.write("<td>"+request.isSecure()+"</td>");
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">isUserInRole(admin):&nbsp;</th>");
- pout.write("<td>"+request.isUserInRole("admin")+"</td>");
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getLocale:&nbsp;</th>");
- pout.write("<td>"+request.getLocale()+"</td>");
-
- Enumeration locales= request.getLocales();
- while (locales.hasMoreElements())
- {
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getLocales:&nbsp;</th>");
- pout.write("<td>"+locales.nextElement()+"</td>");
- }
- pout.write("</tr><tr>\n");
-
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Other HTTP Headers:</big></th>");
- Enumeration h= request.getHeaderNames();
- String name;
- while (h.hasMoreElements())
- {
- name= (String)h.nextElement();
-
- Enumeration h2= request.getHeaders(name);
- while (h2.hasMoreElements())
- {
- String hv= (String)h2.nextElement();
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">"+notag(name)+":&nbsp;</th>");
- pout.write("<td>"+notag(hv)+"</td>");
- }
- }
-
- //Test the system properties
- if ("true".equals(request.getParameter("env")))
- {
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Environment:&nbsp;</big></th>");
- for (Entry e : System.getenv().entrySet())
- {
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">" + notag(String.valueOf(e.getKey())) + ":&nbsp;</th>");
- pout.write("<td>"+notag(String.valueOf(e.getValue()))+"</td>");
- }
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>System-Properties:&nbsp;</big></th>");
-
- for (Entry<Object, Object> e : System.getProperties().entrySet())
- {
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">" + notag(String.valueOf(e.getKey())) + ":&nbsp;</th>");
- pout.write("<td>"+notag(String.valueOf(e.getValue()))+"</td>");
- }
- }
-
- //handle testing jdbc connections:
- String jdbcUrl = request.getParameter("jdbc-url");
- String jdbcDriver = request.getParameter("jdbc-driver");
- if (jdbcUrl != null)
- {
- Connection con = null;
- try
- {
- String user = request.getParameter("jdbc-user");
- String pass = request.getParameter("jdbc-pass");
- String query = request.getParameter("jdbc-query");
- if (user.length() == 0) user = null;
- if (pass.length() == 0) pass = null;
- if (query == null || query.length() == 0) query = "show tables;";
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>JDBC test:&nbsp;</big></th>");
-
- Class driver = Thread.currentThread().getContextClassLoader().loadClass(jdbcDriver);
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">Driver class:&nbsp;</th>");
- pout.write("<td>"+driver.getName()+" loaded by " + driver.getClassLoader()+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">Connection url:&nbsp;</th>");
- pout.write("<td>"+jdbcUrl+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">User (optional):&nbsp;</th>");
- pout.write("<td>"+user+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">Is there a password (optional):&nbsp;</th>");
- pout.write("<td>"+(pass != null ? "yes" : "no" )+"</td>");
-
- con = user != null ? DriverManager.getConnection(jdbcUrl, user, pass) : DriverManager.getConnection(jdbcUrl);
-
- Statement statement = con.createStatement();
- boolean success = statement.execute(query);
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">Query:&nbsp;</th>");
- pout.write("<td>"+query+"</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">Successful query:&nbsp;</th>");
- pout.write("<td>"+success+"</td>");
-
- }
- catch (Throwable t)
- {
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">JDBC test error:&nbsp;</th>");
- pout.write("<td>"+t+"</td>");
- }
- finally
- {
- if (con != null)
- {
- try { con.close(); } catch (Throwable ee) {}
- }
- }
- }
-
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Request Parameters:</big></th>");
- h= request.getParameterNames();
- while (h.hasMoreElements())
- {
- name= (String)h.nextElement();
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">"+notag(name)+":&nbsp;</th>");
- pout.write("<td>"+notag(request.getParameter(name))+"</td>");
- String[] values= request.getParameterValues(name);
- if (values == null)
- {
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">"+notag(name)+" Values:&nbsp;</th>");
- pout.write("<td>"+"NULL!"+"</td>");
- }
- else if (values.length > 1)
- {
- for (int i= 0; i < values.length; i++)
- {
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">"+notag(name)+"["+i+"]:&nbsp;</th>");
- pout.write("<td>"+notag(values[i])+"</td>");
- }
- }
- }
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Cookies:</big></th>");
- Cookie[] cookies = request.getCookies();
- for (int i=0; cookies!=null && i<cookies.length;i++)
- {
- Cookie cookie = cookies[i];
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">"+notag(cookie.getName())+":&nbsp;</th>");
- pout.write("<td>"+notag(cookie.getValue())+"</td>");
- }
-
- String content_type=request.getContentType();
- if (content_type!=null &&
- !content_type.startsWith("application/x-www-form-urlencoded") &&
- !content_type.startsWith("multipart/form-data"))
- {
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" valign=\"top\" colspan=\"2\"><big><br/>Content:</big></th>");
- pout.write("</tr><tr>\n");
- pout.write("<td><pre>");
- char[] content= new char[4096];
- int len;
- try{
- Reader in=request.getReader();
-
- while((len=in.read(content))>=0)
- pout.write(notag(new String(content,0,len)));
- }
- catch(IOException e)
- {
- pout.write(e.toString());
- }
-
- pout.write("</pre></td>");
- }
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Request Attributes:</big></th>");
- Enumeration a= request.getAttributeNames();
- while (a.hasMoreElements())
- {
- name= (String)a.nextElement();
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\" valign=\"top\">"+name.replace("."," .")+":&nbsp;</th>");
- Object value=request.getAttribute(name);
- if (value instanceof File)
- {
- File file = (File)value;
- pout.write("<td>"+"<pre>" + file.getName()+" ("+file.length()+" "+new Date(file.lastModified())+ ")</pre>"+"</td>");
- }
- else
- pout.write("<td>"+"<pre>" + toString(request.getAttribute(name)) + "</pre>"+"</td>");
- }
- request.setAttribute("org.eclipse.jetty.servlet.MultiPartFilter.files",null);
-
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Servlet InitParameters:</big></th>");
- a= getInitParameterNames();
- while (a.hasMoreElements())
- {
- name= (String)a.nextElement();
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">"+name+":&nbsp;</th>");
- pout.write("<td>"+ toString(getInitParameter(name)) +"</td>");
- }
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>ServletContext Misc:</big></th>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\" valign=\"top\">"+"servletContext.getContextPath()"+":&nbsp;</th>");
- pout.write("<td>"+ getServletContext().getContextPath() + "</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\" valign=\"top\">"+"getServletContext().getRealPath(\"/WEB-INF/\")"+":&nbsp;</th>");
- pout.write("<td>"+ getServletContext().getRealPath("/WEB-INF/") + "</td>");
-
- String webinfRealPath = getServletContext().getRealPath("/WEB-INF/");
- if (webinfRealPath != null)
- {
- try
- {
- File webInfRealPathFile = new File(webinfRealPath);
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\" valign=\"top\">"+"new File(getServletContext().getRealPath(\"/WEB-INF/\"))"+":&nbsp;</th>");
- pout.write("<td>exists()="+ webInfRealPathFile.exists()
- + "; isFile()="+webInfRealPathFile.isFile()
- + "; isDirectory()="+webInfRealPathFile.isDirectory()
- + "; isAbsolute()=" + webInfRealPathFile.isAbsolute()
- + "; canRead()=" + webInfRealPathFile.canRead()
- + "; canWrite()=" + webInfRealPathFile.canWrite()
- +"</td>");
- if (webInfRealPathFile.exists() && webInfRealPathFile.isDirectory())
- {
- File webxml = new File(webInfRealPathFile, "web.xml");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\" valign=\"top\">"+"new File(getServletContext().getRealPath(\"/WEB-INF/web.xml\"))"+":&nbsp;</th>");
- pout.write("<td>exists()="+ webxml.exists()
- + "; isFile()="+webxml.isFile()
- + "; isDirectory()="+webxml.isDirectory()
- + "; isAbsolute()=" + webxml.isAbsolute()
- + "; canRead()=" + webxml.canRead()
- + "; canWrite()=" + webxml.canWrite()
- +"</td>");
- }
- }
- catch (Throwable t)
- {
- pout.write("<th align=\"right\" valign=\"top\">"+"Error probing the java.io.File(getServletContext().getRealPath(\"/WEB-INF/\"))"+":&nbsp;</th>");
- pout.write("<td>"+ t + "</td>");
- }
- }
-
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\" valign=\"top\">"+"getServletContext().getServerInfo()"+":&nbsp;</th>");
- pout.write("<td>"+ getServletContext().getServerInfo() + "</td>");
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\" valign=\"top\">"+"getServletContext().getServletContextName()"+":&nbsp;</th>");
- pout.write("<td>"+ getServletContext().getServletContextName() + "</td>");
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Context InitParameters:</big></th>");
- a= getServletContext().getInitParameterNames();
- while (a.hasMoreElements())
- {
- name= (String)a.nextElement();
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\" valign=\"top\">"+name.replace("."," .")+":&nbsp;</th>");
- pout.write("<td>"+ toString(getServletContext().getInitParameter(name)) + "</td>");
- }
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Context Attributes:</big></th>");
- a= getServletContext().getAttributeNames();
- while (a.hasMoreElements())
- {
- name= (String)a.nextElement();
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\" valign=\"top\">"+name.replace("."," .")+":&nbsp;</th>");
- pout.write("<td>"+"<pre>" + toString(getServletContext().getAttribute(name)) + "</pre>"+"</td>");
- }
-
- String res= request.getParameter("resource");
- if (res != null && res.length() > 0)
- {
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Get Resource: \""+res+"\"</big></th>");
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getServletContext().getContext(...):&nbsp;</th>");
-
- ServletContext context = getServletContext().getContext(res);
- pout.write("<td>"+context+"</td>");
-
- if (context!=null)
- {
- String cp=context.getContextPath();
- if (cp==null || "/".equals(cp))
- cp="";
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getServletContext().getContext(...),getRequestDispatcher(...):&nbsp;</th>");
- pout.write("<td>"+getServletContext().getContext(res).getRequestDispatcher(res.substring(cp.length()))+"</td>");
- }
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">this.getClass().getResource(...):&nbsp;</th>");
- pout.write("<td>"+this.getClass().getResource(res)+"</td>");
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">this.getClass().getClassLoader().getResource(...):&nbsp;</th>");
- pout.write("<td>"+this.getClass().getClassLoader().getResource(res)+"</td>");
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">Thread.currentThread().getContextClassLoader().getResource(...):&nbsp;</th>");
- pout.write("<td>"+Thread.currentThread().getContextClassLoader().getResource(res)+"</td>");
-
- pout.write("</tr><tr>\n");
- pout.write("<th align=\"right\">getServletContext().getResource(...):&nbsp;</th>");
- try{pout.write("<td>"+getServletContext().getResource(res)+"</td>");}
- catch(Exception e) {pout.write("<td>"+"" +e+"</td>");}
- }
-
-
- pout.write("</tr></table>\n");
-
- /* ------------------------------------------------------------ */
- pout.write("<h2>Request Wrappers</h2>\n");
- ServletRequest rw=request;
- int w=0;
- while (rw !=null)
- {
- pout.write((w++)+": "+rw.getClass().getName()+"<br/>");
- if (rw instanceof HttpServletRequestWrapper)
- rw=((HttpServletRequestWrapper)rw).getRequest();
- else if (rw instanceof ServletRequestWrapper)
- rw=((ServletRequestWrapper)rw).getRequest();
- else
- rw=null;
- }
-
- /* ------------------------------------------------------------ */
- pout.write("<h2>Response Wrappers</h2>\n");
- ServletResponse rsw=response;
- w=0;
- while (rsw !=null)
- {
- pout.write((w++)+": "+rsw.getClass().getName()+"<br/>");
- if (rsw instanceof HttpServletResponseWrapper)
- rsw=((HttpServletResponseWrapper)rsw).getResponse();
- else if (rsw instanceof ServletResponseWrapper)
- rsw=((ServletResponseWrapper)rsw).getResponse();
- else
- rsw=null;
- }
-
- pout.write("<br/>");
- pout.write("<h2>International Characters (UTF-8)</h2>");
- pout.write("LATIN LETTER SMALL CAPITAL AE<br/>\n");
- pout.write("Directly uni encoded(\\u1d01): \u1d01<br/>");
- pout.write("HTML reference (&amp;AElig;): &AElig;<br/>");
- pout.write("Decimal (&amp;#7425;): &#7425;<br/>");
- pout.write("Javascript unicode (\\u1d01) : <script language='javascript'>document.write(\"\u1d01\");</script><br/>");
- pout.write("<br/>");
- pout.write("<h2>Form to generate GET content</h2>");
- pout.write("<form method=\"GET\" action=\""+response.encodeURL(getURI(request))+"\">");
- pout.write("TextField: <input type=\"text\" name=\"TextField\" value=\"value\"/><br/>\n");
- pout.write("<input type=\"submit\" name=\"Action\" value=\"Submit\">");
- pout.write("</form>");
-
- pout.write("<br/>");
-
- pout.write("<h2>Form to generate POST content</h2>");
- pout.write("<form method=\"POST\" accept-charset=\"utf-8\" action=\""+response.encodeURL(getURI(request))+"\">");
- pout.write("TextField: <input type=\"text\" name=\"TextField\" value=\"value\"/><br/>\n");
- pout.write("Select: <select multiple name=\"Select\">\n");
- pout.write("<option>ValueA</option>");
- pout.write("<option>ValueB1,ValueB2</option>");
- pout.write("<option>ValueC</option>");
- pout.write("</select><br/>");
- pout.write("<input type=\"submit\" name=\"Action\" value=\"Submit\"><br/>");
- pout.write("</form>");
- pout.write("<br/>");
-
- pout.write("<h2>Form to generate UPLOAD content</h2>");
- pout.write("<form method=\"POST\" enctype=\"multipart/form-data\" accept-charset=\"utf-8\" action=\""+
- response.encodeURL(getURI(request))+(request.getQueryString()==null?"":("?"+request.getQueryString()))+
- "\">");
- pout.write("TextField: <input type=\"text\" name=\"TextField\" value=\"comment\"/><br/>\n");
- pout.write("File 1: <input type=\"file\" name=\"file1\" /><br/>\n");
- pout.write("File 2: <input type=\"file\" name=\"file2\" /><br/>\n");
- pout.write("<input type=\"submit\" name=\"Action\" value=\"Submit\"><br/>");
- pout.write("</form>");
-
- pout.write("<h2>Form to set Cookie</h2>");
- pout.write("<form method=\"POST\" action=\""+response.encodeURL(getURI(request))+"\">");
- pout.write("cookie: <input type=\"text\" name=\"cookie\" /><br/>\n");
- pout.write("value: <input type=\"text\" name=\"cookiev\" /><br/>\n");
- pout.write("<input type=\"submit\" name=\"Action\" value=\"setCookie\">");
- pout.write("</form>\n");
-
- pout.write("<h2>Form to get Resource</h2>");
- pout.write("<form method=\"POST\" action=\""+response.encodeURL(getURI(request))+"\">");
- pout.write("resource: <input type=\"text\" name=\"resource\" /><br/>\n");
- pout.write("<input type=\"submit\" name=\"Action\" value=\"getResource\">");
- pout.write("</form>\n");
-
- pout.write("<h2>Form to test a JDBC connection URL</h2>");
- String jdbcUser = request.getParameter("jdbc-user");
- if (jdbcUser == null || jdbcUser.length() == 0) jdbcUser = "root";
- String jdbcPass = request.getParameter("jdbc-pass");
- if (jdbcPass == null) jdbcPass = "";
- String jdbcDriverr = request.getParameter("jdbc-driver");
- if (jdbcDriverr == null || jdbcDriverr.length() == 0) jdbcDriverr = "com.mysql.jdbc.Driver";
- String jdbcQuery = request.getParameter("jdbc-query");
- if (jdbcQuery == null || jdbcQuery.length() == 0) jdbcQuery = "show tables;";
- String jdbcUrll = request.getParameter("jdbc-url");
- if (jdbcUrll == null || jdbcUrll.length() == 0) jdbcUrll = "jdbc:mysql://127.0.0.1:3306/example";
- pout.write("<form method=\"POST\" accept-charset=\"utf-8\" action=\""+response.encodeURL(getURI(request))+"\">");
- pout.write("JDBC Driver class: <input type=\"text\" name=\"jdbc-driver\" value=\"" + jdbcDriverr + "\"/><br/>\n");
- pout.write("JDBC URL: <input type=\"text\" name=\"jdbc-url\" value=\"" + jdbcUrll + "\"/><br/>\n");
- pout.write("JDBC Username: <input type=\"text\" name=\"jdbc-user\" value=\"" + jdbcUser + "\"/><br/>\n");
- pout.write("JDBC Password: <input type=\"text\" name=\"jdbc-pass\" value=\"" + jdbcPass + "\"/><br/>\n");
- pout.write("JDBC Query: <input type=\"text\" name=\"jdbc-query\" value=\"" + jdbcQuery + "\"/><br/>\n");
- pout.write("<input type=\"submit\" name=\"Action\" value=\"Submit\"><br/>");
- pout.write("</form>");
- pout.write("<br/>");
-
- }
- catch (Exception e)
- {
- getServletContext().log("dump", e);
- }
-
- String lines= request.getParameter("lines");
- if (lines!=null)
- {
- char[] line = "<span>A line of characters. Blah blah blah blah. blooble blooble</span></br>\n".toCharArray();
- for (int l=Integer.parseInt(lines);l-->0;)
- {
- pout.write("<span>"+l+" </span>");
- pout.write(line);
- }
- }
-
- pout.write("</body>\n</html>\n");
-
- pout.close();
-
- if (pi != null)
- {
- if ("/ex4".equals(pi))
- throw new ServletException("test ex4", new Throwable());
- if ("/ex5".equals(pi))
- throw new IOException("test ex5");
- if ("/ex6".equals(pi))
- throw new UnavailableException("test ex6");
- }
-
-
- }
-
-
- /* ------------------------------------------------------------ */
- @Override
- public String getServletInfo()
- {
- return "Dump Servlet";
- }
-
- /* ------------------------------------------------------------ */
- @Override
- public synchronized void destroy()
- {
- }
-
- /* ------------------------------------------------------------ */
- private String getURI(HttpServletRequest request)
- {
- String uri= (String)request.getAttribute("javax.servlet.forward.request_uri");
- if (uri == null)
- uri= request.getRequestURI();
- return uri;
- }
-
- /* ------------------------------------------------------------ */
- private static String toString(Object o)
- {
- if (o == null)
- return null;
-
- try
- {
- if (o.getClass().isArray())
- {
- StringBuffer sb = new StringBuffer();
- if (!o.getClass().getComponentType().isPrimitive())
- {
- Object[] array= (Object[])o;
- for (int i= 0; i < array.length; i++)
- {
- if (i > 0)
- sb.append("\n");
- sb.append(array.getClass().getComponentType().getName());
- sb.append("[");
- sb.append(i);
- sb.append("]=");
- sb.append(toString(array[i]));
- }
- return sb.toString();
- }
- else
- {
- int length = Array.getLength(o);
- for (int i=0;i<length;i++)
- {
- if (i > 0)
- sb.append("\n");
- sb.append(o.getClass().getComponentType().getName());
- sb.append("[");
- sb.append(i);
- sb.append("]=");
- sb.append(toString(Array.get(o, i)));
- }
- return sb.toString();
- }
- }
- else
- return o.toString();
- }
- catch (Exception e)
- {
- return e.toString();
- }
- }
-
- private boolean dump(HttpServletResponse response, String data, String chars, String block, String dribble, boolean flush) throws IOException
- {
- if (data != null && data.length() > 0)
- {
- long d=Long.parseLong(data);
- int b=(block!=null&&block.length()>0)?Integer.parseInt(block):50;
- byte[] buf=new byte[b];
- for (int i=0;i<b;i++)
- {
-
- buf[i]=(byte)('0'+(i%10));
- if (i%10==9)
- buf[i]=(byte)'\n';
- }
- buf[0]='o';
- OutputStream out=response.getOutputStream();
- response.setContentType("text/plain");
- while (d > 0)
- {
- if (b==1)
- {
- out.write(d%80==0?'\n':'.');
- d--;
- }
- else if (d>=b)
- {
- out.write(buf);
- d=d-b;
- }
- else
- {
- out.write(buf,0,(int)d);
- d=0;
- }
-
- if (dribble!=null)
- {
- out.flush();
- try
- {
- Thread.sleep(Long.parseLong(dribble));
- }
- catch (Exception e)
- {
- e.printStackTrace();
- break;
- }
- }
-
- }
-
- if (flush)
- out.flush();
-
- return true;
- }
-
- // Handle a dump of data
- if (chars != null && chars.length() > 0)
- {
- long d=Long.parseLong(chars);
- int b=(block!=null&&block.length()>0)?Integer.parseInt(block):50;
- char[] buf=new char[b];
- for (int i=0;i<b;i++)
- {
- buf[i]=(char)('0'+(i%10));
- if (i%10==9)
- buf[i]='\n';
- }
- buf[0]='o';
- response.setContentType("text/plain");
- PrintWriter out=response.getWriter();
- while (d > 0 && !out.checkError())
- {
- if (b==1)
- {
- out.write(d%80==0?'\n':'.');
- d--;
- }
- else if (d>=b)
- {
- out.write(buf);
- d=d-b;
- }
- else
- {
- out.write(buf,0,(int)d);
- d=0;
- }
- }
- return true;
- }
- return false;
- }
-
- private String notag(String s)
- {
- if (s==null)
- return "null";
- s=replace(s,"&","&amp;");
- s=replace(s,"<","&lt;");
- s=replace(s,">","&gt;");
- return s;
- }
-
- /**
- * replace substrings within string.
- */
- public static String replace(String s, String sub, String with)
- {
- int c=0;
- int i=s.indexOf(sub,c);
- if (i == -1)
- return s;
-
- StringBuffer buf = new StringBuffer(s.length()+with.length());
-
- synchronized(buf)
- {
- do
- {
- buf.append(s.substring(c,i));
- buf.append(with);
- c=i+sub.length();
- } while ((i=s.indexOf(sub,c))!=-1);
-
- if (c<s.length())
- buf.append(s.substring(c,s.length()));
-
- return buf.toString();
- }
- }
-}
diff --git a/jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/osgi/servletbridge/FrameworkLauncherExtended.java b/jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/osgi/servletbridge/FrameworkLauncherExtended.java
deleted file mode 100644
index 52a926d384..0000000000
--- a/jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/osgi/servletbridge/FrameworkLauncherExtended.java
+++ /dev/null
@@ -1,606 +0,0 @@
-// ========================================================================
-// Copyright (c) 2010-2011 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.osgi.servletbridge;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Properties;
-import java.util.TreeMap;
-import java.util.jar.Attributes;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.zip.ZipEntry;
-
-import org.eclipse.equinox.servletbridge.FrameworkLauncher;
-
-/**
- * Extend the servletbridge FrameworkLauncher to support launching an equinox installation
- * made by p2director.
- */
-public class FrameworkLauncherExtended extends FrameworkLauncher
-{
-
- /**
- * if the OSGI_INSTALL_AREA installed area is specified as a sytem property and matches a Folder on the file system, we don't copy the whole eclipse
- * installation instead we use that folder as it is
- */
- private static final String DEPLOY_IN_PLACE_WHEN_INSTALL_AREA_IS_FOLDER = "org.eclipse.equinox.servletbridge.deployinplace"; //$NON-NLS-1$
- public static final String FRAMEWORK_BOOTDELEGATION = "org.osgi.framework.bootdelegation";
-
- private boolean deployedInPlace = false;
- private URL resourceBaseAsURL = null;
-
- /**
- * try to find the resource base for this webapp by looking for the launcher initialization file.
- */
- protected void initResourceBase()
- {
- try
- {
- String resourceBaseStr = System.getProperty(OSGI_INSTALL_AREA);
- if (resourceBaseStr == null || resourceBaseStr.length() == 0)
- {
- resourceBaseStr = config.getInitParameter(OSGI_INSTALL_AREA);
- }
- if (resourceBaseStr != null && resourceBaseStr.length() != 0)
- {
- // If the path starts with a reference to a system property, resolve it.
- resourceBaseStr = resolveSystemProperty(resourceBaseStr);
- if (resourceBaseStr.startsWith("/WEB-INF/"))
- {
- String rpath = context.getRealPath(resourceBaseStr);
- if (rpath != null)
- {
- File rpathFile = new File(rpath);
- if (rpathFile.exists() && rpathFile.isDirectory() && rpathFile.canWrite())
- {
- resourceBaseStr = rpath;
- }
- }
- }
-
- if (resourceBaseStr.startsWith("file://"))
- {
- resourceBaseAsURL = new URL(resourceBaseStr.replace(" ","%20")); //$NON-NLS-1$ //$NON-NLS-2$
- }
- else if (new File(resourceBaseStr).exists())
- {
- resourceBaseAsURL = new URL("file://" + new File(resourceBaseStr).getCanonicalPath().replace(" ","%20")); //$NON-NLS-1$ //$NON-NLS-2$
- }
- else
- {
- resourceBaseAsURL = context.getResource(resourceBaseStr);
- }
- }
- else
- {
- if (context.getResource(RESOURCE_BASE + ECLIPSE) != null)
- {
- resourceBase = RESOURCE_BASE + ECLIPSE;
- }
- else
- {
- super.initResourceBase();
- }
- resourceBaseAsURL = context.getResource(resourceBase);
- }
- }
- catch (MalformedURLException e)
- {
- // ignore
- }
- catch (IOException e)
- {
- // ignore
- }
- if (resourceBaseAsURL != null && resourceBaseAsURL.getProtocol().equals("file")) { //$NON-NLS-1$
- File resBase = new File(resourceBaseAsURL.getPath());
- if (resBase.exists() && resBase.isDirectory()
- && !Boolean.FALSE.toString().equalsIgnoreCase(System.getProperty(DEPLOY_IN_PLACE_WHEN_INSTALL_AREA_IS_FOLDER)))
- {
- __setPlatformDirectory(resBase);
- deployedInPlace = true;
- }
- }
- }
-
- /**
- * Override this method to be able to set default system properties computed on the fly depending on the environment where equinox and jetty-osgi are
- * deployed.
- *
- * @param resource
- * - The target to read properties from
- * @return the properties
- */
- protected Properties loadProperties(String resource)
- {
- Properties props = super.loadProperties(resource);
- if (resource.equals(resourceBase + LAUNCH_INI) && deployedInPlace)
- {
- String osgiInstall = props.getProperty(OSGI_INSTALL_AREA);
- if (osgiInstall == null)
- {
- // compute the osgi install dynamically.
- props.put(OSGI_INSTALL_AREA,getPlatformDirectory().getAbsolutePath());
- }
- String osgiFramework = props.getProperty(OSGI_FRAMEWORK);
- File pluginsFolder = null;
- if (osgiFramework == null && getPlatformDirectory() != null)
- {
- File osgiFrameworkF = findOsgiFramework(getPlatformDirectory());
- pluginsFolder = osgiFrameworkF.getParentFile();
- props.put(OSGI_FRAMEWORK,osgiFrameworkF.getAbsoluteFile().getAbsolutePath());
- }
- String osgiFrameworkExtensions = props.getProperty(OSGI_FRAMEWORK_EXTENSIONS);
- if (osgiFrameworkExtensions == null)
- {
- //this bundle will make the javax.servlet and javax.servlet.http packages passed from
- //the bootstrap classloader into equinox
- osgiFrameworkExtensions = "org.eclipse.equinox.servletbridge.extensionbundle";
- }
- File configIni = new File(getPlatformDirectory(), "configuration/config.ini");
- Properties configIniProps = new Properties();
- if (configIni.exists())
- {
- System.out.println("Got the " + configIni.getAbsolutePath());
- InputStream configIniStream = null;
- try
- {
- configIniStream = new FileInputStream(configIni);
- configIniProps.load(configIniStream);
- }
- catch (IOException ioe)
- {
-
- }
- finally
- {
- try { configIniStream.close(); } catch (IOException ioe2) {}
- }
- String confIniFrameworkExt = configIniProps.getProperty(OSGI_FRAMEWORK_EXTENSIONS);
- if (confIniFrameworkExt != null)
- {
- osgiFrameworkExtensions = osgiFrameworkExtensions + "," + confIniFrameworkExt;
- }
- }
- else
- {
- System.out.println("Unable to locate the " + configIni.getAbsolutePath());
- }
- props.setProperty(OSGI_FRAMEWORK_EXTENSIONS,osgiFrameworkExtensions);
- //__deployExtensionBundle(pluginsFolder);
- deployExtensionBundle(pluginsFolder, true);
-
-
- String bootDeleg = props.getProperty(FRAMEWORK_BOOTDELEGATION);
- if (bootDeleg == null)
- {
- bootDeleg = configIniProps.getProperty(FRAMEWORK_BOOTDELEGATION);
- }
- if (bootDeleg == null || bootDeleg.indexOf("javax.servlet.http") == -1)
- {
- String add = "javax.servlet,javax.servlet.http,javax.servlet.resources";
- if (bootDeleg != null)
- {
- bootDeleg += add;
- }
- else
- {
- bootDeleg = add;
- }
- props.setProperty(FRAMEWORK_BOOTDELEGATION, bootDeleg);
- }
-
- String jettyHome = System.getProperty("jetty.home");
- if (jettyHome == null)
- {
- jettyHome = getPlatformDirectory().getAbsolutePath();
- System.setProperty("jetty.home",jettyHome);
- props.setProperty("jetty.home",jettyHome);
- }
- else
- {
- jettyHome = resolveSystemProperty(jettyHome);
- }
- String etcJettyXml = System.getProperty("jetty.etc.config.urls");
- if (etcJettyXml == null)
- {
- if (new File(jettyHome,"etc/jetty-osgi-nested.xml").exists())
- {
- System.setProperty("jetty.etc.config.urls","etc/jetty-osgi-nested.xml");
- props.setProperty("jetty.etc.config.urls","etc/jetty-osgi-nested.xml");
- }
- }
- String startLevel = System.getProperty("osgi.startLevel");
- if (startLevel == null)
- {
- startLevel = props.getProperty("osgi.startLevel");
- if (startLevel == null)
- {
- startLevel = configIniProps.getProperty("osgi.startLevel");
- }
- if (startLevel != null)
- {
- props.setProperty("osgi.startLevel",startLevel);
- System.setProperty("osgi.startLevel",startLevel);
- }
- }
- String logback = System.getProperty("logback.configurationFile");
- if (logback == null)
- {
- File etcLogback = new File(jettyHome,"etc/logback.xml");
- if (etcLogback.exists())
- {
- System.setProperty("logback.configurationFile",etcLogback.getAbsolutePath());
- props.setProperty("logback.configurationFile",etcLogback.getAbsolutePath());
- }
- }
- else
- {
- logback = resolveSystemProperty(logback);
- }
- System.out.println("sysout: logback.configurationFile=" + System.getProperty("logback.configurationFile"));
- }
- return props;
- }
-
- /**
- * Look for the eclipse.ini file. or any *.ini Search for the argument -startup The next line is a relative path to the launcher osgi bundle:
- * ../bundlepool/plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar Get that file, get the parent folder. This is where the plugins are located. In
- * that folder look for the
- *
- * @param installFolder
- * @return The osgi framework bundle.
- */
- private File findOsgiFramework(File installFolder)
- {
- File[] fs = installFolder.listFiles();
- for (int i = 0; i < fs.length; i++)
- {
- File f = fs[i];
- if (f.isFile() && f.getName().endsWith(".ini") && !f.getName().equals(LAUNCH_INI)) { //$NON-NLS-1$
- BufferedReader br = null;
- try
- {
- br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
- String line = null;
- String pathToLauncherJar = null;
- boolean gotStartArg = false;
- while ((line = br.readLine()) != null)
- {
- if (gotStartArg)
- {
- pathToLauncherJar = line.trim();
- if (pathToLauncherJar.length() == 0)
- {
- continue;
- }
- break;
- }
- else if (line.trim().equals("-startup")) { //$NON-NLS-1$
- gotStartArg = true;
- }
- }
- if (pathToLauncherJar != null)
- {
- File currFolder = getPlatformDirectory();
- String oriStartup = pathToLauncherJar;
- while (pathToLauncherJar.startsWith("../")) { //$NON-NLS-1$
- currFolder = currFolder.getParentFile();
- pathToLauncherJar = pathToLauncherJar.substring(3);
- }
- File pluginsfolder = new File(currFolder,pathToLauncherJar).getParentFile();
- // System.err.println("Got the pluginsfolder " + pluginsfolder);
- if (!pluginsfolder.exists())
- {
- throw new IllegalStateException("The -startup argument in " + f.getPath() + //$NON-NLS-1$
- " is " + oriStartup + ". It points to " + pluginsfolder.getPath() + //$NON-NLS-1$ //$NON-NLS-2$
- " plugins directory that does not exists."); //$NON-NLS-1$
- }
- TreeMap osgis = new TreeMap();
- File[] plugins = pluginsfolder.listFiles();
- for (int j = 0; j < plugins.length; j++)
- {
- File b = plugins[j];
- if (b.isFile() && b.getName().startsWith(FRAMEWORK_BUNDLE_NAME + "_") && b.getName().endsWith(".jar")) { //$NON-NLS-1$ //$NON-NLS-2$
- osgis.put(b.getName(),b);
- }
- }
- if (osgis.isEmpty())
- {
- throw new IllegalStateException("The -startup argument in " + f.getPath() + //$NON-NLS-1$
- " is " + oriStartup + //$NON-NLS-1$
- ". It points to " + pluginsfolder.getPath() + //$NON-NLS-1$
- " plugins directory but there is no org.eclipse.osgi.*.jar files there."); //$NON-NLS-1$
- }
- File osgiFramework = (File)osgis.values().iterator().next();
- String path = osgiFramework.getPath();
- System.err.println("Using " + path + " for the osgi framework.");
- return osgiFramework;
- }
- }
- catch (IOException ioe)
- {
- //
- }
- finally
- {
- if (br != null)
- try
- {
- br.close();
- }
- catch (IOException ii)
- {
- }
- }
-
- }
- }
- return null;
- }
-
- /**
- * recursively substitute the ${sysprop} by their actual system property.
- * ${sysprop,defaultvalue} will use 'defaultvalue' as the value if no sysprop is defined.
- * Not the most efficient code but we are shooting for simplicity and speed of development here.
- *
- * @param value
- * @return
- */
- public static String resolveSystemProperty(String value)
- {
- int ind = value.indexOf("${");
- if (ind == -1) {
- return value;
- }
- int ind2 = value.indexOf('}', ind);
- if (ind2 == -1) {
- return value;
- }
- String sysprop = value.substring(ind+2, ind2);
- String defaultValue = null;
- int comma = sysprop.indexOf(',');
- if (comma != -1 && comma+1 != sysprop.length())
- {
- defaultValue = sysprop.substring(comma+1);
- defaultValue = resolveSystemProperty(defaultValue);
- sysprop = sysprop.substring(0,comma);
- }
- else
- {
- defaultValue = "${" + sysprop + "}";
- }
-
- String v = System.getProperty(sysprop);
-
- String reminder = value.length() > ind2 + 1 ? value.substring(ind2+1) : "";
- reminder = resolveSystemProperty(reminder);
- if (v != null)
- {
- return value.substring(0, ind) + v + reminder;
- }
- else
- {
- return value.substring(0, ind) + defaultValue + reminder;
- }
- }
-
-
-
- // introspection trick to be able to set the private field platformDirectory
- private static Field _field;
- void __setPlatformDirectory(File platformDirectory)
- {
- try
- {
- if (_field == null)
- {
- _field = org.eclipse.equinox.servletbridge.FrameworkLauncher.class.getDeclaredField("platformDirectory"); //$NON-NLS-1$
- _field.setAccessible(true);
- }
- _field.set(this,platformDirectory);
- }
- catch (SecurityException e)
- {
- e.printStackTrace();
- }
- catch (NoSuchFieldException e)
- {
- e.printStackTrace();
- }
- catch (IllegalArgumentException e)
- {
- e.printStackTrace();
- }
- catch (IllegalAccessException e)
- {
- e.printStackTrace();
- }
- }
-
- //introspection trick to invoke the generateExtensionBundle method
- private static Method _deployExtensionBundleMethod;
- private void __deployExtensionBundle(File plugins)
- {
- //look for the extensionbundle
- //if it is already there no need to do something:
- for (String file : plugins.list())
- {
- if (file.startsWith("org.eclipse.equinox.servletbridge.extensionbundle"))//EXTENSIONBUNDLE_DEFAULT_BSN
- {
- return;
- }
- }
-
- try
- {
- //invoke deployExtensionBundle(File plugins)
- if (_deployExtensionBundleMethod == null)
- {
- _deployExtensionBundleMethod = FrameworkLauncher.class.getDeclaredMethod("deployExtensionBundle", File.class);
- _deployExtensionBundleMethod.setAccessible(true);
- }
- _deployExtensionBundleMethod.invoke(this, plugins);
- }
- catch (Throwable t)
- {
- t.printStackTrace();
- }
- }
-//--end of introspection to invoke deployExtensionBundle
-
-//from Framework with support for the equinox hook
- private static final String EXTENSIONBUNDLE_DEFAULT_BSN = "org.eclipse.equinox.servletbridge.extensionbundle"; //$NON-NLS-1$
- private static final String EXTENSIONBUNDLE_DEFAULT_VERSION = "1.2.0"; //$NON-NLS-1$
- private static final String MANIFEST_VERSION = "Manifest-Version"; //$NON-NLS-1$
- private static final String BUNDLE_MANIFEST_VERSION = "Bundle-ManifestVersion"; //$NON-NLS-1$
- private static final String BUNDLE_NAME = "Bundle-Name"; //$NON-NLS-1$
- private static final String BUNDLE_SYMBOLIC_NAME = "Bundle-SymbolicName"; //$NON-NLS-1$
- private static final String BUNDLE_VERSION = "Bundle-Version"; //$NON-NLS-1$
- private static final String FRAGMENT_HOST = "Fragment-Host"; //$NON-NLS-1$
- private static final String EXPORT_PACKAGE = "Export-Package"; //$NON-NLS-1$
-
- private static final String CONFIG_EXTENDED_FRAMEWORK_EXPORTS = "extendedFrameworkExports"; //$NON-NLS-1$
-
- private void deployExtensionBundle(File plugins, boolean configureEquinoxHook) {
- // we might want to parameterize the extension bundle BSN in the future
- final String extensionBundleBSN = EXTENSIONBUNDLE_DEFAULT_BSN;
- File extensionBundleFile = findExtensionBundleFile(plugins, extensionBundleBSN);
-
- if (extensionBundleFile == null)
- generateExtensionBundle(plugins, extensionBundleBSN, EXTENSIONBUNDLE_DEFAULT_VERSION, configureEquinoxHook);
- else /*if (Boolean.valueOf(config.getInitParameter(CONFIG_OVERRIDE_AND_REPLACE_EXTENSION_BUNDLE)).booleanValue())*/ {
- String extensionBundleVersion = findExtensionBundleVersion(extensionBundleFile, extensionBundleBSN);
- if (extensionBundleFile.isDirectory()) {
- deleteDirectory(extensionBundleFile);
- } else {
- extensionBundleFile.delete();
- }
- generateExtensionBundle(plugins, extensionBundleBSN, extensionBundleVersion, true);
-// } else {
-// processExtensionBundle(extensionBundleFile);
- }
- }
-
- private File findExtensionBundleFile(File plugins, final String extensionBundleBSN) {
- FileFilter extensionBundleFilter = new FileFilter() {
- public boolean accept(File candidate) {
- return candidate.getName().startsWith(extensionBundleBSN + "_"); //$NON-NLS-1$
- }
- };
- File[] extensionBundles = plugins.listFiles(extensionBundleFilter);
- if (extensionBundles.length == 0)
- return null;
-
- if (extensionBundles.length > 1) {
- for (int i = 1; i < extensionBundles.length; i++) {
- if (extensionBundles[i].isDirectory()) {
- deleteDirectory(extensionBundles[i]);
- } else {
- extensionBundles[i].delete();
- }
- }
- }
- return extensionBundles[0];
- }
-
- private String findExtensionBundleVersion(File extensionBundleFile, String extensionBundleBSN) {
- String fileName = extensionBundleFile.getName();
- if (fileName.endsWith(".jar")) {
- return fileName.substring(extensionBundleBSN.length() + 1, fileName.length() - ".jar".length());
- }
- return fileName.substring(extensionBundleBSN.length() + 1);
- }
-
-
- private void generateExtensionBundle(File plugins, String extensionBundleBSN, String extensionBundleVersion,
- boolean configureEquinoxHook) {
- Manifest mf = new Manifest();
- Attributes attribs = mf.getMainAttributes();
- attribs.putValue(MANIFEST_VERSION, "1.0"); //$NON-NLS-1$
- attribs.putValue(BUNDLE_MANIFEST_VERSION, "2"); //$NON-NLS-1$
- attribs.putValue(BUNDLE_NAME, "Servletbridge Extension Bundle"); //$NON-NLS-1$
- attribs.putValue(BUNDLE_SYMBOLIC_NAME, extensionBundleBSN);
- attribs.putValue(BUNDLE_VERSION, extensionBundleVersion);
- attribs.putValue(FRAGMENT_HOST, "system.bundle; extension:=framework"); //$NON-NLS-1$
-
- String servletVersion = context.getMajorVersion() + "." + context.getMinorVersion(); //$NON-NLS-1$
- String packageExports = "org.eclipse.equinox.servletbridge; version=1.1" + //$NON-NLS-1$
- ", javax.servlet; version=" + servletVersion + //$NON-NLS-1$
- ", javax.servlet.http; version=" + servletVersion + //$NON-NLS-1$
- ", javax.servlet.resources; version=" + servletVersion; //$NON-NLS-1$
-
- String extendedExports = config.getInitParameter(CONFIG_EXTENDED_FRAMEWORK_EXPORTS);
- if (extendedExports != null && extendedExports.trim().length() != 0)
- packageExports += ", " + extendedExports; //$NON-NLS-1$
-
- attribs.putValue(EXPORT_PACKAGE, packageExports);
- writeJarFile(new File(plugins, extensionBundleBSN + "_" + extensionBundleVersion + ".jar"), mf, configureEquinoxHook); //$NON-NLS-1$
- }
-
- private void writeJarFile(File jarFile, Manifest mf, boolean configureEquinoxHook) {
- try {
- JarOutputStream jos = null;
- try {
- jos = new JarOutputStream(new FileOutputStream(jarFile), mf);
-
- if (configureEquinoxHook) {
- //hook configurator properties:
- ZipEntry e = new ZipEntry("hookconfigurators.properties");
- jos.putNextEntry(e);
- Properties props = new Properties();
- props.put("hook.configurators", "org.eclipse.jetty.osgi.servletbridge.hook.ServletBridgeClassLoaderDelegateHook");
- props.store(jos, "");
- jos.closeEntry();
-
- //the hook class
- e = new ZipEntry("org/eclipse/jetty/osgi/servletbridge/hook/ServletBridgeClassLoaderDelegateHook.class");
- jos.putNextEntry(e);
- InputStream in = getClass().getResourceAsStream("/org/eclipse/jetty/osgi/servletbridge/hook/ServletBridgeClassLoaderDelegateHook.class");
-
- byte[] buffer = new byte[512];
- try {
- int n;
- while ((n = in.read(buffer)) != -1)
- {
- jos.write(buffer, 0, n);
- }
- } finally {
- in.close();
- }
- jos.closeEntry();
- }
-
- jos.finish();
- } finally {
- if (jos != null)
- jos.close();
- }
- } catch (IOException e) {
- context.log("Error writing extension bundle", e); //$NON-NLS-1$
- }
- }
-//--from Framework with support for the equinox hook
-
-}
diff --git a/jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/osgi/servletbridge/hook/ServletBridgeClassLoaderDelegateHook.java b/jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/osgi/servletbridge/hook/ServletBridgeClassLoaderDelegateHook.java
deleted file mode 100644
index 7bc82a566a..0000000000
--- a/jetty-osgi/jetty-osgi-servletbridge/src/main/java/org/eclipse/jetty/osgi/servletbridge/hook/ServletBridgeClassLoaderDelegateHook.java
+++ /dev/null
@@ -1,106 +0,0 @@
-// ========================================================================
-// Copyright (c) 2010-2011 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.osgi.servletbridge.hook;
-
-import java.io.FileNotFoundException;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.adaptor.EclipseStarter;
-import org.eclipse.osgi.baseadaptor.HookConfigurator;
-import org.eclipse.osgi.baseadaptor.HookRegistry;
-import org.eclipse.osgi.framework.adaptor.BundleClassLoader;
-import org.eclipse.osgi.framework.adaptor.BundleData;
-import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegateHook;
-import org.eclipse.osgi.internal.loader.BundleLoader;
-
-/**
- * With some complex osgi products, experience shows that using
- * a system bundle extension to pass certain packages from the bootstrapping
- * server to equinox fails.
- * The bundles keep loading javax.servlet.http from the javax.servlet bundle.
- * This class is in fact copied into the servletbridge.extensionbundle; it is not loaded by the webapp.
- */
-public class ServletBridgeClassLoaderDelegateHook implements ClassLoaderDelegateHook, HookConfigurator
-{
-
- private static Set<String> packagesInBootstrapClassLoader = new HashSet<String>();
- static
- {
- packagesInBootstrapClassLoader.add("javax.servlet");
- packagesInBootstrapClassLoader.add("javax.servlet.http");
- }
-
- public void addHooks(HookRegistry hookRegistry)
- {
- hookRegistry.addClassLoaderDelegateHook(this);
- }
-
- public Class preFindClass(String name, BundleClassLoader classLoader,
- BundleData data) throws ClassNotFoundException
- {
- String pkgName = BundleLoader.getPackageName(name);
- if (packagesInBootstrapClassLoader.contains(pkgName))
- {
- return EclipseStarter.class.getClassLoader().loadClass(name);
- }
- return null;
- }
-
- public Class postFindClass(String name, BundleClassLoader classLoader,
- BundleData data) throws ClassNotFoundException
- {
- return null;
- }
-
- public URL preFindResource(String name, BundleClassLoader classLoader,
- BundleData data) throws FileNotFoundException
- {
- return null;
- }
-
- public URL postFindResource(String name, BundleClassLoader classLoader,
- BundleData data) throws FileNotFoundException
- {
- return null;
- }
-
- public Enumeration preFindResources(String name,
- BundleClassLoader classLoader, BundleData data)
- throws FileNotFoundException
- {
- return null;
- }
-
- public Enumeration postFindResources(String name,
- BundleClassLoader classLoader, BundleData data)
- throws FileNotFoundException
- {
- return null;
- }
-
- public String preFindLibrary(String name, BundleClassLoader classLoader,
- BundleData data) throws FileNotFoundException
- {
- return null;
- }
-
- public String postFindLibrary(String name, BundleClassLoader classLoader,
- BundleData data)
- {
- return null;
- }
-
-}
diff --git a/jetty-osgi/jetty-osgi-servletbridge/src/main/webapp/WEB-INF/web.xml b/jetty-osgi/jetty-osgi-servletbridge/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index c538c7c9bb..0000000000
--- a/jetty-osgi/jetty-osgi-servletbridge/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
- <display-name>jettyservletbridge</display-name>
- <servlet id="proxy">
- <servlet-name>proxy</servlet-name>
- <display-name>Transparent Proxy Servlet and Equinox Framework Controller</display-name>
- <description>Transparent Proxy Servlet and Equinox Framework Controller</description>
- <servlet-class>org.eclipse.equinox.servletbridge.BridgeServlet</servlet-class>
- <!-- Point to a folder where an equinox installation exists.
- When this parameter is defined, that equinox installation is launched in place.
- The parameter can also be passed as a system property. -->
- <init-param>
- <param-name>osgi.install.area</param-name>
- <param-value>/WEB-INF/eclipse</param-value>
- </init-param>
- <init-param>
- <param-name>commandline</param-name>
- <param-value>-console</param-value>
- </init-param>
- <init-param>
- <param-name>enableFrameworkControls</param-name>
- <param-value>true</param-value>
- </init-param>
- <!--
- org.eclipse.equinox.servletbridge and the Servlet API are exported automatically to the underlying OSGi framework.
- The extendedFrameworkExports parameter allows the specification of additional java package exports.
- The format is a comma separated list of exports as specified by the "Export-Package" bundle manifest header.
- For example: com.mycompany.exports; version=1.0.0, com.mycompany.otherexports; version=1.0.0
- -->
- <init-param>
- <param-name>extendedFrameworkExports</param-name>
- <param-value></param-value>
- </init-param>
-
- <!--
- You can specify your own framework launcher here.
- The default is: org.eclipse.equinox.servletbridge.FrameworkLauncher -->
- <init-param>
- <param-name>frameworkLauncherClass</param-name>
- <param-value>org.eclipse.jetty.osgi.servletbridge.FrameworkLauncherExtended</param-value>
- <!--param-value>org.eclipse.equinox.servletbridge.FrameworkLauncher</param-value-->
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
-
- <servlet>
- <servlet-name>dump</servlet-name>
- <servlet-class>org.eclipse.jetty.nested.Dump</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>dump</servlet-name>
- <url-pattern>/dump/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>proxy</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
-
-</web-app> \ No newline at end of file
diff --git a/jetty-osgi/pom.xml b/jetty-osgi/pom.xml
index a7ebe3b862..6f38abe84e 100644
--- a/jetty-osgi/pom.xml
+++ b/jetty-osgi/pom.xml
@@ -3,7 +3,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>org.eclipse.jetty.osgi</groupId>
@@ -15,17 +15,16 @@
<osgi-services-version>3.2.100.v20100503</osgi-services-version>
<equinox-http-servlet-version>1.0.0-v20070606</equinox-http-servlet-version>
<!--equinox-servletbridge-version>1.0.0-v20070523</equinox-servletbridge-version-->
- <jsp-2.1-glassfish-version>2.1.v20100127</jsp-2.1-glassfish-version>
+ <jsp-api-2.2-tomcat-version>7.0.8</jsp-api-2.2-tomcat-version>
+ <el-api-2.2-tomcat-version>7.0.8</el-api-2.2-tomcat-version>
<logback-version>0.9.18</logback-version>
<slf4j-version>1.5.11</slf4j-version>
</properties>
<modules>
<module>jetty-osgi-boot</module>
<module>jetty-osgi-boot-jsp</module>
- <module>jetty-osgi-boot-logback</module>
<module>jetty-osgi-boot-warurl</module>
<module>jetty-osgi-httpservice</module>
- <module>jetty-osgi-equinoxtools</module>
<module>test-jetty-osgi</module>
</modules>
<build>
@@ -75,6 +74,11 @@
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-annotations</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-continuation</artifactId>
<version>${project.version}</version>
</dependency>
@@ -138,15 +142,20 @@
<artifactId>servletbridge</artifactId>
<version>${equinox-servletbridge-version}</version>
</dependency-->
- <dependency>
+ <!-- not ready <dependency>
<groupId>org.mortbay.jetty</groupId>
- <artifactId>jsp-2.1-glassfish</artifactId>
- <version>${jsp-2.1-glassfish-version}</version>
+ <artifactId>jsp-impl</artifactId>
+ <version>${jsp-impl-2.2-glassfish-version}</version>
+ </dependency-->
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-jsp-api</artifactId>
+ <version>${jsp-api-2.2-tomcat-version}</version>
</dependency>
<dependency>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jsp-api-2.1-glassfish</artifactId>
- <version>${jsp-2.1-glassfish-version}</version>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-el-api</artifactId>
+ <version>${el-api-2.2-tomcat-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
diff --git a/jetty-osgi/test-jetty-osgi/pom.xml b/jetty-osgi/test-jetty-osgi/pom.xml
index 51ff0fe095..6349ee83b6 100644
--- a/jetty-osgi/test-jetty-osgi/pom.xml
+++ b/jetty-osgi/test-jetty-osgi/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty.osgi</groupId>
<artifactId>jetty-osgi-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -12,20 +12,21 @@
<description>Jetty OSGi Integration test</description>
<properties>
<bundle-symbolic-name>${project.groupId}.boot.test</bundle-symbolic-name>
- <jetty-orbit-url>http://download.eclipse.org/jetty/orbit/</jetty-orbit-url>
+ <jetty-orbit-url>http://download.eclipse.org/jetty/orbit</jetty-orbit-url>
<assembly-directory>target/distribution</assembly-directory>
<eclipse-ecj-version>3.6</eclipse-ecj-version>
- <orbit-javax-activation-version>${javax-activation-version}.0.v201005080500</orbit-javax-activation-version>
- <orbit-javax-annotation-version>1.0.0.v20100513-0750</orbit-javax-annotation-version>
- <orbit-javax-el-version>2.1.0.v201004190952</orbit-javax-el-version>
+ <orbit-javax-activation-version>${javax-activation-version}.0.v201105071233</orbit-javax-activation-version>
+ <orbit-javax-annotation-version>1.1.0.v201105051105</orbit-javax-annotation-version>
+ <orbit-javax-el-version>2.2.0.v201105051105</orbit-javax-el-version>
<orbit-javax-mail-glassfish-version>${javax-mail-version}.v201005082020</orbit-javax-mail-glassfish-version>
- <orbit-javax-servlet-version>2.5.0.v200910301333</orbit-javax-servlet-version>
- <orbit-javax-servlet-jsp-version>2.1.0.v201004190952</orbit-javax-servlet-jsp-version>
+ <orbit-javax-servlet-version>3.0.0.v201103241727</orbit-javax-servlet-version>
+ <orbit-javax-servlet-jsp-version>2.2.0.v201103241009</orbit-javax-servlet-jsp-version>
<orbit-javax-servlet-jsp-jstl-version>1.2.0.v201004190952</orbit-javax-servlet-jsp-jstl-version>
- <orbit-com-sun-el-version>1.0.0.v201004190952</orbit-com-sun-el-version>
+ <orbit-com-sun-el-version>2.2.0.v201105051105</orbit-com-sun-el-version>
<orbit-org-apache-jasper-version>2.1.0.v201007080150</orbit-org-apache-jasper-version>
<orbit-org-apache-taglibs-standard-version>1.2.0.v201004190952</orbit-org-apache-taglibs-standard-version>
- <orbit-org-objectweb-asm-version>3.1.0.v200803061910</orbit-org-objectweb-asm-version>
+ <orbit-org-objectweb-asm-version>3.3.1.v201101071600</orbit-org-objectweb-asm-version>
+ <orbit-javax-transaction-version>1.1.1.v201004190952</orbit-javax-transaction-version>
</properties>
<dependencies>
<dependency>
@@ -103,9 +104,9 @@
<!-- can't use javax.servlet:servlet-api:2.5 it is not a bundle.
the mortbay one is a bundle -->
<dependency>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5-20081211</version>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <version>${servlet.spec.version}</version>
<scope>runtime</scope>
</dependency>
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/boot/TestJettyOSGiBootWithJsp.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/boot/TestJettyOSGiBootWithJsp.java
index d6c2a52284..1e9a0941c3 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/boot/TestJettyOSGiBootWithJsp.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/boot/TestJettyOSGiBootWithJsp.java
@@ -96,7 +96,7 @@ public class TestJettyOSGiBootWithJsp
for( Bundle b : bundleContext.getBundles() )
{
bundlesIndexedBySymbolicName.put(b.getSymbolicName(), b);
- System.err.println("Got " + b.getSymbolicName() + " " + b.getVersion().toString() + " " + b.getState());
+ //System.err.println("Got " + b.getSymbolicName());
}
Bundle osgiBoot = bundlesIndexedBySymbolicName.get("org.eclipse.jetty.osgi.boot");
@@ -105,11 +105,11 @@ public class TestJettyOSGiBootWithJsp
Bundle osgiBootJsp = bundlesIndexedBySymbolicName.get("org.eclipse.jetty.osgi.boot.jsp");
Assert.assertNotNull("Could not find the org.eclipse.jetty.osgi.boot.jsp bundle", osgiBootJsp);
- Assert.assertTrue("The fragment jsp is not correctly resolved " + osgiBootJsp.getState(), osgiBootJsp.getState() == Bundle.RESOLVED);
+ Assert.assertTrue("The fragment jsp is not correctly resolved", osgiBootJsp.getState() == Bundle.RESOLVED);
Bundle testWebBundle = bundlesIndexedBySymbolicName.get("org.eclipse.jetty.test-jetty-webapp");
- Assert.assertNotNull("Could not find the org.eclipse.jetty.test-jetty-webapp bundle", osgiBootJsp);
- Assert.assertTrue("The bundle org.eclipse.jetty.test-jetty-webapp is not correctly resolved", testWebBundle.getState() == Bundle.ACTIVE);
+ Assert.assertNotNull("Could not find the org.eclipse.jetty.osgi.boot.jsp bundle", osgiBootJsp);
+ Assert.assertTrue("The fragment jsp is not correctly resolved", testWebBundle.getState() == Bundle.ACTIVE);
//now test the jsp/dump.jsp
HttpClient client = new HttpClient();
diff --git a/jetty-overlay-deployer/pom.xml b/jetty-overlay-deployer/pom.xml
index 9995060f1a..9f928ec99d 100644
--- a/jetty-overlay-deployer/pom.xml
+++ b/jetty-overlay-deployer/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-overlay-deployer</artifactId>
diff --git a/jetty-plus/pom.xml b/jetty-plus/pom.xml
index 7111833658..7ecf4e5c35 100644
--- a/jetty-plus/pom.xml
+++ b/jetty-plus/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-plus</artifactId>
@@ -28,7 +28,7 @@
<configuration>
<instructions>
<_versionpolicy> </_versionpolicy>
- <Import-Package>javax.sql.*,javax.security.*,javax.naming.*,javax.servlet.*;version="[2.5,3.0)",javax.transaction.*;version="[1.1,1.2)",*</Import-Package>
+ <Import-Package>!javax.sql.*;!javax.security.*;!javax.naming.*;javax.servlet.*;version="[3.0,4.0)",javax.transaction.*;version="[1.1,1.2)",*</Import-Package>
</instructions>
</configuration>
</execution>
diff --git a/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/ContainerInitializer.java b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/ContainerInitializer.java
new file mode 100644
index 0000000000..bd03d291cc
--- /dev/null
+++ b/jetty-plus/src/main/java/org/eclipse/jetty/plus/annotation/ContainerInitializer.java
@@ -0,0 +1,108 @@
+// ========================================================================
+// Copyright (c) 2009 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.plus.annotation;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.servlet.ServletContainerInitializer;
+import javax.servlet.ServletContext;
+
+import org.eclipse.jetty.util.Loader;
+import org.eclipse.jetty.webapp.WebAppContext;
+
+public class ContainerInitializer
+{
+ protected ServletContainerInitializer _target;
+ protected Class[] _interestedTypes;
+ protected Set<String> _applicableTypeNames;
+ protected Set<String> _annotatedTypeNames;
+
+
+ public void setTarget (ServletContainerInitializer target)
+ {
+ _target = target;
+ }
+
+ public ServletContainerInitializer getTarget ()
+ {
+ return _target;
+ }
+
+ public Class[] getInterestedTypes ()
+ {
+ return _interestedTypes;
+ }
+
+ public void setInterestedTypes (Class[] interestedTypes)
+ {
+ _interestedTypes = interestedTypes;
+ }
+
+ /**
+ * A class has been found that has an annotation of interest
+ * to this initializer.
+ * @param className
+ */
+ public void addAnnotatedTypeName (String className)
+ {
+ if (_annotatedTypeNames == null)
+ _annotatedTypeNames = new HashSet<String>();
+ _annotatedTypeNames.add(className);
+ }
+
+ public Set<String> getAnnotatedTypeNames ()
+ {
+ return _annotatedTypeNames;
+ }
+
+ public void addApplicableTypeName (String className)
+ {
+ if (_applicableTypeNames == null)
+ _applicableTypeNames = new HashSet<String>();
+ _applicableTypeNames.add(className);
+ }
+
+ public Set<String> getApplicableTypeNames ()
+ {
+ return _applicableTypeNames;
+ }
+
+
+ public void callStartup(WebAppContext context)
+ throws Exception
+ {
+ if (_target != null)
+ {
+ Set<Class<?>> classes = new HashSet<Class<?>>();
+
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(context.getClassLoader());
+
+ try
+ {
+ if (_applicableTypeNames != null)
+ {
+ for (String s : _applicableTypeNames)
+ classes.add(Loader.loadClass(context.getClass(), s));
+ }
+
+ _target.onStartup(classes, context.getServletContext());
+ }
+ finally
+ {
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ }
+ }
+ }
+}
diff --git a/jetty-plus/src/test/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessorTest.java b/jetty-plus/src/test/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessorTest.java
new file mode 100644
index 0000000000..2c34856e36
--- /dev/null
+++ b/jetty-plus/src/test/java/org/eclipse/jetty/plus/webapp/PlusDescriptorProcessorTest.java
@@ -0,0 +1,171 @@
+// ========================================================================
+// Copyright (c) 2006-2009 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.plus.webapp;
+
+
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.net.URL;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+import org.eclipse.jetty.webapp.Descriptor;
+import org.eclipse.jetty.webapp.FragmentDescriptor;
+import org.eclipse.jetty.webapp.Origin;
+import org.eclipse.jetty.webapp.WebAppClassLoader;
+import org.eclipse.jetty.webapp.WebAppContext;
+import org.eclipse.jetty.webapp.WebDescriptor;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * PlusDescriptorProcessorTest
+ *
+ *
+ */
+public class PlusDescriptorProcessorTest
+{
+ protected WebDescriptor webDescriptor;
+ protected FragmentDescriptor fragDescriptor1;
+ protected FragmentDescriptor fragDescriptor2;
+ protected FragmentDescriptor fragDescriptor3;
+ protected WebAppContext context;
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception
+ {
+ context = new WebAppContext();
+ context.setClassLoader(new WebAppClassLoader(Thread.currentThread().getContextClassLoader(), context));
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(context.getClassLoader());
+ Context icontext = new InitialContext();
+ Context compCtx = (Context)icontext.lookup ("java:comp");
+ compCtx.createSubcontext("env");
+ Thread.currentThread().setContextClassLoader(oldLoader);
+
+ org.eclipse.jetty.plus.jndi.Resource ds = new org.eclipse.jetty.plus.jndi.Resource (context, "jdbc/mydatasource", new Object());
+
+ URL webXml = Thread.currentThread().getContextClassLoader().getResource("web.xml");
+ webDescriptor = new WebDescriptor(org.eclipse.jetty.util.resource.Resource.newResource(webXml));
+ webDescriptor.parse();
+
+ URL frag1Xml = Thread.currentThread().getContextClassLoader().getResource("web-fragment-1.xml");
+ fragDescriptor1 = new FragmentDescriptor(org.eclipse.jetty.util.resource.Resource.newResource(frag1Xml));
+ fragDescriptor1.parse();
+ URL frag2Xml = Thread.currentThread().getContextClassLoader().getResource("web-fragment-2.xml");
+ fragDescriptor2 = new FragmentDescriptor(org.eclipse.jetty.util.resource.Resource.newResource(frag2Xml));
+ fragDescriptor2.parse();
+ URL frag3Xml = Thread.currentThread().getContextClassLoader().getResource("web-fragment-3.xml");
+ fragDescriptor3 = new FragmentDescriptor(org.eclipse.jetty.util.resource.Resource.newResource(frag3Xml));
+ fragDescriptor3.parse();
+ }
+
+ @After
+ public void tearDown() throws Exception
+ {
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(context.getClassLoader());
+ Context ic = new InitialContext();
+ Context compCtx = (Context)ic.lookup ("java:comp");
+ compCtx.destroySubcontext("env");
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ }
+
+ @Test
+ public void testWebXmlResourceDeclarations()
+ throws Exception
+ {
+ //if declared in web.xml, fragment declarations ignored
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(context.getClassLoader());
+ try
+ {
+ PlusDescriptorProcessor pdp = new PlusDescriptorProcessor();
+ pdp.process(context, webDescriptor);
+ Descriptor d = context.getMetaData().getOriginDescriptor("resource-ref.jdbc/mydatasource");
+ assertNotNull(d);
+ assertTrue(d == webDescriptor);
+
+ pdp.process(context, fragDescriptor1);
+ pdp.process(context, fragDescriptor2);
+ }
+ finally
+ {
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ }
+ }
+
+
+ @Test
+ public void testMismatchedFragmentResourceDeclarations ()
+ throws Exception
+ {
+ //if declared in more than 1 fragment, declarations must be the same
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(context.getClassLoader());
+ try
+ {
+ PlusDescriptorProcessor pdp = new PlusDescriptorProcessor();
+ pdp.process(context, fragDescriptor1);
+ Descriptor d = context.getMetaData().getOriginDescriptor("resource-ref.jdbc/mydatasource");
+ assertNotNull(d);
+ assertTrue(d == fragDescriptor1);
+ assertEquals(Origin.WebFragment, context.getMetaData().getOrigin("resource-ref.jdbc/mydatasource"));
+
+ pdp.process(context, fragDescriptor2);
+ fail("Expected conflicting resource-ref declaration");
+ }
+ catch (Exception e)
+ {
+ //expected
+ }
+ finally
+ {
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ }
+ }
+
+ @Test
+ public void testMatchingFragmentResourceDeclarations ()
+ throws Exception
+ {
+ //if declared in more than 1 fragment, declarations must be the same
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(context.getClassLoader());
+ try
+ {
+ PlusDescriptorProcessor pdp = new PlusDescriptorProcessor();
+ pdp.process(context, fragDescriptor1);
+ Descriptor d = context.getMetaData().getOriginDescriptor("resource-ref.jdbc/mydatasource");
+ assertNotNull(d);
+ assertTrue(d == fragDescriptor1);
+ assertEquals(Origin.WebFragment, context.getMetaData().getOrigin("resource-ref.jdbc/mydatasource"));
+ pdp.process(context, fragDescriptor3);
+ }
+
+ finally
+ {
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ }
+ }
+}
diff --git a/jetty-plus/src/test/resources/web-fragment-1.xml b/jetty-plus/src/test/resources/web-fragment-1.xml
new file mode 100644
index 0000000000..b213172ef0
--- /dev/null
+++ b/jetty-plus/src/test/resources/web-fragment-1.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<web-fragment
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"
+ version="3.0">
+
+ <name>Fragment1</name>
+
+ <ordering>
+ <after>others</after>
+ </ordering>
+
+ <resource-ref>
+ <res-ref-name>jdbc/mydatasource</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+<!--
+ <injection-target>
+ <injection-target-class>com.acme.Bar</injection-target-class>
+ <injection-target-name>myDatasource</injection-target-name>
+ </injection-target>
+-->
+ </resource-ref>
+
+</web-fragment>
diff --git a/jetty-plus/src/test/resources/web-fragment-2.xml b/jetty-plus/src/test/resources/web-fragment-2.xml
new file mode 100644
index 0000000000..e2fff6786f
--- /dev/null
+++ b/jetty-plus/src/test/resources/web-fragment-2.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<web-fragment
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"
+ version="3.0">
+
+ <name>Fragment2</name>
+
+ <ordering>
+ <after>others</after>
+ </ordering>
+
+ <resource-ref>
+ <res-ref-name>jdbc/mydatasource</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>User</res-auth>
+<!--
+ <injection-target>
+ <injection-target-class>com.acme.Bar</injection-target-class>
+ <injection-target-name>myDatasource</injection-target-name>
+ </injection-target>
+-->
+ </resource-ref>
+
+</web-fragment>
diff --git a/jetty-plus/src/test/resources/web-fragment-3.xml b/jetty-plus/src/test/resources/web-fragment-3.xml
new file mode 100644
index 0000000000..da1f3d5add
--- /dev/null
+++ b/jetty-plus/src/test/resources/web-fragment-3.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<web-fragment
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"
+ version="3.0">
+
+ <name>Fragment3</name>
+
+ <ordering>
+ <after>others</after>
+ </ordering>
+
+ <resource-ref>
+ <res-ref-name>jdbc/mydatasource</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+<!--
+ <injection-target>
+ <injection-target-class>com.acme.Bar</injection-target-class>
+ <injection-target-name>myDatasource</injection-target-name>
+ </injection-target>
+-->
+ </resource-ref>
+
+</web-fragment>
diff --git a/jetty-plus/src/test/resources/web.xml b/jetty-plus/src/test/resources/web.xml
new file mode 100644
index 0000000000..aa40eb3fba
--- /dev/null
+++ b/jetty-plus/src/test/resources/web.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ metadata-complete="false"
+ version="3.0">
+
+ <display-name>Test WebApp</display-name>
+
+ <resource-ref>
+ <res-ref-name>jdbc/mydatasource</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+<!--
+ <injection-target>
+ <injection-target-class>com.acme.JNDITest</injection-target-class>
+ <injection-target-name>myDatasource</injection-target-name>
+ </injection-target>
+-->
+ </resource-ref>
+
+</web-app>
diff --git a/jetty-policy/pom.xml b/jetty-policy/pom.xml
index c061c82d93..75bb50cf94 100644
--- a/jetty-policy/pom.xml
+++ b/jetty-policy/pom.xml
@@ -3,7 +3,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-policy</artifactId>
diff --git a/jetty-rewrite/pom.xml b/jetty-rewrite/pom.xml
index 22a1b16865..2d214a9636 100644
--- a/jetty-rewrite/pom.xml
+++ b/jetty-rewrite/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-rewrite</artifactId>
@@ -74,10 +74,10 @@
<artifactId>jetty-server</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- </dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>test-jetty-servlet</artifactId>
diff --git a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/HeaderPatternRuleTest.java b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/HeaderPatternRuleTest.java
index ae3a1f71e6..6559d03c69 100644
--- a/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/HeaderPatternRuleTest.java
+++ b/jetty-rewrite/src/test/java/org/eclipse/jetty/rewrite/handler/HeaderPatternRuleTest.java
@@ -13,7 +13,7 @@
package org.eclipse.jetty.rewrite.handler;
import java.io.IOException;
-import java.util.Enumeration;
+import java.util.Iterator;
import org.junit.Before;
import org.junit.Test;
@@ -80,11 +80,11 @@ public class HeaderPatternRuleTest extends AbstractRuleTestCase
};
assertHeaders(headers);
- Enumeration e = _response.getHeaders("size");
+ Iterator<String> e = _response.getHeaders("size").iterator();
int count = 0;
- while (e.hasMoreElements())
+ while (e.hasNext())
{
- e.nextElement();
+ e.next();
count++;
}
diff --git a/jetty-security/pom.xml b/jetty-security/pom.xml
index e52f1aeee0..28cf9ac74f 100644
--- a/jetty-security/pom.xml
+++ b/jetty-security/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-security</artifactId>
@@ -24,7 +24,7 @@
</goals>
<configuration>
<instructions>
- <Import-Package>javax.servlet.*;version="[2.5,3.0)",javax.security.cert,*</Import-Package>
+ <Import-Package>javax.servlet.*;version="[3.0,4.0)",javax.security.cert,*</Import-Package>
</instructions>
</configuration>
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintMapping.java b/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintMapping.java
index 378ff14d57..3ad35ee46d 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintMapping.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/ConstraintMapping.java
@@ -18,6 +18,7 @@ import org.eclipse.jetty.http.security.Constraint;
public class ConstraintMapping
{
String _method;
+ String[] _methodOmissions;
String _pathSpec;
@@ -76,4 +77,19 @@ public class ConstraintMapping
{
this._pathSpec = pathSpec;
}
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @param omissions The http-method-omission
+ */
+ public void setMethodOmissions(String[] omissions)
+ {
+ _methodOmissions = omissions;
+ }
+
+ /* ------------------------------------------------------------ */
+ public String[] getMethodOmissions()
+ {
+ return _methodOmissions;
+ }
}
diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DeferredAuthentication.java b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DeferredAuthentication.java
index 2a3305b77a..a0d09af12a 100644
--- a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DeferredAuthentication.java
+++ b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/DeferredAuthentication.java
@@ -16,6 +16,8 @@ package org.eclipse.jetty.security.authentication;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Collection;
+import java.util.Collections;
import java.util.Locale;
import javax.servlet.ServletOutputStream;
@@ -110,7 +112,7 @@ public class DeferredAuthentication implements Authentication.Deferred
{
Log.debug(e);
}
- return Authentication.UNAUTHENTICATED;
+ return this;
}
/* ------------------------------------------------------------ */
@@ -130,7 +132,7 @@ public class DeferredAuthentication implements Authentication.Deferred
{
Log.debug(e);
}
- return Authentication.UNAUTHENTICATED;
+ return this;
}
/* ------------------------------------------------------------ */
@@ -314,6 +316,29 @@ public class DeferredAuthentication implements Authentication.Deferred
{
}
+ public Collection<String> getHeaderNames()
+ {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public String getHeader(String arg0)
+ {
+ return null;
+ }
+
+ @Override
+ public Collection<String> getHeaders(String arg0)
+ {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public int getStatus()
+ {
+ return 0;
+ }
+
};
/* ------------------------------------------------------------ */
@@ -335,4 +360,4 @@ public class DeferredAuthentication implements Authentication.Deferred
};
-} \ No newline at end of file
+}
diff --git a/jetty-server/pom.xml b/jetty-server/pom.xml
index 81305772dd..13010b1ceb 100644
--- a/jetty-server/pom.xml
+++ b/jetty-server/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-server</artifactId>
@@ -26,7 +26,7 @@
</goals>
<configuration>
<instructions>
- <Import-Package>javax.servlet.*;version="[2.5,3.0)",org.eclipse.jetty.jmx.*;version="[7.3,8)";resolution:=optional,*</Import-Package>
+ <Import-Package>javax.servlet.*;version="[3.0,4.0)",org.eclipse.jetty.jmx.*;version="[7.3,8)";resolution:=optional,*</Import-Package>
</instructions>
</configuration>
</execution>
@@ -88,9 +88,14 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-continuation</artifactId>
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContext.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContext.java
deleted file mode 100644
index 2f6ed1e9ab..0000000000
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContext.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// ========================================================================
-// Copyright (c) 2004-2009 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.server;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import org.eclipse.jetty.continuation.ContinuationListener;
-
-/* temporary interface in anticipation of servlet 3.0 */
-public interface AsyncContext
-{
- static final String ASYNC_REQUEST_URI = "javax.servlet.async.request_uri";
- static final String ASYNC_CONTEXT_PATH = "javax.servlet.async.context_path";
- static final String ASYNC_PATH_INFO = "javax.servlet.async.path_info";
- static final String ASYNC_SERVLET_PATH = "javax.servlet.async.servlet_path";
- static final String ASYNC_QUERY_STRING = "javax.servlet.async.query_string";
-
- public ServletRequest getRequest();
- public ServletResponse getResponse();
- public boolean hasOriginalRequestAndResponse();
- public void dispatch();
- public void dispatch(String path);
- public void dispatch(ServletContext context, String path);
- public void complete();
- public void start(Runnable run);
- public void setTimeout(long ms);
- public void addContinuationListener(ContinuationListener listener);
-}
-
-
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContinuation.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContinuation.java
index adb8e0b86d..5415ddb321 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContinuation.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncContinuation.java
@@ -13,6 +13,12 @@
package org.eclipse.jetty.server;
+import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.ServletResponseWrapper;
+import javax.servlet.ServletException;
+
import java.util.ArrayList;
import java.util.List;
@@ -21,8 +27,8 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.eclipse.jetty.continuation.Continuation;
-import org.eclipse.jetty.continuation.ContinuationListener;
import org.eclipse.jetty.continuation.ContinuationThrowable;
+import org.eclipse.jetty.continuation.ContinuationListener;
import org.eclipse.jetty.io.AsyncEndPoint;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.server.handler.ContextHandler;
@@ -31,7 +37,7 @@ import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.thread.Timeout;
/* ------------------------------------------------------------ */
-/** Implementation of Continuation and AsyncContext interfaces.
+/** Implementation of Continuation and AsyncContext interfaces
*
*/
public class AsyncContinuation implements AsyncContext, Continuation
@@ -64,9 +70,10 @@ public class AsyncContinuation implements AsyncContext, Continuation
private static final int __UNCOMPLETED=8; // Request is completable
private static final int __COMPLETED=9; // Request is complete
-
/* ------------------------------------------------------------ */
protected HttpConnection _connection;
+ private List<AsyncListener> _lastAsyncListeners;
+ private List<AsyncListener> _asyncListeners;
private List<ContinuationListener> _continuationListeners;
/* ------------------------------------------------------------ */
@@ -77,7 +84,8 @@ public class AsyncContinuation implements AsyncContext, Continuation
private volatile boolean _responseWrapped;
private long _timeoutMs=DEFAULT_TIMEOUT;
private AsyncEventState _event;
- private volatile long _expireAt;
+ private volatile long _expireAt;
+ private volatile boolean _continuation;
/* ------------------------------------------------------------ */
protected AsyncContinuation()
@@ -96,6 +104,29 @@ public class AsyncContinuation implements AsyncContext, Continuation
}
/* ------------------------------------------------------------ */
+ public void addListener(AsyncListener listener)
+ {
+ synchronized(this)
+ {
+ if (_asyncListeners==null)
+ _asyncListeners=new ArrayList<AsyncListener>();
+ _asyncListeners.add(listener);
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ public void addListener(AsyncListener listener,ServletRequest request, ServletResponse response)
+ {
+ synchronized(this)
+ {
+ // TODO handle the request/response ???
+ if (_asyncListeners==null)
+ _asyncListeners=new ArrayList<AsyncListener>();
+ _asyncListeners.add(listener);
+ }
+ }
+
+ /* ------------------------------------------------------------ */
public void addContinuationListener(ContinuationListener listener)
{
synchronized(this)
@@ -222,6 +253,7 @@ public class AsyncContinuation implements AsyncContext, Continuation
{
synchronized (this)
{
+ _continuation=false;
_responseWrapped=false;
switch(_state)
@@ -229,6 +261,15 @@ public class AsyncContinuation implements AsyncContext, Continuation
case __IDLE:
_initial=true;
_state=__DISPATCHED;
+ if (_lastAsyncListeners!=null)
+ _lastAsyncListeners.clear();
+ if (_asyncListeners!=null)
+ _asyncListeners.clear();
+ else
+ {
+ _asyncListeners=_lastAsyncListeners;
+ _lastAsyncListeners=null;
+ }
return true;
case __COMPLETING:
@@ -265,7 +306,7 @@ public class AsyncContinuation implements AsyncContext, Continuation
_resumed=false;
_expired=false;
- if (_event==null || request!=_event.getRequest() || response != _event.getResponse() || context != _event.getServletContext())
+ if (_event==null || request!=_event.getSuppliedRequest() || response != _event.getSuppliedResponse() || context != _event.getServletContext())
_event=new AsyncEventState(context,request,response);
else
{
@@ -274,6 +315,11 @@ public class AsyncContinuation implements AsyncContext, Continuation
}
_state=__ASYNCSTARTED;
+ List<AsyncListener> recycle=_lastAsyncListeners;
+ _lastAsyncListeners=_asyncListeners;
+ _asyncListeners=recycle;
+ if (_asyncListeners!=null)
+ _asyncListeners.clear();
break;
default:
@@ -281,6 +327,21 @@ public class AsyncContinuation implements AsyncContext, Continuation
}
}
+ if (_lastAsyncListeners!=null)
+ {
+ for (AsyncListener listener : _lastAsyncListeners)
+ {
+ try
+ {
+ listener.onStartAsync(_event);
+ }
+ catch(Exception e)
+ {
+ Log.warn(e);
+ }
+ }
+ }
+
}
/* ------------------------------------------------------------ */
@@ -295,8 +356,6 @@ public class AsyncContinuation implements AsyncContext, Continuation
{
synchronized (this)
{
- List<ContinuationListener> listeners=_continuationListeners;
-
switch(_state)
{
case __REDISPATCHED:
@@ -318,6 +377,7 @@ public class AsyncContinuation implements AsyncContext, Continuation
_state=__UNCOMPLETED;
return true;
}
+
_initial=false;
_state=__REDISPATCHED;
return false;
@@ -375,27 +435,43 @@ public class AsyncContinuation implements AsyncContext, Continuation
/* ------------------------------------------------------------ */
protected void expired()
{
- final List<ContinuationListener> listeners;
+ final List<ContinuationListener> cListeners;
+ final List<AsyncListener> aListeners;
synchronized (this)
{
switch(_state)
{
case __ASYNCSTARTED:
case __ASYNCWAIT:
- listeners=_continuationListeners;
+ cListeners=_continuationListeners;
+ aListeners=_asyncListeners;
break;
default:
- listeners=null;
+ cListeners=null;
+ aListeners=null;
return;
}
_expired=true;
}
- if (listeners!=null)
+ if (aListeners!=null)
{
- for (int i=0;i<listeners.size();i++)
+ for (AsyncListener listener : aListeners)
+ {
+ try
+ {
+ listener.onTimeout(_event);
+ }
+ catch(Exception e)
+ {
+ Log.warn(e);
+ }
+ }
+ }
+ if (cListeners!=null)
+ {
+ for (ContinuationListener listener : cListeners)
{
- ContinuationListener listener=listeners.get(i);
try
{
listener.onTimeout(this);
@@ -406,6 +482,8 @@ public class AsyncContinuation implements AsyncContext, Continuation
}
}
}
+
+
synchronized (this)
{
@@ -413,7 +491,11 @@ public class AsyncContinuation implements AsyncContext, Continuation
{
case __ASYNCSTARTED:
case __ASYNCWAIT:
- dispatch();
+ if (_continuation)
+ dispatch();
+ else
+ // TODO maybe error dispatch?
+ complete();
}
}
@@ -457,36 +539,75 @@ public class AsyncContinuation implements AsyncContext, Continuation
}
}
-
+ /* ------------------------------------------------------------ */
+ @Override
+ public <T extends AsyncListener> T createListener(Class<T> clazz) throws ServletException
+ {
+ try
+ {
+ // TODO inject
+ return clazz.newInstance();
+ }
+ catch(Exception e)
+ {
+ throw new ServletException(e);
+ }
+ }
+
+
/* ------------------------------------------------------------ */
/* (non-Javadoc)
* @see javax.servlet.ServletRequest#complete()
*/
- protected void doComplete()
+ protected void doComplete(Throwable ex)
{
- final List<ContinuationListener> listeners;
+ final List<ContinuationListener> cListeners;
+ final List<AsyncListener> aListeners;
synchronized (this)
{
switch(_state)
{
case __UNCOMPLETED:
_state=__COMPLETED;
- listeners=_continuationListeners;
+ cListeners=_continuationListeners;
+ aListeners=_asyncListeners;
break;
default:
- listeners=null;
+ cListeners=null;
+ aListeners=null;
throw new IllegalStateException(this.getStatusString());
}
}
- if (listeners!=null)
+ if (aListeners!=null)
{
- for(int i=0;i<listeners.size();i++)
+ for (AsyncListener listener : aListeners)
{
try
{
- listeners.get(i).onComplete(this);
+ if (ex!=null)
+ {
+ _event.getSuppliedRequest().setAttribute(Dispatcher.ERROR_EXCEPTION,ex);
+ _event.getSuppliedRequest().setAttribute(Dispatcher.ERROR_MESSAGE,ex.getMessage());
+ listener.onError(_event);
+ }
+ else
+ listener.onComplete(_event);
+ }
+ catch(Exception e)
+ {
+ Log.warn(e);
+ }
+ }
+ }
+ if (cListeners!=null)
+ {
+ for (ContinuationListener listener : cListeners)
+ {
+ try
+ {
+ listener.onComplete(this);
}
catch(Exception e)
{
@@ -501,7 +622,6 @@ public class AsyncContinuation implements AsyncContext, Continuation
{
synchronized (this)
{
-// _history.append("r\n");
switch(_state)
{
case __DISPATCHED:
@@ -573,7 +693,7 @@ public class AsyncContinuation implements AsyncContext, Continuation
}
else
{
- _connection.scheduleTimeout(_event,_timeoutMs);
+ _connection.scheduleTimeout(_event._timeout,_timeoutMs);
}
}
}
@@ -594,7 +714,7 @@ public class AsyncContinuation implements AsyncContext, Continuation
{
final AsyncEventState event=_event;
if (event!=null)
- _connection.cancelTimeout(event);
+ _connection.cancelTimeout(event._timeout);
}
}
@@ -690,15 +810,15 @@ public class AsyncContinuation implements AsyncContext, Continuation
public ServletRequest getRequest()
{
if (_event!=null)
- return _event.getRequest();
+ return _event.getSuppliedRequest();
return _connection.getRequest();
}
/* ------------------------------------------------------------ */
public ServletResponse getResponse()
{
- if (_event!=null)
- return _event.getResponse();
+ if (_responseWrapped && _event!=null && _event.getSuppliedResponse()!=null)
+ return _event.getSuppliedResponse();
return _connection.getResponse();
}
@@ -723,7 +843,7 @@ public class AsyncContinuation implements AsyncContext, Continuation
{
synchronized (this)
{
- return (_event!=null && _event.getRequest()==_connection._request && _event.getResponse()==_connection._response);
+ return (_event!=null && _event.getSuppliedRequest()==_connection._request && _event.getSuppliedResponse()==_connection._response);
}
}
@@ -775,8 +895,17 @@ public class AsyncContinuation implements AsyncContext, Continuation
*/
public void suspend(ServletResponse response)
{
- _responseWrapped=!(response instanceof Response);
- AsyncContinuation.this.suspend(_connection.getRequest().getServletContext(),_connection.getRequest(),response);
+ _continuation=true;
+ if (response instanceof ServletResponseWrapper)
+ {
+ _responseWrapped=true;
+ AsyncContinuation.this.suspend(_connection.getRequest().getServletContext(),_connection.getRequest(),response);
+ }
+ else
+ {
+ _responseWrapped=false;
+ AsyncContinuation.this.suspend(_connection.getRequest().getServletContext(),_connection.getRequest(),_connection.getResponse());
+ }
}
/* ------------------------------------------------------------ */
@@ -786,6 +915,7 @@ public class AsyncContinuation implements AsyncContext, Continuation
public void suspend()
{
_responseWrapped=false;
+ _continuation=true;
AsyncContinuation.this.suspend(_connection.getRequest().getServletContext(),_connection.getRequest(),_connection.getResponse());
}
@@ -795,8 +925,8 @@ public class AsyncContinuation implements AsyncContext, Continuation
*/
public ServletResponse getServletResponse()
{
- if (_responseWrapped && _event!=null && _event.getResponse()!=null)
- return _event.getResponse();
+ if (_responseWrapped && _event!=null && _event.getSuppliedResponse()!=null)
+ return _event.getSuppliedResponse();
return _connection.getResponse();
}
@@ -845,19 +975,34 @@ public class AsyncContinuation implements AsyncContext, Continuation
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
- public class AsyncEventState extends Timeout.Task implements Runnable
+ public class AsyncTimeout extends Timeout.Task implements Runnable
+ {
+ @Override
+ public void expired()
+ {
+ AsyncContinuation.this.expired();
+ }
+
+ @Override
+ public void run()
+ {
+ AsyncContinuation.this.expired();
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ /* ------------------------------------------------------------ */
+ public class AsyncEventState extends AsyncEvent
{
private final ServletContext _suspendedContext;
- private final ServletRequest _request;
- private final ServletResponse _response;
private ServletContext _dispatchContext;
private String _path;
+ private Timeout.Task _timeout= new AsyncTimeout();
public AsyncEventState(ServletContext context, ServletRequest request, ServletResponse response)
{
+ super(AsyncContinuation.this, request,response);
_suspendedContext=context;
- _request=request;
- _response=response;
}
public ServletContext getSuspendedContext()
@@ -874,31 +1019,10 @@ public class AsyncContinuation implements AsyncContext, Continuation
{
return _dispatchContext==null?_suspendedContext:_dispatchContext;
}
-
- public ServletRequest getRequest()
- {
- return _request;
- }
-
- public ServletResponse getResponse()
- {
- return _response;
- }
public String getPath()
{
return _path;
}
-
- @Override
- public void expired()
- {
- AsyncContinuation.this.expired();
- }
-
- public void run()
- {
- AsyncContinuation.this.expired();
- }
}
}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java
index 355fc46ada..eb054afe72 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java
@@ -20,6 +20,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
+import javax.servlet.DispatcherType;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
@@ -40,24 +41,6 @@ import org.eclipse.jetty.util.UrlEncoded;
*/
public class Dispatcher implements RequestDispatcher
{
- public static final String FORWARD_REQUEST_URI = "javax.servlet.forward.request_uri";
- public static final String FORWARD_CONTEXT_PATH = "javax.servlet.forward.context_path";
- public static final String FORWARD_PATH_INFO = "javax.servlet.forward.path_info";
- public static final String FORWARD_SERVLET_PATH = "javax.servlet.forward.servlet_path";
- public static final String FORWARD_QUERY_STRING = "javax.servlet.forward.query_string";
- public static final String INCLUDE_REQUEST_URI = "javax.servlet.include.request_uri";
- public static final String INCLUDE_CONTEXT_PATH = "javax.servlet.include.context_path";
- public static final String INCLUDE_PATH_INFO = "javax.servlet.include.path_info";
- public static final String INCLUDE_SERVLET_PATH = "javax.servlet.include.servlet_path";
- public static final String INCLUDE_QUERY_STRING = "javax.servlet.include.query_string";
-
- public static final String ERROR_EXCEPTION = "javax.servlet.error.exception";
- public static final String ERROR_EXCEPTION_TYPE = "javax.servlet.error.exception_type";
- public static final String ERROR_MESSAGE = "javax.servlet.error.message";
- public static final String ERROR_REQUEST_URI = "javax.servlet.error.request_uri";
- public static final String ERROR_SERVLET_NAME = "javax.servlet.error.servlet_name";
- public static final String ERROR_STATUS_CODE = "javax.servlet.error.status_code";
-
/** Dispatch include attribute names */
public final static String __INCLUDE_PREFIX="javax.servlet.include.";
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/DispatcherType.java b/jetty-server/src/main/java/org/eclipse/jetty/server/DispatcherType.java
deleted file mode 100644
index 02da5df6b9..0000000000
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/DispatcherType.java
+++ /dev/null
@@ -1,11 +0,0 @@
-
-package org.eclipse.jetty.server;
-
-public enum DispatcherType
-{
- FORWARD,
- INCLUDE,
- REQUEST,
- ASYNC,
- ERROR
-}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java
index 82e2ed6b74..1cc39ea171 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java
@@ -16,7 +16,7 @@ package org.eclipse.jetty.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
-
+import javax.servlet.DispatcherType;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
@@ -46,7 +46,7 @@ import org.eclipse.jetty.io.BufferCache.CachedBuffer;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.EofException;
-import org.eclipse.jetty.io.RuntimeIOException;
+import org.eclipse.jetty.io.UncheckedIOException;
import org.eclipse.jetty.io.UncheckedPrintWriter;
import org.eclipse.jetty.server.nio.NIOConnector;
import org.eclipse.jetty.server.ssl.SslConnector;
@@ -547,6 +547,7 @@ public class HttpConnection extends AbstractConnection implements Connection
boolean error = false;
String threadName=null;
+ Throwable async_exception=null;
try
{
if (Log.isDebugEnabled())
@@ -600,12 +601,14 @@ public class HttpConnection extends AbstractConnection implements Connection
}
catch (EofException e)
{
+ async_exception=e;
Log.debug(e);
_request.setHandled(true);
error=true;
}
- catch (RuntimeIOException e)
+ catch (UncheckedIOException e)
{
+ async_exception=e;
Log.debug(e);
_request.setHandled(true);
error=true;
@@ -622,6 +625,8 @@ public class HttpConnection extends AbstractConnection implements Connection
if (e instanceof ThreadDeath)
throw (ThreadDeath)e;
+ async_exception=e;
+
error=true;
Log.warn(String.valueOf(_uri),e);
_request.setHandled(true);
@@ -640,7 +645,8 @@ public class HttpConnection extends AbstractConnection implements Connection
if (_request._async.isUncompleted())
{
- _request._async.doComplete();
+
+ _request._async.doComplete(async_exception);
if (_expect100Continue)
{
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java
index 5fd7d91c52..ec9357e991 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java
@@ -38,6 +38,7 @@ public class HttpOutput extends ServletOutputStream
{
protected final AbstractGenerator _generator;
protected final long _maxIdleTime;
+ protected final ByteArrayBuffer _buf = new ByteArrayBuffer(AbstractGenerator.NO_BYTES);
private boolean _closed;
// These are held here for reuse by Writer
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java
index 96af38530f..5706735437 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java
@@ -14,6 +14,7 @@
package org.eclipse.jetty.server;
import java.io.BufferedReader;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -32,8 +33,14 @@ import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
+import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.DispatcherType;
+import javax.servlet.MultipartConfigElement;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestAttributeEvent;
@@ -41,7 +48,9 @@ import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
+import javax.servlet.http.Part;
import org.eclipse.jetty.continuation.Continuation;
import org.eclipse.jetty.continuation.ContinuationListener;
@@ -50,6 +59,7 @@ import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpHeaders;
import org.eclipse.jetty.http.HttpMethods;
import org.eclipse.jetty.http.HttpParser;
+import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersions;
import org.eclipse.jetty.http.MimeTypes;
@@ -65,6 +75,7 @@ import org.eclipse.jetty.util.Attributes;
import org.eclipse.jetty.util.AttributesMap;
import org.eclipse.jetty.util.LazyList;
import org.eclipse.jetty.util.MultiMap;
+import org.eclipse.jetty.util.MultiPartInputStream;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.URIUtil;
import org.eclipse.jetty.util.UrlEncoded;
@@ -103,6 +114,7 @@ import org.eclipse.jetty.util.log.Log;
*/
public class Request implements HttpServletRequest
{
+ public static final String __MULTIPART_CONFIG_ELEMENT = "org.eclipse.multipartConfig";
private static final String __ASYNC_FWD="org.eclipse.asyncfwd";
private static final Collection __defaultLocale = Collections.singleton(Locale.getDefault());
private static final int __NONE=0, _STREAM=1, __READER=2;
@@ -161,6 +173,8 @@ public class Request implements HttpServletRequest
private Buffer _timeStampBuffer;
private HttpURI _uri;
+ private MultiPartInputStream _multiPartInputStream; //if the request is a multi-part mime
+
/* ------------------------------------------------------------ */
public Request()
{
@@ -178,7 +192,9 @@ public class Request implements HttpServletRequest
if (listener instanceof ServletRequestAttributeListener)
_requestAttributeListeners= LazyList.add(_requestAttributeListeners, listener);
if (listener instanceof ContinuationListener)
- throw new IllegalArgumentException();
+ throw new IllegalArgumentException(listener.getClass().toString());
+ if (listener instanceof AsyncListener)
+ throw new IllegalArgumentException(listener.getClass().toString());
}
/* ------------------------------------------------------------ */
@@ -296,7 +312,7 @@ public class Request implements HttpServletRequest
{
return _async;
}
-
+
/* ------------------------------------------------------------ */
/*
* @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
@@ -350,7 +366,7 @@ public class Request implements HttpServletRequest
public String getAuthType()
{
if (_authentication instanceof Authentication.Deferred)
- _authentication = ((Authentication.Deferred)_authentication).authenticate(this);
+ setAuthentication(((Authentication.Deferred)_authentication).authenticate(this));
if (_authentication instanceof Authentication.User)
return ((Authentication.User)_authentication).getAuthMethod();
@@ -575,7 +591,6 @@ public class Request implements HttpServletRequest
*/
public Enumeration getLocales()
{
-
Enumeration enm = _connection.getRequestFields().getValues(HttpHeaders.ACCEPT_LANGUAGE, HttpFields.__separators);
// handle no locale
@@ -1384,6 +1399,7 @@ public class Request implements HttpServletRequest
if (_savedNewSessions!=null)
_savedNewSessions.clear();
_savedNewSessions=null;
+ _multiPartInputStream = null;
}
/* ------------------------------------------------------------ */
@@ -1865,7 +1881,71 @@ public class Request implements HttpServletRequest
{
return (_handled?"[":"(")+getMethod()+" "+_uri+(_handled?"]@":")@")+hashCode()+" "+super.toString();
}
-
+
+ /* ------------------------------------------------------------ */
+ public boolean authenticate(HttpServletResponse response) throws IOException, ServletException
+ {
+ if (_authentication instanceof Authentication.Deferred)
+ {
+ setAuthentication(((Authentication.Deferred)_authentication).authenticate(this,response));
+ return !(_authentication instanceof Authentication.ResponseSent);
+ }
+ response.sendError(HttpStatus.UNAUTHORIZED_401);
+ return false;
+ }
+
+ /* ------------------------------------------------------------ */
+ public Part getPart(String name) throws IOException, ServletException
+ {
+ if (getContentType() == null || !getContentType().startsWith("multipart/form-data"))
+ return null;
+
+ if (_multiPartInputStream == null)
+ {
+ _multiPartInputStream = new MultiPartInputStream(getInputStream(),
+ getContentType(),(MultipartConfigElement)getAttribute(__MULTIPART_CONFIG_ELEMENT),
+ (_context != null?(File)_context.getAttribute("javax.servlet.context.tempdir"):null));
+ }
+ return _multiPartInputStream.getPart(name);
+ }
+
+ /* ------------------------------------------------------------ */
+ public Collection<Part> getParts() throws IOException, ServletException
+ {
+ if (getContentType() == null || !getContentType().startsWith("multipart/form-data"))
+ return Collections.emptyList();
+
+ if (_multiPartInputStream == null)
+ {
+ _multiPartInputStream = new MultiPartInputStream(getInputStream(),
+ getContentType(),(MultipartConfigElement)getAttribute(__MULTIPART_CONFIG_ELEMENT),
+ (_context != null?(File)_context.getAttribute("javax.servlet.context.tempdir"):null));
+ }
+ return _multiPartInputStream.getParts();
+ }
+
+ /* ------------------------------------------------------------ */
+ public void login(String username, String password) throws ServletException
+ {
+ if (_authentication instanceof Authentication.Deferred)
+ {
+ _authentication=((Authentication.Deferred)_authentication).login(username,password);
+ if (_authentication == null)
+ throw new ServletException();
+ }
+ else
+ {
+ throw new ServletException("Authenticated as "+_authentication);
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ public void logout() throws ServletException
+ {
+ if (_authentication instanceof Authentication.User)
+ ((Authentication.User)_authentication).logout();
+ _authentication=Authentication.UNAUTHENTICATED;
+ }
/* ------------------------------------------------------------ */
/** Merge in a new query string.
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java
index 9dd26fa065..fffa3c42f3 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java
@@ -15,8 +15,9 @@ package org.eclipse.jetty.server;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Collection;
import java.util.Collections;
-import java.util.Enumeration;
+import java.util.List;
import java.util.Locale;
import javax.servlet.ServletOutputStream;
@@ -484,6 +485,14 @@ public class Response implements HttpServletResponse
}
}
+
+ /* ------------------------------------------------------------ */
+ public Collection<String> getHeaderNames()
+ {
+ final HttpFields fields=_connection.getResponseFields();
+ return fields.getFieldNamesCollection();
+ }
+
/* ------------------------------------------------------------ */
/*
*/
@@ -495,12 +504,13 @@ public class Response implements HttpServletResponse
/* ------------------------------------------------------------ */
/*
*/
- public Enumeration getHeaders(String name)
+ public Collection<String> getHeaders(String name)
{
- Enumeration e = _connection.getResponseFields().getValues(name);
- if (e==null)
- return Collections.enumeration(Collections.EMPTY_LIST);
- return e;
+ final HttpFields fields=_connection.getResponseFields();
+ Collection<String> i = fields.getValuesCollection(name);
+ if (i==null)
+ return Collections.EMPTY_LIST;
+ return i;
}
/* ------------------------------------------------------------ */
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java
index 55d57c7920..f5dcb39aad 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java
@@ -17,6 +17,7 @@ import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Enumeration;
+import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -58,7 +59,7 @@ public class Server extends HandlerWrapper implements Attributes
Server.class.getPackage().getImplementationVersion()!=null)
__version=Server.class.getPackage().getImplementationVersion();
else
- __version=System.getProperty("jetty.version","7.x.y-SNAPSHOT");
+ __version=System.getProperty("jetty.version","8.0.y.z-SNAPSHOT");
}
private final Container _container=new Container();
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ServletRequestHttpWrapper.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ServletRequestHttpWrapper.java
index f57c92f684..8c36053fd3 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ServletRequestHttpWrapper.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ServletRequestHttpWrapper.java
@@ -14,14 +14,19 @@
package org.eclipse.jetty.server;
+import java.io.IOException;
import java.security.Principal;
+import java.util.Collection;
import java.util.Enumeration;
+import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestWrapper;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
+import javax.servlet.http.Part;
/* ------------------------------------------------------------ */
/** Class to tunnel a ServletRequest via a HttpServletRequest
@@ -158,5 +163,45 @@ public class ServletRequestHttpWrapper extends ServletRequestWrapper implements
return false;
}
+ /**
+ * @see javax.servlet.http.HttpServletRequest#authenticate(javax.servlet.http.HttpServletResponse)
+ */
+ public boolean authenticate(HttpServletResponse response) throws IOException, ServletException
+ {
+ return false;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getPart(java.lang.String)
+ */
+ public Part getPart(String name) throws IOException, ServletException
+ {
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getParts()
+ */
+ public Collection<Part> getParts() throws IOException, ServletException
+ {
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#login(java.lang.String, java.lang.String)
+ */
+ public void login(String username, String password) throws ServletException
+ {
+
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#logout()
+ */
+ public void logout() throws ServletException
+ {
+
+ }
+
} \ No newline at end of file
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ServletResponseHttpWrapper.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ServletResponseHttpWrapper.java
index 94038d9a97..12595c594a 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ServletResponseHttpWrapper.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ServletResponseHttpWrapper.java
@@ -1,6 +1,7 @@
package org.eclipse.jetty.server;
import java.io.IOException;
+import java.util.Collection;
import javax.servlet.ServletResponse;
import javax.servlet.ServletResponseWrapper;
@@ -91,4 +92,36 @@ public class ServletResponseHttpWrapper extends ServletResponseWrapper implement
{
}
+ /**
+ * @see javax.servlet.http.HttpServletResponse#getHeader(java.lang.String)
+ */
+ public String getHeader(String name)
+ {
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletResponse#getHeaderNames()
+ */
+ public Collection<String> getHeaderNames()
+ {
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletResponse#getHeaders(java.lang.String)
+ */
+ public Collection<String> getHeaders(String name)
+ {
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletResponse#getStatus()
+ */
+ public int getStatus()
+ {
+ return 0;
+ }
+
}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/SessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/SessionManager.java
index cd52027be0..c5c9c68e67 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/SessionManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/SessionManager.java
@@ -14,7 +14,10 @@
package org.eclipse.jetty.server;
import java.util.EventListener;
+import java.util.Set;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@@ -104,11 +107,6 @@ public interface SessionManager extends LifeCycle
*/
public HttpSession newHttpSession(HttpServletRequest request);
- /* ------------------------------------------------------------ */
- /**
- * @return true if session cookies should be secure
- */
- public boolean getSecureCookies();
/* ------------------------------------------------------------ */
/**
@@ -193,14 +191,6 @@ public interface SessionManager extends LifeCycle
/* ------------------------------------------------------------ */
/**
- * @return the cross context session id manager.
- * @deprecated use {@link #getIdManager()}
- */
- @Deprecated
- public SessionIdManager getMetaManager();
-
- /* ------------------------------------------------------------ */
- /**
* Sets the cross context session id manager
*
* @param idManager the cross context session id manager.
@@ -253,19 +243,6 @@ public interface SessionManager extends LifeCycle
public void complete(HttpSession session);
/**
- * Sets the session cookie name.
- * @param cookieName the session cookie name
- * @see #getSessionCookie()
- */
- public void setSessionCookie(String cookieName);
-
- /**
- * @return the session cookie name, by default "JSESSIONID".
- * @see #setSessionCookie(String)
- */
- public String getSessionCookie();
-
- /**
* Sets the session id URL path parameter name.
*
* @param parameterName the URL path parameter name for session id URL rewriting (null or "none" for no rewriting).
@@ -288,48 +265,22 @@ public interface SessionManager extends LifeCycle
public String getSessionIdPathParameterNamePrefix();
/**
- * Sets the domain to set on the session cookie
- * @param domain the domain to set on the session cookie
- * @see #getSessionDomain()
- */
- public void setSessionDomain(String domain);
-
- /**
- * @return the domain to set on the session cookie
- * @see #setSessionDomain(String)
+ * @return whether the session management is handled via cookies.
*/
- public String getSessionDomain();
-
+ public boolean isUsingCookies();
+
/**
- * Sets the path to set on the session cookie
- * @param path the path to set on the session cookie
- * @see #getSessionPath()
+ * @return whether the session management is handled via URLs.
*/
- public void setSessionPath(String path);
+ public boolean isUsingURLs();
- /**
- * @return the path to set on the session cookie
- * @see #setSessionPath(String)
- */
- public String getSessionPath();
+ public Set<SessionTrackingMode> getDefaultSessionTrackingModes();
- /**
- * Sets the max age to set on the session cookie, in seconds
- * @param maxCookieAge the max age to set on the session cookie, in seconds
- * @see #getMaxCookieAge()
- */
- public void setMaxCookieAge(int maxCookieAge);
+ public Set<SessionTrackingMode> getEffectiveSessionTrackingModes();
- /**
- * @return the max age to set on the session cookie, in seconds
- * @see #setMaxCookieAge(int)
- */
- public int getMaxCookieAge();
+ public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes);
- /**
- * @return whether the session management is handled via cookies.
- */
- public boolean isUsingCookies();
+ public SessionCookieConfig getSessionCookieConfig();
/**
* @return True if absolute URLs are check for remoteness before being session encoded.
@@ -340,5 +291,4 @@ public interface SessionManager extends LifeCycle
* @param remote True if absolute URLs are check for remoteness before being session encoded.
*/
public void setCheckingRemoteSessionIdEncoding(boolean remote);
-
}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java
index 6e6401cfa8..bbc943acf1 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java
@@ -19,6 +19,7 @@ import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
+import java.security.AccessController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -30,7 +31,9 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.EnumSet;
+import javax.servlet.DispatcherType;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
@@ -39,9 +42,16 @@ import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
+import javax.servlet.Filter;
+import javax.servlet.FilterRegistration;
+import javax.servlet.FilterRegistration.Dynamic;
+import javax.servlet.descriptor.JspConfigDescriptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -49,7 +59,6 @@ import org.eclipse.jetty.http.HttpException;
import org.eclipse.jetty.http.MimeTypes;
import org.eclipse.jetty.io.Buffer;
import org.eclipse.jetty.server.Dispatcher;
-import org.eclipse.jetty.server.DispatcherType;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HandlerContainer;
import org.eclipse.jetty.server.HttpConnection;
@@ -488,6 +497,19 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
{
setEventListeners((EventListener[])LazyList.addToArray(getEventListeners(),listener,EventListener.class));
}
+
+
+ /**
+ * Apply any necessary restrictions on a programmatically added
+ * listener.
+ *
+ * Superclasses should implement.
+ *
+ * @param listener
+ */
+ public void restrictEventListener (EventListener listener)
+ {
+ }
/* ------------------------------------------------------------ */
/**
@@ -637,14 +659,25 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
ServletContextEvent event = new ServletContextEvent(_scontext);
for (int i = 0; i < LazyList.size(_contextListeners); i++)
{
- ((ServletContextListener)LazyList.get(_contextListeners,i)).contextInitialized(event);
+ callContextInitialized(((ServletContextListener)LazyList.get(_contextListeners, i)), event);
}
}
+ }
+ /* ------------------------------------------------------------ */
+ public void callContextInitialized (ServletContextListener l, ServletContextEvent e)
+ {
+ l.contextInitialized(e);
Log.info("started {}",this);
}
/* ------------------------------------------------------------ */
+ public void callContextDestroyed (ServletContextListener l, ServletContextEvent e)
+ {
+ l.contextDestroyed(e);
+ }
+
+ /* ------------------------------------------------------------ */
/*
* @see org.eclipse.thread.AbstractLifeCycle#doStop()
*/
@@ -1328,6 +1361,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
_localeEncodingMap.put(locale,encoding);
}
+ /* ------------------------------------------------------------ */
public String getLocaleEncoding(String locale)
{
if (_localeEncodingMap == null)
@@ -1471,6 +1505,10 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
*/
public class Context implements ServletContext
{
+ protected int _majorVersion = 3;
+ protected int _minorVersion = 0;
+ protected boolean _enabled = true; //whether or not the dynamic API is enabled for callers
+
/* ------------------------------------------------------------ */
protected Context()
{
@@ -1487,6 +1525,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getContext(java.lang.String)
*/
+ @Override
public ServletContext getContext(String uripath)
{
List<ContextHandler> contexts = new ArrayList<ContextHandler>();
@@ -1572,15 +1611,18 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getMajorVersion()
*/
+ @Override
public int getMajorVersion()
{
- return 2;
+ return 3;
}
+
/* ------------------------------------------------------------ */
/*
* @see javax.servlet.ServletContext#getMimeType(java.lang.String)
*/
+ @Override
public String getMimeType(String file)
{
if (_mimeTypes == null)
@@ -1595,15 +1637,17 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getMinorVersion()
*/
+ @Override
public int getMinorVersion()
{
- return 5;
+ return 0;
}
/* ------------------------------------------------------------ */
/*
* @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
*/
+ @Override
public RequestDispatcher getNamedDispatcher(String name)
{
return null;
@@ -1613,6 +1657,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String)
*/
+ @Override
public RequestDispatcher getRequestDispatcher(String uriInContext)
{
if (uriInContext == null)
@@ -1649,6 +1694,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getRealPath(java.lang.String)
*/
+ @Override
public String getRealPath(String path)
{
if (path == null)
@@ -1677,6 +1723,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
}
/* ------------------------------------------------------------ */
+ @Override
public URL getResource(String path) throws MalformedURLException
{
Resource resource = ContextHandler.this.getResource(path);
@@ -1689,6 +1736,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String)
*/
+ @Override
public InputStream getResourceAsStream(String path)
{
try
@@ -1709,6 +1757,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
*/
+ @Override
public Set getResourcePaths(String path)
{
return ContextHandler.this.getResourcePaths(path);
@@ -1718,6 +1767,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getServerInfo()
*/
+ @Override
public String getServerInfo()
{
return "jetty/" + Server.getVersion();
@@ -1727,6 +1777,8 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getServlet(java.lang.String)
*/
+ @Override
+ @Deprecated
public Servlet getServlet(String name) throws ServletException
{
return null;
@@ -1737,6 +1789,8 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
* @see javax.servlet.ServletContext#getServletNames()
*/
@SuppressWarnings("unchecked")
+ @Override
+ @Deprecated
public Enumeration getServletNames()
{
return Collections.enumeration(Collections.EMPTY_LIST);
@@ -1747,6 +1801,8 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
* @see javax.servlet.ServletContext#getServlets()
*/
@SuppressWarnings("unchecked")
+ @Override
+ @Deprecated
public Enumeration getServlets()
{
return Collections.enumeration(Collections.EMPTY_LIST);
@@ -1756,6 +1812,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#log(java.lang.Exception, java.lang.String)
*/
+ @Override
public void log(Exception exception, String msg)
{
_logger.warn(msg,exception);
@@ -1765,6 +1822,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#log(java.lang.String)
*/
+ @Override
public void log(String msg)
{
_logger.info(msg);
@@ -1774,6 +1832,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#log(java.lang.String, java.lang.Throwable)
*/
+ @Override
public void log(String message, Throwable throwable)
{
_logger.warn(message,throwable);
@@ -1783,6 +1842,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
*/
+ @Override
public String getInitParameter(String name)
{
return ContextHandler.this.getInitParameter(name);
@@ -1793,6 +1853,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
* @see javax.servlet.ServletContext#getInitParameterNames()
*/
@SuppressWarnings("unchecked")
+ @Override
public Enumeration getInitParameterNames()
{
return ContextHandler.this.getInitParameterNames();
@@ -1802,6 +1863,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getAttribute(java.lang.String)
*/
+ @Override
public synchronized Object getAttribute(String name)
{
Object o = ContextHandler.this.getAttribute(name);
@@ -1815,6 +1877,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
* @see javax.servlet.ServletContext#getAttributeNames()
*/
@SuppressWarnings("unchecked")
+ @Override
public synchronized Enumeration getAttributeNames()
{
HashSet<String> set = new HashSet<String>();
@@ -1835,6 +1898,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#setAttribute(java.lang.String, java.lang.Object)
*/
+ @Override
public synchronized void setAttribute(String name, Object value)
{
checkManagedAttribute(name,value);
@@ -1867,6 +1931,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#removeAttribute(java.lang.String)
*/
+ @Override
public synchronized void removeAttribute(String name)
{
checkManagedAttribute(name,null);
@@ -1896,6 +1961,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
/*
* @see javax.servlet.ServletContext#getServletContextName()
*/
+ @Override
public String getServletContextName()
{
String name = ContextHandler.this.getDisplayName();
@@ -1905,6 +1971,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
}
/* ------------------------------------------------------------ */
+ @Override
public String getContextPath()
{
if ((_contextPath != null) && _contextPath.equals(URIUtil.SLASH))
@@ -1921,6 +1988,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
}
/* ------------------------------------------------------------ */
+ @Override
public boolean setInitParameter(String name, String value)
{
if (ContextHandler.this.getInitParameter(name) != null)
@@ -1929,6 +1997,236 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server.
return true;
}
+ /* ------------------------------------------------------------ */
+ final private static String __unimplmented="Unimplemented - use org.eclipse.jetty.servlet.ServletContextHandler";
+
+ @Override
+ public Dynamic addFilter(String filterName, Class<? extends Filter> filterClass)
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public Dynamic addFilter(String filterName, Filter filter)
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public Dynamic addFilter(String filterName, String className)
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public javax.servlet.ServletRegistration.Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass)
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public javax.servlet.ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public javax.servlet.ServletRegistration.Dynamic addServlet(String servletName, String className)
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public <T extends Filter> T createFilter(Class<T> c) throws ServletException
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public <T extends Servlet> T createServlet(Class<T> c) throws ServletException
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public FilterRegistration getFilterRegistration(String filterName)
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public Map<String, ? extends FilterRegistration> getFilterRegistrations()
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public ServletRegistration getServletRegistration(String servletName)
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public Map<String, ? extends ServletRegistration> getServletRegistrations()
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public SessionCookieConfig getSessionCookieConfig()
+ {
+ Log.warn(__unimplmented);
+ return null;
+ }
+
+ @Override
+ public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes)
+ {
+ Log.warn(__unimplmented);
+ }
+
+ @Override
+ public void addListener(String className)
+ {
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
+ try
+ {
+ Class<? extends EventListener> clazz = _classLoader==null?Loader.loadClass(ContextHandler.class,className):_classLoader.loadClass(className);
+ addListener(clazz);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ @Override
+ public <T extends EventListener> void addListener(T t)
+ {
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+ ContextHandler.this.addEventListener(t);
+ }
+
+ @Override
+ public void addListener(Class<? extends EventListener> listenerClass)
+ {
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
+ try
+ {
+ EventListener e = createListener(listenerClass);
+ ContextHandler.this.addEventListener(e);
+ ContextHandler.this.restrictEventListener(e);
+ }
+ catch (ServletException e)
+ {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ @Override
+ public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException
+ {
+ try
+ {
+ return clazz.newInstance();
+ }
+ catch (InstantiationException e)
+ {
+ throw new ServletException(e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new ServletException(e);
+ }
+ }
+
+ @Override
+ public ClassLoader getClassLoader()
+ {
+ AccessController.checkPermission(new RuntimePermission("getClassLoader"));
+ return _classLoader;
+ }
+
+ @Override
+ public int getEffectiveMajorVersion()
+ {
+ return _majorVersion;
+ }
+
+ @Override
+ public int getEffectiveMinorVersion()
+ {
+ return _minorVersion;
+ }
+
+ public void setEffectiveMajorVersion (int v)
+ {
+ _majorVersion = v;
+ }
+
+ public void setEffectiveMinorVersion (int v)
+ {
+ _minorVersion = v;
+ }
+
+ @Override
+ public JspConfigDescriptor getJspConfigDescriptor()
+ {
+ return null;
+ }
+
+ @Override
+ public void declareRoles(String... roleNames)
+ {
+ if (!isStarting())
+ throw new IllegalStateException ();
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setEnabled(boolean enabled)
+ {
+ _enabled = enabled;
+ }
+
+ public boolean isEnabled()
+ {
+ return _enabled;
+ }
}
private static class CLDump implements Dumpable
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java
index 24b1d2ed92..76ee4391a0 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java
@@ -15,12 +15,12 @@ package org.eclipse.jetty.server.handler;
import java.io.IOException;
+import javax.servlet.DispatcherType;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.AsyncContinuation;
-import org.eclipse.jetty.server.DispatcherType;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Response;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java
index 9e6f0f70f7..60642a2f42 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java
@@ -17,16 +17,20 @@ import static java.lang.Math.round;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import javax.servlet.ServletContext;
-import javax.servlet.ServletRequest;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionActivationListener;
@@ -59,18 +63,20 @@ import org.eclipse.jetty.util.statistic.SampleStatistic;
* a specialised version of the Session inner class that provides an attribute
* Map.
* <p>
- *
*
*/
public abstract class AbstractSessionManager extends AbstractLifeCycle implements SessionManager
{
+ public Set<SessionTrackingMode> __defaultSessionTrackingModes =
+ Collections.unmodifiableSet(
+ new HashSet<SessionTrackingMode>(
+ Arrays.asList(new SessionTrackingMode[]{SessionTrackingMode.COOKIE,SessionTrackingMode.URL})));
+
/* ------------------------------------------------------------ */
public final static int __distantFuture=60*60*24*7*52*20;
private static final HttpSessionContext __nullSessionContext=new NullSessionContext();
- private boolean _usingCookies=true;
-
/* ------------------------------------------------------------ */
// Setting of max inactive interval for new sessions
// -1 means no timeout
@@ -93,13 +99,20 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
protected int _refreshCookieAge;
protected boolean _nodeIdInSessionId;
protected boolean _checkingRemoteSessionIdEncoding;
+ protected String _sessionComment;
+
+ public Set<SessionTrackingMode> _sessionTrackingModes;
+ private boolean _usingCookies;
+ private boolean _usingURLs;
+
protected final CounterStatistic _sessionsStats = new CounterStatistic();
protected final SampleStatistic _sessionTimeStats = new SampleStatistic();
/* ------------------------------------------------------------ */
public AbstractSessionManager()
{
+ setSessionTrackingModes(__defaultSessionTrackingModes);
}
/* ------------------------------------------------------------ */
@@ -113,7 +126,7 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
// Do we need to refresh the cookie?
if (isUsingCookies() &&
(s.isIdChanged() ||
- (getMaxCookieAge()>0 && getRefreshCookieAge()>0 && ((now-s.getCookieSetTime())/1000>getRefreshCookieAge()))
+ (getSessionCookieConfig().getMaxAge()>0 && getRefreshCookieAge()>0 && ((now-s.getCookieSetTime())/1000>getRefreshCookieAge()))
)
)
{
@@ -239,7 +252,6 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
}
/* ------------------------------------------------------------ */
- /* ------------------------------------------------------------ */
/**
* @return Returns the metaManager used for cross context session management
*/
@@ -249,15 +261,10 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
}
/* ------------------------------------------------------------ */
- public int getMaxCookieAge()
- {
- return _maxCookieAge;
- }
-
- /* ------------------------------------------------------------ */
/**
* @return seconds
*/
+ @Override
public int getMaxInactiveInterval()
{
return _dftMaxIdleSecs;
@@ -317,22 +324,6 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
return _refreshCookieAge;
}
-
- /* ------------------------------------------------------------ */
- /**
- * @return Returns the secureCookies.
- */
- public boolean getSecureCookies()
- {
- return _secureCookies;
- }
-
- /* ------------------------------------------------------------ */
- public String getSessionCookie()
- {
- return _sessionCookie;
- }
-
/* ------------------------------------------------------------ */
public HttpCookie getSessionCookie(HttpSession session, String contextPath, boolean requestIsSecure)
{
@@ -341,25 +332,37 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
String sessionPath = (_sessionPath==null) ? contextPath : _sessionPath;
sessionPath = (sessionPath==null||sessionPath.length()==0) ? "/" : sessionPath;
String id = getNodeId(session);
- HttpCookie cookie=new HttpCookie(
- _sessionCookie,
- id,
- _sessionDomain,
- sessionPath,
- getMaxCookieAge(),
- getHttpOnly(),
- requestIsSecure&&getSecureCookies());
-
+ HttpCookie cookie = null;
+ if (_sessionComment == null)
+ {
+ cookie = new HttpCookie(
+ _sessionCookie,
+ id,
+ _sessionDomain,
+ sessionPath,
+ _cookieConfig.getMaxAge(),
+ _cookieConfig.isHttpOnly(),
+ _cookieConfig.isSecure());
+ }
+ else
+ {
+ cookie = new HttpCookie(
+ _sessionCookie,
+ id,
+ _sessionDomain,
+ sessionPath,
+ _cookieConfig.getMaxAge(),
+ _cookieConfig.isHttpOnly(),
+ _cookieConfig.isSecure(),
+ _sessionComment,
+ 1);
+ }
+
return cookie;
}
return null;
}
- public String getSessionDomain()
- {
- return _sessionDomain;
- }
-
/* ------------------------------------------------------------ */
/**
* @return Returns the sessionHandler.
@@ -376,12 +379,6 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
public abstract Map getSessionMap();
/* ------------------------------------------------------------ */
- public String getSessionPath()
- {
- return _sessionPath;
- }
-
- /* ------------------------------------------------------------ */
public int getSessions()
{
return (int)_sessionsStats.getCurrent();
@@ -400,15 +397,6 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
}
/* ------------------------------------------------------------ */
- /**
- * @return Returns the usingCookies.
- */
- public boolean isUsingCookies()
- {
- return _usingCookies;
- }
-
- /* ------------------------------------------------------------ */
public boolean isValid(HttpSession session)
{
Session s = ((SessionIf)session).getSession();
@@ -491,16 +479,6 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
}
/* ------------------------------------------------------------ */
- public void setMaxCookieAge(int maxCookieAgeInSeconds)
- {
- _maxCookieAge=maxCookieAgeInSeconds;
-
- if (_maxCookieAge>0 && _refreshCookieAge==0)
- _refreshCookieAge=_maxCookieAge/3;
-
- }
-
- /* ------------------------------------------------------------ */
/**
* @param seconds
*/
@@ -510,22 +488,11 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
}
/* ------------------------------------------------------------ */
- /**
- * @deprecated use {@link #setIdManager(SessionIdManager)}
- */
- @Deprecated
- public void setMetaManager(SessionIdManager metaManager)
- {
- setIdManager(metaManager);
- }
-
- /* ------------------------------------------------------------ */
public void setRefreshCookieAge(int ageInSeconds)
{
_refreshCookieAge=ageInSeconds;
}
-
/* ------------------------------------------------------------ */
/**
* Set if the session manager should use SecureCookies.
@@ -580,16 +547,6 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
_sessionIdPathParameterName =(param==null||"none".equals(param))?null:param;
_sessionIdPathParameterNamePrefix =(param==null||"none".equals(param))?null:(";"+ _sessionIdPathParameterName +"=");
}
- /* ------------------------------------------------------------ */
- /**
- * @param usingCookies
- * The usingCookies to set.
- */
- public void setUsingCookies(boolean usingCookies)
- {
- _usingCookies=usingCookies;
- }
-
protected abstract void addSession(Session session);
@@ -711,6 +668,139 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement
}
/* ------------------------------------------------------------ */
+ public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
+ {
+ return __defaultSessionTrackingModes;
+ }
+
+ /* ------------------------------------------------------------ */
+ public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
+ {
+ return Collections.unmodifiableSet(_sessionTrackingModes);
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes)
+ {
+ _sessionTrackingModes=new HashSet<SessionTrackingMode>(sessionTrackingModes);
+ _usingCookies=_sessionTrackingModes.contains(SessionTrackingMode.COOKIE);
+ _usingURLs=_sessionTrackingModes.contains(SessionTrackingMode.URL);
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public boolean isUsingCookies()
+ {
+ return _usingCookies;
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public boolean isUsingURLs()
+ {
+ return _usingURLs;
+ }
+
+
+ /* ------------------------------------------------------------ */
+ public SessionCookieConfig getSessionCookieConfig()
+ {
+ return _cookieConfig;
+ }
+
+ /* ------------------------------------------------------------ */
+ private SessionCookieConfig _cookieConfig =
+ new SessionCookieConfig()
+ {
+ @Override
+ public String getComment()
+ {
+ return _sessionComment;
+ }
+
+ @Override
+ public String getDomain()
+ {
+ return _sessionDomain;
+ }
+
+ @Override
+ public int getMaxAge()
+ {
+ return _maxCookieAge;
+ }
+
+ @Override
+ public String getName()
+ {
+ return _sessionCookie;
+ }
+
+ @Override
+ public String getPath()
+ {
+ return _sessionPath;
+ }
+
+ @Override
+ public boolean isHttpOnly()
+ {
+ return _httpOnly;
+ }
+
+ @Override
+ public boolean isSecure()
+ {
+ return _secureCookies;
+ }
+
+ @Override
+ public void setComment(String comment)
+ {
+ _sessionComment = comment;
+ }
+
+ @Override
+ public void setDomain(String domain)
+ {
+ _sessionDomain=domain;
+ }
+
+ @Override
+ public void setHttpOnly(boolean httpOnly)
+ {
+ _httpOnly=httpOnly;
+ }
+
+ @Override
+ public void setMaxAge(int maxAge)
+ {
+ _maxCookieAge=maxAge;
+ }
+
+ @Override
+ public void setName(String name)
+ {
+ _sessionCookie=name;
+ }
+
+ @Override
+ public void setPath(String path)
+ {
+ _sessionPath=path;
+ }
+
+ @Override
+ public void setSecure(boolean secure)
+ {
+ _secureCookies=secure;
+ }
+
+ };
+
+
+ /* ------------------------------------------------------------ */
/**
* @return total amount of time all sessions remained valid
*/
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java
index 5afa4912d2..f2cf57fed1 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/HashSessionManager.java
@@ -28,6 +28,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
+import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionManager.java
index 5742692392..e1e48a3b4e 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionManager.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionManager.java
@@ -29,9 +29,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;
+import javax.servlet.SessionTrackingMode;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java
index 46662cddd8..f567c30256 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java
@@ -14,16 +14,18 @@
package org.eclipse.jetty.server.session;
import java.io.IOException;
+import java.util.EnumSet;
import java.util.EventListener;
+import javax.servlet.DispatcherType;
import javax.servlet.ServletException;
+import javax.servlet.SessionTrackingMode;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.eclipse.jetty.http.HttpCookie;
-import org.eclipse.jetty.server.DispatcherType;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.SessionManager;
@@ -35,6 +37,8 @@ import org.eclipse.jetty.util.log.Log;
*/
public class SessionHandler extends ScopedHandler
{
+ public final static EnumSet<SessionTrackingMode> DEFAULT_TRACKING = EnumSet.of(SessionTrackingMode.COOKIE,SessionTrackingMode.URL);
+
/* -------------------------------------------------------------- */
private SessionManager _sessionManager;
@@ -247,9 +251,10 @@ public class SessionHandler extends ScopedHandler
Cookie[] cookies=request.getCookies();
if (cookies!=null && cookies.length>0)
{
+ final String sessionCookie=sessionManager.getSessionCookieConfig().getName();
for (int i=0;i<cookies.length;i++)
{
- if (sessionManager.getSessionCookie().equalsIgnoreCase(cookies[i].getName()))
+ if (sessionCookie.equalsIgnoreCase(cookies[i].getName()))
{
if (requested_session_id!=null)
{
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncContextTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncContextTest.java
index c0b85eb0a2..bb30107f7e 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncContextTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncContextTest.java
@@ -18,7 +18,11 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStream;
-
+import java.util.concurrent.atomic.AtomicInteger;
+import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.DispatcherType;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -60,71 +64,116 @@ public class AsyncContextTest
@Test
public void testSuspendResume() throws Exception
{
+ String response;
+ __completed.set(0);
+ __completed1.set(0);
_handler.setRead(0);
_handler.setSuspendFor(1000);
_handler.setResumeAfter(-1);
_handler.setCompleteAfter(-1);
- check("TIMEOUT",process(null));
+ response=process(null);
+ check(response,"TIMEOUT");
+ assertEquals(1,__completed.get());
+ assertEquals(1,__completed1.get());
_handler.setSuspendFor(10000);
_handler.setResumeAfter(0);
_handler.setCompleteAfter(-1);
- check("RESUMED",process(null));
+ response=process(null);
+ check(response,"DISPATCHED");
_handler.setResumeAfter(100);
_handler.setCompleteAfter(-1);
- check("RESUMED",process(null));
+ response=process(null);
+ check(response,"DISPATCHED");
_handler.setResumeAfter(-1);
_handler.setCompleteAfter(0);
- check("COMPLETED",process(null));
+ response=process(null);
+ check(response,"COMPLETED");
_handler.setResumeAfter(-1);
_handler.setCompleteAfter(200);
- check("COMPLETED",process(null));
+ response=process(null);
+ check(response,"COMPLETED");
_handler.setRead(-1);
_handler.setResumeAfter(0);
_handler.setCompleteAfter(-1);
- check("RESUMED",process("wibble"));
+ response=process("wibble");
+ check(response,"DISPATCHED");
_handler.setResumeAfter(100);
_handler.setCompleteAfter(-1);
- check("RESUMED",process("wibble"));
+ check(response,"DISPATCHED");
_handler.setResumeAfter(-1);
_handler.setCompleteAfter(0);
- check("COMPLETED",process("wibble"));
+ response=process("wibble");
+ check(response,"COMPLETED");
_handler.setResumeAfter(-1);
_handler.setCompleteAfter(100);
- check("COMPLETED",process("wibble"));
+ response=process("wibble");
+ check(response,"COMPLETED");
_handler.setRead(6);
_handler.setResumeAfter(0);
_handler.setCompleteAfter(-1);
- check("RESUMED",process("wibble"));
+ response=process("wibble");
+ check(response,"DISPATCHED");
_handler.setResumeAfter(100);
_handler.setCompleteAfter(-1);
- check("RESUMED",process("wibble"));
+ response=process("wibble");
+ check(response,"DISPATCHED");
_handler.setResumeAfter(-1);
_handler.setCompleteAfter(0);
- check("COMPLETED",process("wibble"));
+ response=process("wibble");
+ check(response,"COMPLETED");
_handler.setResumeAfter(-1);
_handler.setCompleteAfter(100);
- check("COMPLETED",process("wibble"));
+ response=process("wibble");
+ check(response,"COMPLETED");
+ }
+
+ public void testTwoCycles() throws Exception
+ {
+ String response;
+
+ __completed.set(0);
+ __completed1.set(0);
+
+ _handler.setRead(0);
+ _handler.setSuspendFor(1000);
+ _handler.setResumeAfter(100);
+ _handler.setCompleteAfter(-1);
+ _handler.setSuspendFor2(1000);
+ _handler.setResumeAfter2(200);
+ _handler.setCompleteAfter2(-1);
+ response=process(null);
+ check(response,"STARTASYNC","DISPATCHED","startasync","STARTASYNC","DISPATCHED");
+ assertEquals(1,__completed.get());
+ assertEquals(0,__completed1.get());
+
}
- protected void check(String content,String response)
+ protected void check(String response,String... content)
{
assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
- assertTrue(response.contains(content));
+ int i=0;
+ for (String m:content)
+ {
+ i=response.indexOf(m,i);
+ assertTrue(i>=0);
+ i+=m.length();
+ }
+
}
private synchronized String process(String content) throws Exception
@@ -145,6 +194,9 @@ public class AsyncContextTest
private long _suspendFor=-1;
private long _resumeAfter=-1;
private long _completeAfter=-1;
+ private long _suspendFor2=-1;
+ private long _resumeAfter2=-1;
+ private long _completeAfter2=-1;
public SuspendHandler()
{
@@ -189,108 +241,287 @@ public class AsyncContextTest
{
_completeAfter = completeAfter;
}
+
+
+
+ /* ------------------------------------------------------------ */
+ /** Get the suspendFor2.
+ * @return the suspendFor2
+ */
+ public long getSuspendFor2()
+ {
+ return _suspendFor2;
+ }
+
+
+ /* ------------------------------------------------------------ */
+ /** Set the suspendFor2.
+ * @param suspendFor2 the suspendFor2 to set
+ */
+ public void setSuspendFor2(long suspendFor2)
+ {
+ _suspendFor2 = suspendFor2;
+ }
+
+
+ /* ------------------------------------------------------------ */
+ /** Get the resumeAfter2.
+ * @return the resumeAfter2
+ */
+ public long getResumeAfter2()
+ {
+ return _resumeAfter2;
+ }
+
+
+ /* ------------------------------------------------------------ */
+ /** Set the resumeAfter2.
+ * @param resumeAfter2 the resumeAfter2 to set
+ */
+ public void setResumeAfter2(long resumeAfter2)
+ {
+ _resumeAfter2 = resumeAfter2;
+ }
+
+
+ /* ------------------------------------------------------------ */
+ /** Get the completeAfter2.
+ * @return the completeAfter2
+ */
+ public long getCompleteAfter2()
+ {
+ return _completeAfter2;
+ }
+
+
+ /* ------------------------------------------------------------ */
+ /** Set the completeAfter2.
+ * @param completeAfter2 the completeAfter2 to set
+ */
+ public void setCompleteAfter2(long completeAfter2)
+ {
+ _completeAfter2 = completeAfter2;
+ }
+
@Override
public void handle(String target, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException
{
- if (DispatcherType.REQUEST.equals(baseRequest.getDispatcherType()))
+ try
{
- if (_read>0)
- {
- byte[] buf=new byte[_read];
- request.getInputStream().read(buf);
- }
- else if (_read<0)
+ if (DispatcherType.REQUEST.equals(baseRequest.getDispatcherType()))
{
- InputStream in = request.getInputStream();
- int b=in.read();
- while(b!=-1)
- b=in.read();
- }
-
- final AsyncContext asyncContext = baseRequest.startAsync();
- asyncContext.addContinuationListener(__asyncListener);
- if (_suspendFor>0)
- asyncContext.setTimeout(_suspendFor);
-
- if (_completeAfter>0)
- {
- new Thread() {
- @Override
- public void run()
- {
- try
+ if (_read>0)
+ {
+ byte[] buf=new byte[_read];
+ request.getInputStream().read(buf);
+ }
+ else if (_read<0)
+ {
+ InputStream in = request.getInputStream();
+ int b=in.read();
+ while(b!=-1)
+ b=in.read();
+ }
+
+
+ final AsyncContext asyncContext = baseRequest.startAsync();
+ response.getOutputStream().println("STARTASYNC");
+ asyncContext.addListener(__asyncListener);
+ asyncContext.addListener(__asyncListener1);
+ if (_suspendFor>0)
+ asyncContext.setTimeout(_suspendFor);
+
+
+ if (_completeAfter>0)
+ {
+ new Thread() {
+ @Override
+ public void run()
{
- Thread.sleep(_completeAfter);
- response.getOutputStream().print("COMPLETED");
- response.setStatus(200);
- baseRequest.setHandled(true);
- asyncContext.complete();
+ try
+ {
+ Thread.sleep(_completeAfter);
+ response.getOutputStream().println("COMPLETED");
+ response.setStatus(200);
+ baseRequest.setHandled(true);
+ asyncContext.complete();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
}
- catch(Exception e)
+ }.start();
+ }
+ else if (_completeAfter==0)
+ {
+ response.getOutputStream().println("COMPLETED");
+ response.setStatus(200);
+ baseRequest.setHandled(true);
+ asyncContext.complete();
+ }
+
+ if (_resumeAfter>0)
+ {
+ new Thread() {
+ @Override
+ public void run()
{
- e.printStackTrace();
+ try
+ {
+ Thread.sleep(_resumeAfter);
+ if(((HttpServletRequest)asyncContext.getRequest()).getSession(true).getId()!=null)
+ asyncContext.dispatch();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
}
- }
- }.start();
+ }.start();
+ }
+ else if (_resumeAfter==0)
+ {
+ asyncContext.dispatch();
+ }
}
- else if (_completeAfter==0)
+ else
{
- response.getOutputStream().print("COMPLETED");
- response.setStatus(200);
- baseRequest.setHandled(true);
- asyncContext.complete();
- }
+ if (request.getAttribute("TIMEOUT")!=null)
+ response.getOutputStream().println("TIMEOUT");
+ else
+ response.getOutputStream().println("DISPATCHED");
+
+ if (_suspendFor2>=0)
+ {
+ final AsyncContext asyncContext = baseRequest.startAsync();
+ response.getOutputStream().println("STARTASYNC2");
+ if (_suspendFor2>0)
+ asyncContext.setTimeout(_suspendFor2);
+ _suspendFor2=-1;
+
+ if (_completeAfter2>0)
+ {
+ new Thread() {
+ @Override
+ public void run()
+ {
+ try
+ {
+ Thread.sleep(_completeAfter2);
+ response.getOutputStream().println("COMPLETED2");
+ response.setStatus(200);
+ baseRequest.setHandled(true);
+ asyncContext.complete();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }.start();
+ }
+ else if (_completeAfter2==0)
+ {
+ response.getOutputStream().println("COMPLETED2");
+ response.setStatus(200);
+ baseRequest.setHandled(true);
+ asyncContext.complete();
+ }
- if (_resumeAfter>0)
- {
- new Thread() {
- @Override
- public void run()
+ if (_resumeAfter2>0)
{
- try
- {
- Thread.sleep(_resumeAfter);
- if(((HttpServletRequest)asyncContext.getRequest()).getSession(true).getId()!=null)
- asyncContext.dispatch();
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
+ new Thread() {
+ @Override
+ public void run()
+ {
+ try
+ {
+ Thread.sleep(_resumeAfter2);
+ asyncContext.dispatch();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }.start();
}
- }.start();
- }
- else if (_resumeAfter==0)
- {
- asyncContext.dispatch();
+ else if (_resumeAfter2==0)
+ {
+ asyncContext.dispatch();
+ }
+ }
+ else
+ {
+ response.setStatus(200);
+ baseRequest.setHandled(true);
+ }
}
}
- else if (request.getAttribute("TIMEOUT")!=null)
- {
- response.setStatus(200);
- response.getOutputStream().print("TIMEOUT");
- baseRequest.setHandled(true);
- }
- else
+ finally
{
- response.setStatus(200);
- response.getOutputStream().print("RESUMED");
- baseRequest.setHandled(true);
}
}
}
- private static ContinuationListener __asyncListener = new ContinuationListener()
+ static AtomicInteger __completed = new AtomicInteger();
+ static AtomicInteger __completed1 = new AtomicInteger();
+
+ private static AsyncListener __asyncListener = new AsyncListener()
+ {
+
+ @Override
+ public void onComplete(AsyncEvent event) throws IOException
+ {
+ __completed.incrementAndGet();
+ }
+
+ @Override
+ public void onError(AsyncEvent event) throws IOException
+ {
+ __completed.incrementAndGet();
+ }
+
+ @Override
+ public void onStartAsync(AsyncEvent event) throws IOException
+ {
+ event.getSuppliedResponse().getOutputStream().println("startasync");
+ event.getAsyncContext().addListener(this);
+ }
+
+ @Override
+ public void onTimeout(AsyncEvent event) throws IOException
+ {
+ event.getSuppliedRequest().setAttribute("TIMEOUT",Boolean.TRUE);
+ event.getAsyncContext().dispatch();
+ }
+
+ };
+
+ private static AsyncListener __asyncListener1 = new AsyncListener()
{
- public void onComplete(Continuation continuation)
+
+ @Override
+ public void onComplete(AsyncEvent event) throws IOException
{
+ __completed1.incrementAndGet();
}
- public void onTimeout(Continuation continuation)
+ @Override
+ public void onError(AsyncEvent event) throws IOException
+ {
+ }
+ @Override
+ public void onStartAsync(AsyncEvent event) throws IOException
{
- continuation.setAttribute("TIMEOUT",Boolean.TRUE);
- continuation.resume();
}
+
+ @Override
+ public void onTimeout(AsyncEvent event) throws IOException
+ {
+ }
+
};
}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java
index e7b902f707..e787ccf563 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java
@@ -22,7 +22,10 @@ import java.net.Socket;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
-
+import javax.servlet.AsyncContext;
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
+import javax.servlet.DispatcherType;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -218,10 +221,9 @@ public class AsyncStressTest
if (suspend_for>=0)
{
final AsyncContext asyncContext = baseRequest.startAsync();
- asyncContext.addContinuationListener(__asyncListener);
+ asyncContext.addListener(__asyncListener);
if (suspend_for>0)
asyncContext.setTimeout(suspend_for);
-
if (complete_after>0)
{
TimerTask complete = new TimerTask()
@@ -317,18 +319,31 @@ public class AsyncStressTest
}
}
}
+
+
+ private static AsyncListener __asyncListener = new AsyncListener()
+ {
+ @Override
+ public void onComplete(AsyncEvent event) throws IOException
+ {
+ }
+ @Override
+ public void onTimeout(AsyncEvent event) throws IOException
+ {
+ event.getSuppliedRequest().setAttribute("TIMEOUT",Boolean.TRUE);
+ event.getSuppliedRequest().getAsyncContext().dispatch();
+ }
- private static ContinuationListener __asyncListener = new ContinuationListener()
- {
- public void onComplete(Continuation continuation)
+ @Override
+ public void onError(AsyncEvent event) throws IOException
{
+
}
- public void onTimeout(Continuation continuation)
+ @Override
+ public void onStartAsync(AsyncEvent event) throws IOException
{
- continuation.setAttribute("TIMEOUT",Boolean.TRUE);
- continuation.resume();
}
};
}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
index f9eafc8df5..6915447d06 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
@@ -567,10 +567,12 @@ public class RequestTest
assertNotSame(cookies.get(1), cookies.get(3));
cookies.clear();
+//NOTE: the javax.servlet.http.Cookie class sets the system property org.glassfish.web.rfc2109_cookie_names_enforced
+//to TRUE by default, and rejects all cookie names containing punctuation.Therefore this test cannot use "name2".
response=_connector.getResponses(
"POST / HTTP/1.1\r\n"+
"Host: whatever\r\n"+
- "Cookie: name0=value0; name1 = value1 ; \"\\\"name2\\\"\" = \"\\\"value2\\\"\" \n" +
+ "Cookie: name0=value0; name1 = value1 ; \"name2\" = \"\\\"value2\\\"\" \n" +
"Cookie: $Version=2; name3=value3=value3;$path=/path;$domain=acme.com;$port=8080, name4=; name5 = ; name6\n" +
"Cookie: name7=value7;\n" +
"Connection: close\r\n"+
@@ -580,7 +582,7 @@ public class RequestTest
assertEquals("value0", cookies.get(0).getValue());
assertEquals("name1", cookies.get(1).getName());
assertEquals("value1", cookies.get(1).getValue());
- assertEquals("\"name2\"", cookies.get(2).getName());
+ assertEquals("name2", cookies.get(2).getName());
assertEquals("\"value2\"", cookies.get(2).getValue());
assertEquals("name3", cookies.get(3).getName());
assertEquals("value3=value3", cookies.get(3).getValue());
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java
index 9234a5e808..97009a6e11 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java
@@ -24,6 +24,7 @@ import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Enumeration;
+import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
@@ -90,14 +91,15 @@ public class ResponseTest
response.setContentType("foo2/bar2");
assertEquals("foo2/bar2;charset=ISO-8859-1",response.getContentType());
response.setHeader("name","foo");
- Enumeration<?> en=response.getHeaders("name");
- assertEquals("foo",en.nextElement());
- assertFalse(en.hasMoreElements());
+
+ Iterator<String> en = response.getHeaders("name").iterator();
+ assertEquals("foo",en.next());
+ assertFalse(en.hasNext());
response.addHeader("name","bar");
- en=response.getHeaders("name");
- assertEquals("foo",en.nextElement());
- assertEquals("bar",en.nextElement());
- assertFalse(en.hasMoreElements());
+ en=response.getHeaders("name").iterator();
+ assertEquals("foo",en.next());
+ assertEquals("bar",en.next());
+ assertFalse(en.hasNext());
response.recycle();
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionHandlerTest.java
index 37f6d6a064..13bd96675e 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionHandlerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionHandlerTest.java
@@ -8,20 +8,29 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
+import java.util.Collection;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.Locale;
import java.util.Map;
-
+import java.util.Set;
+import javax.servlet.AsyncContext;
import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
+import javax.servlet.http.Part;
+import javax.servlet.DispatcherType;
import org.eclipse.jetty.http.HttpCookie;
-import org.eclipse.jetty.server.DispatcherType;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.SessionIdManager;
import org.eclipse.jetty.server.SessionManager;
@@ -50,6 +59,98 @@ public class SessionHandlerTest
SessionHandler sessionHandler = new SessionHandler();
sessionHandler.setSessionManager(new MockSessionManager()
{
+
+
+ public SessionCookieConfig getSessionCookieConfig()
+ {
+ return new SessionCookieConfig()
+ {
+
+ public String getComment()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getDomain()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public int getMaxAge()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public String getName()
+ {
+ return cookieName;
+ }
+
+ public String getPath()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean isHttpOnly()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public boolean isSecure()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void setComment(String comment)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setDomain(String domain)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setHttpOnly(boolean httpOnly)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setMaxAge(int maxAge)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setName(String name)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setPath(String path)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setSecure(boolean secure)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ };
+ }
public boolean isUsingCookies()
{
return true;
@@ -86,7 +187,8 @@ public class SessionHandlerTest
SessionHandler sessionHandler = new SessionHandler();
sessionHandler.setSessionManager(new MockSessionManager()
- {
+ {
+
@Override
public String getSessionIdPathParameterName()
{
@@ -378,6 +480,114 @@ public class SessionHandlerTest
public void setCharacterEncoding(String env) throws UnsupportedEncodingException
{
}
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#authenticate(javax.servlet.http.HttpServletResponse)
+ */
+ public boolean authenticate(HttpServletResponse response) throws IOException, ServletException
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getPart(java.lang.String)
+ */
+ public Part getPart(String name) throws IOException, ServletException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getParts()
+ */
+ public Collection<Part> getParts() throws IOException, ServletException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#login(java.lang.String, java.lang.String)
+ */
+ public void login(String username, String password) throws ServletException
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#logout()
+ */
+ public void logout() throws ServletException
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * @see javax.servlet.ServletRequest#getAsyncContext()
+ */
+ public AsyncContext getAsyncContext()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.ServletRequest#getDispatcherType()
+ */
+ public DispatcherType getDispatcherType()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.ServletRequest#getServletContext()
+ */
+ public ServletContext getServletContext()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.ServletRequest#isAsyncStarted()
+ */
+ public boolean isAsyncStarted()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /**
+ * @see javax.servlet.ServletRequest#isAsyncSupported()
+ */
+ public boolean isAsyncSupported()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /**
+ * @see javax.servlet.ServletRequest#startAsync()
+ */
+ public AsyncContext startAsync() throws IllegalStateException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * @see javax.servlet.ServletRequest#startAsync(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
+ */
+ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
/**
@@ -574,6 +784,50 @@ public class SessionHandlerTest
{
}
+ /**
+ * @see org.eclipse.jetty.server.SessionManager#getDefaultSessionTrackingModes()
+ */
+ public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.jetty.server.SessionManager#getEffectiveSessionTrackingModes()
+ */
+ public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.jetty.server.SessionManager#getSessionCookieConfig()
+ */
+ public SessionCookieConfig getSessionCookieConfig()
+ {
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.jetty.server.SessionManager#isUsingURLs()
+ */
+ public boolean isUsingURLs()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /**
+ * @see org.eclipse.jetty.server.SessionManager#setSessionTrackingModes(java.util.Set)
+ */
+ public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
private boolean _checkRemote=false;
public boolean isCheckingRemoteSessionIdEncoding()
diff --git a/jetty-servlet/pom.xml b/jetty-servlet/pom.xml
index 2be50f5b5f..87404abf06 100644
--- a/jetty-servlet/pom.xml
+++ b/jetty-servlet/pom.xml
@@ -3,7 +3,7 @@
<parent>
<artifactId>jetty-project</artifactId>
<groupId>org.eclipse.jetty</groupId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-servlet</artifactId>
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterHolder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterHolder.java
index cd9ae2ef5a..70b2710645 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterHolder.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterHolder.java
@@ -19,12 +19,13 @@ import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
-import org.eclipse.jetty.server.DispatcherType;
+import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
-import org.eclipse.jetty.servlet.api.FilterRegistration;
+import javax.servlet.FilterRegistration;
import javax.servlet.ServletException;
+import org.eclipse.jetty.servlet.Holder.Source;
import org.eclipse.jetty.util.TypeUtil;
import org.eclipse.jetty.util.log.Log;
@@ -44,14 +45,24 @@ public class FilterHolder extends Holder<Filter>
*/
public FilterHolder()
{
+ super (Source.EMBEDDED);
}
/* ---------------------------------------------------------------- */
/** Constructor
*/
+ public FilterHolder(Holder.Source source)
+ {
+ super (source);
+ }
+
+ /* ---------------------------------------------------------------- */
+ /** Constructor
+ */
public FilterHolder(Class<? extends Filter> filter)
{
+ super (Source.EMBEDDED);
setHeldClass(filter);
}
@@ -60,6 +71,7 @@ public class FilterHolder extends Holder<Filter>
*/
public FilterHolder(Filter filter)
{
+ super (Source.EMBEDDED);
setFilter(filter);
}
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterMapping.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterMapping.java
index bef03e29e1..ac7ea94cce 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterMapping.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/FilterMapping.java
@@ -17,7 +17,7 @@ import java.io.IOException;
import java.util.Arrays;
import java.util.EnumSet;
-import org.eclipse.jetty.server.DispatcherType;
+import javax.servlet.DispatcherType;
import org.eclipse.jetty.http.PathMap;
import org.eclipse.jetty.server.Handler;
@@ -170,8 +170,6 @@ public class FilterMapping implements Dumpable
}
}
-
-
/* ------------------------------------------------------------ */
/**
* @param dispatches The dispatches to set.
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Holder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Holder.java
index 7a92894b5d..8087cfbebf 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Holder.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/Holder.java
@@ -21,7 +21,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import org.eclipse.jetty.servlet.api.Registration;
+import javax.servlet.Registration;
import javax.servlet.ServletContext;
import javax.servlet.UnavailableException;
@@ -39,6 +39,8 @@ import org.eclipse.jetty.util.log.Log;
*/
public class Holder<T> extends AbstractLifeCycle implements Dumpable
{
+ public enum Source { EMBEDDED, JAVAX_API, DESCRIPTOR, ANNOTATION };
+ final private Source _source;
protected transient Class<? extends T> _class;
protected final Map<String,String> _initParams=new HashMap<String,String>(3);
protected String _className;
@@ -51,10 +53,16 @@ public class Holder<T> extends AbstractLifeCycle implements Dumpable
protected ServletHandler _servletHandler;
/* ---------------------------------------------------------------- */
- protected Holder()
+ protected Holder(Source source)
{
+ _source=source;
}
-
+
+ public Source getSource()
+ {
+ return _source;
+ }
+
/* ------------------------------------------------------------ */
/**
* @return True if this holder was created for a specific instance.
@@ -331,6 +339,12 @@ public class Holder<T> extends AbstractLifeCycle implements Dumpable
public boolean setInitParameter(String name, String value)
{
illegalStateIfContextStarted();
+ if (name == null) {
+ throw new IllegalArgumentException("init parameter name required");
+ }
+ if (value == null) {
+ throw new IllegalArgumentException("non-null value required for init parameter " + name);
+ }
if (Holder.this.getInitParameter(name)!=null)
return false;
Holder.this.setInitParameter(name,value);
@@ -341,20 +355,28 @@ public class Holder<T> extends AbstractLifeCycle implements Dumpable
{
illegalStateIfContextStarted();
Set<String> clash=null;
- for (String name : initParameters.keySet())
+ for (Map.Entry<String, String> entry : initParameters.entrySet())
{
- if (Holder.this.getInitParameter(name)!=null)
+ if (entry.getKey() == null) {
+ throw new IllegalArgumentException("init parameter name required");
+ }
+ if (entry.getValue() == null) {
+ throw new IllegalArgumentException("non-null value required for init parameter " + entry.getKey());
+ }
+ if (Holder.this.getInitParameter(entry.getKey())!=null)
{
if (clash==null)
clash=new HashSet<String>();
- clash.add(name);
+ clash.add(entry.getKey());
}
}
if (clash!=null)
return clash;
- Holder.this.setInitParameters(initParameters);
+ Holder.this.getInitParameters().putAll(initParameters);
return Collections.emptySet();
- };
+ }
+
+
}
}
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 92fa5656f4..05cae4fcb3 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
@@ -24,19 +24,25 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import javax.servlet.DispatcherType;
import javax.servlet.Filter;
+import javax.servlet.FilterRegistration;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+import javax.servlet.ServletSecurityElement;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
+import javax.servlet.descriptor.JspConfigDescriptor;
import org.eclipse.jetty.security.ConstraintAware;
import org.eclipse.jetty.security.ConstraintSecurityHandler;
import org.eclipse.jetty.security.SecurityHandler;
import org.eclipse.jetty.server.Dispatcher;
-import org.eclipse.jetty.server.DispatcherType;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HandlerContainer;
import org.eclipse.jetty.server.handler.ContextHandler;
@@ -44,9 +50,7 @@ import org.eclipse.jetty.server.handler.ErrorHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.HandlerWrapper;
import org.eclipse.jetty.server.session.SessionHandler;
-import org.eclipse.jetty.servlet.api.FilterRegistration;
-import org.eclipse.jetty.servlet.api.ServletRegistration;
-import org.eclipse.jetty.util.Loader;
+import org.eclipse.jetty.util.LazyList;
/* ------------------------------------------------------------ */
@@ -73,8 +77,10 @@ public class ServletContextHandler extends ContextHandler
protected SecurityHandler _securityHandler;
protected ServletHandler _servletHandler;
protected int _options;
+ protected JspConfigDescriptor _jspConfig;
protected Object _restrictedContextListeners;
-
+ private boolean _restrictListeners = true;
+
/* ------------------------------------------------------------ */
public ServletContextHandler()
{
@@ -327,46 +333,85 @@ public class ServletContextHandler extends ContextHandler
{
return getServletHandler().addFilterWithMapping(filterClass,pathSpec,dispatches);
}
-
- /* ------------------------------------------------------------ */
- /** conveniance method to add a filter
+ /**
+ * notification that a ServletRegistration has been created so we can track the annotations
+ * @param holder new holder created through the api.
+ * @return the ServletRegistration.Dynamic
*/
- public void addFilter(FilterHolder holder,String pathSpec,int dispatches)
- {
- getServletHandler().addFilterWithMapping(holder,pathSpec,dispatches);
+ protected ServletRegistration.Dynamic dynamicHolderAdded(ServletHolder holder) {
+ return holder.getRegistration();
}
- /* ------------------------------------------------------------ */
- /** convenience method to add a filter
+ /**
+ * delegate for ServletContext.declareRole method
+ * @param roleNames role names to add
*/
- public FilterHolder addFilter(Class<? extends Filter> filterClass,String pathSpec,int dispatches)
- {
- return getServletHandler().addFilterWithMapping(filterClass,pathSpec,dispatches);
+ protected void addRoles(String... roleNames) {
+ //Get a reference to the SecurityHandler, which must be ConstraintAware
+ if (_securityHandler != null && _securityHandler instanceof ConstraintAware)
+ {
+ HashSet<String> union = new HashSet<String>();
+ Set<String> existing = ((ConstraintAware)_securityHandler).getRoles();
+ if (existing != null)
+ union.addAll(existing);
+ union.addAll(Arrays.asList(roleNames));
+ ((ConstraintSecurityHandler)_securityHandler).setRoles(union);
+ }
}
- /* ------------------------------------------------------------ */
- /** convenience method to add a filter
+ /**
+ * Delegate for ServletRegistration.Dynamic.setServletSecurity method
+ * @param registration ServletRegistration.Dynamic instance that setServletSecurity was called on
+ * @param servletSecurityElement new security info
+ * @return the set of exact URL mappings currently associated with the registration that are also present in the web.xml
+ * security constratins and thus will be unaffected by this call.
*/
- public FilterHolder addFilter(String filterClass,String pathSpec,int dispatches)
+ public Set<String> setServletSecurity(ServletRegistration.Dynamic registration, ServletSecurityElement servletSecurityElement)
{
- return getServletHandler().addFilterWithMapping(filterClass,pathSpec,dispatches);
+ return Collections.emptySet();
}
-
- public void callContextInitialized(ServletContextListener l, ServletContextEvent e)
- {
- l.contextInitialized(e);
+
+ public void restrictEventListener (EventListener e)
+ {
+ if (_restrictListeners && e instanceof ServletContextListener)
+ _restrictedContextListeners = LazyList.add(_restrictedContextListeners, e);
}
+ public boolean isRestrictListeners() {
+ return _restrictListeners;
+ }
- public void callContextDestroyed(ServletContextListener l, ServletContextEvent e)
+ public void setRestrictListeners(boolean restrictListeners) {
+ this._restrictListeners = restrictListeners;
+ }
+
+ public void callContextInitialized(ServletContextListener l, ServletContextEvent e)
{
- l.contextDestroyed(e);
+ try
+ {
+ //toggle state of the dynamic API so that the listener cannot use it
+ if (LazyList.contains(_restrictedContextListeners, l))
+ this.getServletContext().setEnabled(false);
+
+ super.callContextInitialized(l, e);
+ }
+ finally
+ {
+ //untoggle the state of the dynamic API
+ this.getServletContext().setEnabled(true);
+ }
}
+
+ public void callContextDestroyed(ServletContextListener l, ServletContextEvent e)
+ {
+ super.callContextDestroyed(l, e);
+ }
+
/* ------------------------------------------------------------ */
/**
@@ -466,13 +511,17 @@ public class ServletContextHandler extends ContextHandler
/**
* @since servlet-api-3.0
*/
+ @Override
public FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass)
{
if (isStarted())
throw new IllegalStateException();
+
+ if (!_enabled)
+ throw new UnsupportedOperationException();
final ServletHandler handler = ServletContextHandler.this.getServletHandler();
- final FilterHolder holder= handler.newFilterHolder();
+ final FilterHolder holder= handler.newFilterHolder(Holder.Source.JAVAX_API);
holder.setName(filterName);
holder.setHeldClass(filterClass);
handler.addFilter(holder);
@@ -483,13 +532,17 @@ public class ServletContextHandler extends ContextHandler
/**
* @since servlet-api-3.0
*/
+ @Override
public FilterRegistration.Dynamic addFilter(String filterName, String className)
{
if (isStarted())
throw new IllegalStateException();
+
+ if (!_enabled)
+ throw new UnsupportedOperationException();
final ServletHandler handler = ServletContextHandler.this.getServletHandler();
- final FilterHolder holder= handler.newFilterHolder();
+ final FilterHolder holder= handler.newFilterHolder(Holder.Source.JAVAX_API);
holder.setName(filterName);
holder.setClassName(className);
handler.addFilter(holder);
@@ -501,13 +554,17 @@ public class ServletContextHandler extends ContextHandler
/**
* @since servlet-api-3.0
*/
+ @Override
public FilterRegistration.Dynamic addFilter(String filterName, Filter filter)
{
if (isStarted())
throw new IllegalStateException();
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
final ServletHandler handler = ServletContextHandler.this.getServletHandler();
- final FilterHolder holder= handler.newFilterHolder();
+ final FilterHolder holder= handler.newFilterHolder(Holder.Source.JAVAX_API);
holder.setName(filterName);
holder.setFilter(filter);
handler.addFilter(holder);
@@ -518,64 +575,81 @@ public class ServletContextHandler extends ContextHandler
/**
* @since servlet-api-3.0
*/
+ @Override
public ServletRegistration.Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass)
{
if (!isStarting())
throw new IllegalStateException();
+
+ if (!_enabled)
+ throw new UnsupportedOperationException();
final ServletHandler handler = ServletContextHandler.this.getServletHandler();
- final ServletHolder holder= handler.newServletHolder();
+ final ServletHolder holder= handler.newServletHolder(Holder.Source.JAVAX_API);
holder.setName(servletName);
holder.setHeldClass(servletClass);
handler.addServlet(holder);
- return holder.getRegistration();
+ return dynamicHolderAdded(holder);
}
/* ------------------------------------------------------------ */
/**
* @since servlet-api-3.0
*/
+ @Override
public ServletRegistration.Dynamic addServlet(String servletName, String className)
{
if (!isStarting())
throw new IllegalStateException();
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
final ServletHandler handler = ServletContextHandler.this.getServletHandler();
- final ServletHolder holder= handler.newServletHolder();
+ final ServletHolder holder= handler.newServletHolder(Holder.Source.JAVAX_API);
holder.setName(servletName);
holder.setClassName(className);
handler.addServlet(holder);
- return holder.getRegistration();
+ return dynamicHolderAdded(holder);
}
/* ------------------------------------------------------------ */
/**
* @since servlet-api-3.0
*/
+ @Override
public ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
{
if (!isStarting())
throw new IllegalStateException();
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
final ServletHandler handler = ServletContextHandler.this.getServletHandler();
- final ServletHolder holder= handler.newServletHolder();
+ final ServletHolder holder= handler.newServletHolder(Holder.Source.JAVAX_API);
holder.setName(servletName);
holder.setServlet(servlet);
handler.addServlet(holder);
- return holder.getRegistration();
+ return dynamicHolderAdded(holder);
}
/* ------------------------------------------------------------ */
+ @Override
public boolean setInitParameter(String name, String value)
{
// TODO other started conditions
if (!isStarting())
throw new IllegalStateException();
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
return super.setInitParameter(name,value);
}
/* ------------------------------------------------------------ */
+ @Override
public <T extends Filter> T createFilter(Class<T> c) throws ServletException
{
try
@@ -599,6 +673,7 @@ public class ServletContextHandler extends ContextHandler
}
/* ------------------------------------------------------------ */
+ @Override
public <T extends Servlet> T createServlet(Class<T> c) throws ServletException
{
try
@@ -620,16 +695,39 @@ public class ServletContextHandler extends ContextHandler
throw new ServletException(e);
}
}
-
+
+ @Override
+ public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
+ {
+ if (_sessionHandler!=null)
+ return _sessionHandler.getSessionManager().getDefaultSessionTrackingModes();
+ return null;
+ }
+
+ @Override
+ public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
+ {
+ if (_sessionHandler!=null)
+ return _sessionHandler.getSessionManager().getEffectiveSessionTrackingModes();
+ return null;
+ }
+
+ @Override
public FilterRegistration getFilterRegistration(String filterName)
- {
+ {
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
final FilterHolder holder=ServletContextHandler.this.getServletHandler().getFilter(filterName);
return (holder==null)?null:holder.getRegistration();
}
-
+ @Override
public Map<String, ? extends FilterRegistration> getFilterRegistrations()
{
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
HashMap<String, FilterRegistration> registrations = new HashMap<String, FilterRegistration>();
ServletHandler handler=ServletContextHandler.this.getServletHandler();
FilterHolder[] holders=handler.getFilters();
@@ -641,16 +739,22 @@ public class ServletContextHandler extends ContextHandler
return registrations;
}
-
+ @Override
public ServletRegistration getServletRegistration(String servletName)
- {
+ {
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
final ServletHolder holder=ServletContextHandler.this.getServletHandler().getServlet(servletName);
return (holder==null)?null:holder.getRegistration();
}
-
+ @Override
public Map<String, ? extends ServletRegistration> getServletRegistrations()
- {
+ {
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
HashMap<String, ServletRegistration> registrations = new HashMap<String, ServletRegistration>();
ServletHandler handler=ServletContextHandler.this.getServletHandler();
ServletHolder[] holders=handler.getServlets();
@@ -662,67 +766,71 @@ public class ServletContextHandler extends ContextHandler
return registrations;
}
-
+ @Override
+ public SessionCookieConfig getSessionCookieConfig()
+ {
+ // TODO other started conditions
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
+ if (_sessionHandler!=null)
+ return _sessionHandler.getSessionManager().getSessionCookieConfig();
+ return null;
+ }
+
+ @Override
+ public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes)
+ {
+ // TODO other started conditions
+ if (!isStarting())
+ throw new IllegalStateException();
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+
+
+ if (_sessionHandler!=null)
+ _sessionHandler.getSessionManager().setSessionTrackingModes(sessionTrackingModes);
+ }
+
+ @Override
public void addListener(String className)
{
// TODO other started conditions
if (!isStarting())
throw new IllegalStateException();
- try
- {
- Class<? extends EventListener> clazz = getClassLoader()==null?Loader.loadClass(ContextHandler.class,className):getClassLoader().loadClass(className);
- addListener(clazz);
- }
- catch (ClassNotFoundException e)
- {
- throw new IllegalArgumentException(e);
- }
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+ super.addListener(className);
}
-
+ @Override
public <T extends EventListener> void addListener(T t)
{
+ // TODO other started conditions
if (!isStarting())
throw new IllegalStateException();
-
- ServletContextHandler.this.addEventListener(t);
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+ super.addListener(t);
}
-
+ @Override
public void addListener(Class<? extends EventListener> listenerClass)
{
+ // TODO other started conditions
if (!isStarting())
throw new IllegalStateException();
-
- try
- {
- EventListener l = createListener(listenerClass);
- ServletContextHandler.this.addEventListener(l);
- }
- catch (ServletException e)
- {
- throw new IllegalStateException(e);
- }
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+ super.addListener(listenerClass);
}
-
+ @Override
public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException
{
try
{
- T l = null;
- try
- {
- l = clazz.newInstance();
- }
- catch (InstantiationException e)
- {
- throw new ServletException(e);
- }
- catch (IllegalAccessException e)
- {
- throw new ServletException(e);
- }
+ T l = super.createListener(clazz);
for (int i=_decorators.size()-1; i>=0; i--)
{
@@ -741,26 +849,29 @@ public class ServletContextHandler extends ContextHandler
}
}
-
+
+ @Override
+ public JspConfigDescriptor getJspConfigDescriptor()
+ {
+ return _jspConfig;
+ }
+
+ @Override
public void declareRoles(String... roleNames)
{
if (!isStarting())
throw new IllegalStateException();
-
- //Get a reference to the SecurityHandler, which must be ConstraintAware
- if (_securityHandler != null && _securityHandler instanceof ConstraintAware)
- {
- HashSet<String> union = new HashSet<String>();
- Set<String> existing = ((ConstraintAware)_securityHandler).getRoles();
- if (existing != null)
- union.addAll(existing);
- union.addAll(Arrays.asList(roleNames));
- ((ConstraintSecurityHandler)_securityHandler).setRoles(union);
- }
+ if (!_enabled)
+ throw new UnsupportedOperationException();
+ addRoles(roleNames);
+
+
}
+
}
-
-
+
+
+
/* ------------------------------------------------------------ */
/** Interface to decorate loaded classes.
*/
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
index cdfe353cb7..6c9d90ea04 100644
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
+++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java
@@ -16,9 +16,11 @@ package org.eclipse.jetty.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Set;
import java.util.List;
import java.util.Map;
import java.util.Queue;
@@ -26,15 +28,17 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ConcurrentMap;
-import org.eclipse.jetty.server.DispatcherType;
+import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import javax.servlet.ServletSecurityElement;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -43,7 +47,7 @@ import org.eclipse.jetty.continuation.ContinuationThrowable;
import org.eclipse.jetty.http.HttpException;
import org.eclipse.jetty.http.PathMap;
import org.eclipse.jetty.io.EofException;
-import org.eclipse.jetty.io.RuntimeIOException;
+import org.eclipse.jetty.io.UncheckedIOException;
import org.eclipse.jetty.security.IdentityService;
import org.eclipse.jetty.security.SecurityHandler;
import org.eclipse.jetty.server.Dispatcher;
@@ -88,6 +92,7 @@ public class ServletHandler extends ScopedHandler
private int _maxFilterChainsCacheSize=512;
private boolean _startWithUnavailable=true;
private IdentityService _identityService;
+ private SecurityHandler _securityHandler;
private ServletHolder[] _servlets=new ServletHolder[0];
private ServletMapping[] _servletMappings;
@@ -146,9 +151,9 @@ public class ServletHandler extends ScopedHandler
if (_contextHandler!=null)
{
- SecurityHandler security_handler = (SecurityHandler)_contextHandler.getChildHandlerByClass(SecurityHandler.class);
- if (security_handler!=null)
- _identityService=security_handler.getIdentityService();
+ _securityHandler = (SecurityHandler)_contextHandler.getChildHandlerByClass(SecurityHandler.class);
+ if (_securityHandler!=null)
+ _identityService=_securityHandler.getIdentityService();
}
updateNameMappings();
@@ -396,6 +401,9 @@ public class ServletHandler extends ScopedHandler
{
old_scope=baseRequest.getUserIdentityScope();
baseRequest.setUserIdentityScope(servlet_holder);
+
+ //if this servlet supports multipart-mime, configure the request with it
+ baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, ((ServletHolder.Registration)servlet_holder.getRegistration()).getMultipartConfig());
// start manual inline of nextScope(target,baseRequest,request,response);
if (never())
@@ -482,7 +490,7 @@ public class ServletHandler extends ScopedHandler
{
throw e;
}
- catch(RuntimeIOException e)
+ catch(UncheckedIOException e)
{
throw e;
}
@@ -515,10 +523,10 @@ public class ServletHandler extends ScopedHandler
if (cause!=null)
th=cause;
}
- else if (th instanceof RuntimeIOException)
+ else if (th instanceof UncheckedIOException)
{
Log.debug(th);
- Throwable cause=(IOException)((RuntimeIOException)th).getCause();
+ Throwable cause=(IOException)((UncheckedIOException)th).getCause();
if (cause!=null)
th=cause;
}
@@ -526,8 +534,8 @@ public class ServletHandler extends ScopedHandler
// handle or log exception
if (th instanceof HttpException)
throw (HttpException)th;
- else if (th instanceof RuntimeIOException)
- throw (RuntimeIOException)th;
+ else if (th instanceof UncheckedIOException)
+ throw (UncheckedIOException)th;
else if (th instanceof EofException)
throw (EofException)th;
@@ -787,12 +795,13 @@ public class ServletHandler extends ScopedHandler
/**
* see also newServletHolder(Class)
*/
- public ServletHolder newServletHolder()
+ public ServletHolder newServletHolder(Holder.Source source)
{
- return new ServletHolder();
+ return new ServletHolder(source);
}
/* ------------------------------------------------------------ */
+ /** Convenience method to add a servlet Holder.
public ServletHolder newServletHolder(Class<? extends Servlet> servlet)
{
return new ServletHolder(servlet);
@@ -817,7 +826,7 @@ public class ServletHandler extends ScopedHandler
*/
public ServletHolder addServletWithMapping (Class<? extends Servlet> servlet,String pathSpec)
{
- ServletHolder holder = newServletHolder();
+ ServletHolder holder = newServletHolder(Holder.Source.EMBEDDED);
holder.setHeldClass(servlet);
setServlets((ServletHolder[])LazyList.addToArray(getServlets(), holder, ServletHolder.class));
addServletWithMapping(holder,pathSpec);
@@ -872,23 +881,23 @@ public class ServletHandler extends ScopedHandler
{
setServletMappings((ServletMapping[])LazyList.addToArray(getServletMappings(), mapping, ServletMapping.class));
}
-
- /* ------------------------------------------------------------ */
- public FilterHolder newFilterHolder(Class<? extends Filter> filter)
- {
- return new FilterHolder(filter);
+
+ public Set<String> setServletSecurity(ServletRegistration.Dynamic registration, ServletSecurityElement servletSecurityElement) {
+ if (_contextHandler != null) {
+ return _contextHandler.setServletSecurity(registration, servletSecurityElement);
+ }
+ return Collections.emptySet();
}
-
+
/* ------------------------------------------------------------ */
/**
* @see #newFilterHolder(Class)
*/
- public FilterHolder newFilterHolder()
+ public FilterHolder newFilterHolder(Holder.Source source)
{
- return new FilterHolder();
+ return new FilterHolder(source);
}
-
/* ------------------------------------------------------------ */
public FilterHolder getFilter(String name)
{
@@ -905,7 +914,7 @@ public class ServletHandler extends ScopedHandler
*/
public FilterHolder addFilterWithMapping (Class<? extends Filter> filter,String pathSpec,EnumSet<DispatcherType> dispatches)
{
- FilterHolder holder = newFilterHolder();
+ FilterHolder holder = newFilterHolder(Holder.Source.EMBEDDED);
holder.setHeldClass(filter);
addFilterWithMapping(holder,pathSpec,dispatches);
@@ -921,7 +930,7 @@ public class ServletHandler extends ScopedHandler
*/
public FilterHolder addFilterWithMapping (String className,String pathSpec,EnumSet<DispatcherType> dispatches)
{
- FilterHolder holder = newFilterHolder();
+ FilterHolder holder = newFilterHolder(Holder.Source.EMBEDDED);
holder.setName(className+"-"+_filters.length);
holder.setClassName(className);
@@ -964,7 +973,6 @@ public class ServletHandler extends ScopedHandler
}
-
/* ------------------------------------------------------------ */
/** Convenience method to add a filter.
* @param filter class of filter to create
@@ -974,7 +982,8 @@ public class ServletHandler extends ScopedHandler
*/
public FilterHolder addFilterWithMapping (Class<? extends Filter> filter,String pathSpec,int dispatches)
{
- FilterHolder holder = newFilterHolder(filter);
+ FilterHolder holder = newFilterHolder(Holder.Source.EMBEDDED);
+ holder.setHeldClass(filter);
addFilterWithMapping(holder,pathSpec,dispatches);
return holder;
@@ -1032,14 +1041,13 @@ public class ServletHandler extends ScopedHandler
}
-
/* ------------------------------------------------------------ */
/** Convenience method to add a filter with a mapping
* @param className
* @param pathSpec
* @param dispatches
* @return the filter holder created
- * @deprecated use {@link #addFilterWithMapping(Class, String, int)} instead
+ * @deprecated use {@link #addFilterWithMapping(Class, String, EnumSet<DispatcherType>)} instead
*/
public FilterHolder addFilter (String className,String pathSpec,EnumSet<DispatcherType> dispatches)
{
@@ -1287,7 +1295,6 @@ public class ServletHandler extends ScopedHandler
invalidateChainsCache();
}
-
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
private class CachedChain implements FilterChain
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 1efd9613bb..8a4ce26799 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
@@ -25,13 +25,14 @@ import java.util.Map;
import java.util.Set;
import java.util.Stack;
-
+import javax.servlet.MultipartConfigElement;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
-import org.eclipse.jetty.servlet.api.ServletRegistration;
+import javax.servlet.ServletRegistration;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import javax.servlet.ServletSecurityElement;
import javax.servlet.SingleThreadModel;
import javax.servlet.UnavailableException;
import org.eclipse.jetty.security.IdentityService;
@@ -76,14 +77,24 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
*/
public ServletHolder()
{
+ super (Source.EMBEDDED);
}
/* ---------------------------------------------------------------- */
+ /** Constructor .
+ */
+ public ServletHolder(Holder.Source creator)
+ {
+ super (creator);
+ }
+
+ /* ---------------------------------------------------------------- */
/** Constructor for existing servlet.
*/
public ServletHolder(Servlet servlet)
{
+ super (Source.EMBEDDED);
setServlet(servlet);
}
@@ -92,6 +103,7 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
*/
public ServletHolder(Class<? extends Servlet> servlet)
{
+ super (Source.EMBEDDED);
setHeldClass(servlet);
}
@@ -575,7 +587,9 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
/* -------------------------------------------------------- */
/* -------------------------------------------------------- */
public class Registration extends HolderRegistration implements ServletRegistration.Dynamic
- {
+ {
+ protected MultipartConfigElement _multipartConfig;
+
public Set<String> addMapping(String... urlPatterns)
{
illegalStateIfContextStarted();
@@ -605,22 +619,27 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
{
ServletMapping[] mappings =_servletHandler.getServletMappings();
List<String> patterns=new ArrayList<String>();
- for (ServletMapping mapping : mappings)
+ if (mappings!=null)
{
- if (!mapping.getServletName().equals(getName()))
- continue;
- String[] specs=mapping.getPathSpecs();
- if (specs!=null && specs.length>0)
- patterns.addAll(Arrays.asList(specs));
+ for (ServletMapping mapping : mappings)
+ {
+ if (!mapping.getServletName().equals(getName()))
+ continue;
+ String[] specs=mapping.getPathSpecs();
+ if (specs!=null && specs.length>0)
+ patterns.addAll(Arrays.asList(specs));
+ }
}
return patterns;
}
+ @Override
public String getRunAsRole()
{
return _runAsRole;
}
+ @Override
public void setLoadOnStartup(int loadOnStartup)
{
illegalStateIfContextStarted();
@@ -631,17 +650,35 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
{
return ServletHolder.this.getInitOrder();
}
-
+
+ @Override
+ public void setMultipartConfig(MultipartConfigElement element)
+ {
+ _multipartConfig = element;
+ }
+
+ public MultipartConfigElement getMultipartConfig()
+ {
+ return _multipartConfig;
+ }
+
+ @Override
public void setRunAsRole(String role)
{
_runAsRole = role;
}
+
+ @Override
+ public Set<String> setServletSecurity(ServletSecurityElement securityElement)
+ {
+ return _servletHandler.setServletSecurity(this, securityElement);
+ }
}
public ServletRegistration.Dynamic getRegistration()
{
if (_registration == null)
- _registration = new Registration();
+ _registration = new Registration();
return _registration;
}
@@ -758,8 +795,3 @@ public class ServletHolder extends Holder<Servlet> implements UserIdentity.Scope
}
}
}
-
-
-
-
-
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/FilterRegistration.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/FilterRegistration.java
deleted file mode 100644
index 6ff1b97afd..0000000000
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/FilterRegistration.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.jetty.servlet.api;
-
-import java.util.Collection;
-import java.util.EnumSet;
-
-import org.eclipse.jetty.server.DispatcherType;
-
-/**
- * FilterRegistration
- *
- * Mimics the javax.servlet.FilterRegistration class to ease
- * jetty-7/jetty-8 compatibility
- */
-public interface FilterRegistration
-{
- public void addMappingForServletNames(EnumSet<DispatcherType> dispatcherTypes, boolean isMatchAfter, String... servletNames);
-
- public Collection<String> getServletNameMappings();
-
- public void addMappingForUrlPatterns(EnumSet<DispatcherType> dispatcherTypes, boolean isMatchAfter, String... urlPatterns);
-
- public Collection<String> getUrlPatternMappings();
-
- interface Dynamic extends FilterRegistration, Registration.Dynamic
- {
- }
-}
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/Registration.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/Registration.java
deleted file mode 100644
index d83bd2ceb3..0000000000
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/Registration.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.jetty.servlet.api;
-
-import java.util.Map;
-import java.util.Set;
-
-public interface Registration
-{
-
- public String getName();
-
- public String getClassName();
-
- public boolean setInitParameter(String name, String value);
-
- public String getInitParameter(String name);
-
- public Set<String> setInitParameters(Map<String, String> initParameters);
-
- public Map<String, String> getInitParameters();
-
- interface Dynamic extends Registration
- {
- public void setAsyncSupported(boolean isAsyncSupported);
- }
-}
diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/ServletRegistration.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/ServletRegistration.java
deleted file mode 100644
index c6f231dff2..0000000000
--- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/api/ServletRegistration.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.jetty.servlet.api;
-
-import java.util.Collection;
-import java.util.Set;
-
-public interface ServletRegistration
-{
- public Set<String> addMapping(String... urlPatterns);
-
- public Collection<String> getMappings();
-
- public String getRunAsRole();
-
- interface Dynamic extends ServletRegistration, Registration.Dynamic
- {
- public void setLoadOnStartup(int loadOnStartup);
-
- public void setRunAsRole(String roleName);
- }
-
-}
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DefaultServletTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DefaultServletTest.java
index 4a07b03119..c048db1955 100644
--- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DefaultServletTest.java
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/DefaultServletTest.java
@@ -3,6 +3,9 @@ package org.eclipse.jetty.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.util.EnumSet;
+
+import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
@@ -542,7 +545,7 @@ public class DefaultServletTest
assertResponseContains("Content-Length: 12", response);
assertResponseNotContains("Extra Info", response);
- context.addFilter(OutputFilter.class, "/*", 0);
+ context.addFilter(OutputFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
response = connector.getResponses("GET /context/data0.txt HTTP/1.1\r\nHost:localhost:8080\r\n\r\n");
assertResponseContains("Content-Length: 2", response); // 20 something long
assertResponseContains("Extra Info", response);
@@ -551,7 +554,7 @@ public class DefaultServletTest
context.getServletHandler().setFilterMappings(new FilterMapping[]{});
context.getServletHandler().setFilters(new FilterHolder[]{});
- context.addFilter(WriterFilter.class, "/*", 0);
+ context.addFilter(WriterFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
response = connector.getResponses("GET /context/data0.txt HTTP/1.1\r\nHost:localhost:8080\r\n\r\n");
assertResponseContains("Content-Length: 2", response); // 20 something long
assertResponseContains("Extra Info", response);
diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/HolderTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/HolderTest.java
new file mode 100644
index 0000000000..9bcdfe3862
--- /dev/null
+++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/HolderTest.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.eclipse.jetty.servlet;
+
+import java.util.Collections;
+import java.util.Set;
+
+import javax.servlet.Registration;
+import javax.servlet.ServletRegistration;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class HolderTest {
+
+ @Test
+ public void testInitParams() throws Exception {
+ ServletHolder holder = new ServletHolder(Holder.Source.JAVAX_API);
+ ServletRegistration reg = holder.getRegistration();
+ try {
+ reg.setInitParameter(null, "foo");
+ fail("null name accepted");
+ } catch (IllegalArgumentException e) {
+ }
+ try {
+ reg.setInitParameter("foo", null);
+ fail("null value accepted");
+ } catch (IllegalArgumentException e) {
+ }
+ reg.setInitParameter("foo", "bar");
+ assertFalse(reg.setInitParameter("foo", "foo"));
+
+ Set<String> clash = reg.setInitParameters(Collections.singletonMap("foo", "bax"));
+ assertTrue("should be one clash", clash != null && clash.size() == 1);
+
+ try {
+ reg.setInitParameters(Collections.singletonMap((String)null, "bax"));
+ fail("null name in map accepted");
+ } catch (IllegalArgumentException e) {
+ }
+ try {
+ reg.setInitParameters(Collections.singletonMap("foo", (String)null));
+ fail("null value in map accepted");
+ } catch (IllegalArgumentException e) {
+ }
+
+ Set<String> clash2 = reg.setInitParameters(Collections.singletonMap("FOO", "bax"));
+ assertTrue("should be no clash", clash2.isEmpty());
+ assertEquals("setInitParameters should not replace existing non-clashing init parameters", 2, reg.getInitParameters().size());
+
+ }
+}
diff --git a/jetty-servlets/pom.xml b/jetty-servlets/pom.xml
index 210d15d961..01cd507e57 100644
--- a/jetty-servlets/pom.xml
+++ b/jetty-servlets/pom.xml
@@ -3,7 +3,7 @@
<parent>
<artifactId>jetty-project</artifactId>
<groupId>org.eclipse.jetty</groupId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-servlets</artifactId>
@@ -74,11 +74,11 @@
<artifactId>jetty-util</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <scope>provided</scope>
- </dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <scope>provided</scope>
+ </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>test-jetty-servlet</artifactId>
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java
index 4de528937c..b879cb814e 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/DoSFilter.java
@@ -331,17 +331,18 @@ public class DoSFilter implements Filter
// Reject this request
if (_insertHeaders)
((HttpServletResponse)response).addHeader("DoSFilter","unavailable");
+
((HttpServletResponse)response).sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
return;
}
case 0:
{
- // fall through to throttle code
+ // fall through to throttle code
request.setAttribute(__TRACKER,tracker);
break;
}
default:
- {
+ {
// insert a delay before throttling the request
if (_insertHeaders)
((HttpServletResponse)response).addHeader("DoSFilter","delayed");
@@ -349,12 +350,22 @@ public class DoSFilter implements Filter
request.setAttribute(__TRACKER,tracker);
if (_delayMs > 0)
continuation.setTimeout(_delayMs);
+ continuation.addContinuationListener(new ContinuationListener()
+ {
+
+ public void onComplete(Continuation continuation)
+ {
+ }
+
+ public void onTimeout(Continuation continuation)
+ {
+ }
+ });
continuation.suspend();
return;
}
}
}
-
// Throttle the request
boolean accepted = false;
try
@@ -408,6 +419,10 @@ public class DoSFilter implements Filter
_context.log("DoS",e);
((HttpServletResponse)response).sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
}
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
finally
{
if (accepted)
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java
index 4111a1de6f..8f8dd97ec3 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java
@@ -14,17 +14,15 @@ package org.eclipse.jetty.servlets;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
-import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
@@ -34,16 +32,20 @@ import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
+import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.Part;
-import org.eclipse.jetty.util.B64Code;
+
+import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.LazyList;
import org.eclipse.jetty.util.MultiMap;
+import org.eclipse.jetty.util.MultiPartInputStream;
import org.eclipse.jetty.util.QuotedStringTokenizer;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.TypeUtil;
@@ -60,6 +62,10 @@ import org.eclipse.jetty.util.TypeUtil;
* If the init parameter "delete" is set to "true", any files created will be deleted when the
* current request returns.
*
+ * Use init parameter "maxFileSize" to set the max size file that can be uploaded.
+ *
+ * Use init parameter "maxRequestSize" to limit the size of the multipart request.
+ *
*/
public class MultiPartFilter implements Filter
{
@@ -68,6 +74,8 @@ public class MultiPartFilter implements Filter
private boolean _deleteFiles;
private ServletContext _context;
private int _fileOutputBuffer = 0;
+ private long _maxFileSize = -1L;
+ private long _maxRequestSize = -1L;
/* ------------------------------------------------------------------------------- */
/**
@@ -80,6 +88,13 @@ public class MultiPartFilter implements Filter
String fileOutputBuffer = filterConfig.getInitParameter("fileOutputBuffer");
if(fileOutputBuffer!=null)
_fileOutputBuffer = Integer.parseInt(fileOutputBuffer);
+ String maxFileSize = filterConfig.getInitParameter("maxFileSize");
+ if (maxFileSize != null)
+ _maxFileSize = Long.parseLong(maxFileSize.trim());
+ String maxRequestSize = filterConfig.getInitParameter("maxRequestSize");
+ if (maxRequestSize != null)
+ _maxRequestSize = Long.parseLong(maxRequestSize.trim());
+
_context=filterConfig.getServletContext();
}
@@ -101,15 +116,11 @@ public class MultiPartFilter implements Filter
InputStream in = new BufferedInputStream(request.getInputStream());
String content_type=srequest.getContentType();
- // TODO - handle encodings
- String boundary="--"+QuotedStringTokenizer.unquote(value(content_type.substring(content_type.indexOf("boundary="))).trim());
-
- byte[] byteBoundary=(boundary+"--").getBytes(StringUtil.__ISO_8859_1);
-
- MultiMap params = new MultiMap();
- for (Iterator i = request.getParameterMap().entrySet().iterator();i.hasNext();)
+ //Get current parameters so we can merge into them
+ MultiMap<String> params = new MultiMap<String>();
+ for (Iterator<Map.Entry<String,String[]>> i = request.getParameterMap().entrySet().iterator();i.hasNext();)
{
- Map.Entry entry=(Map.Entry)i.next();
+ Map.Entry<String,String[]> entry=i.next();
Object value=entry.getValue();
if (value instanceof String[])
params.addValues(entry.getKey(),(String[])value);
@@ -117,222 +128,45 @@ public class MultiPartFilter implements Filter
params.add(entry.getKey(),value);
}
+ MultipartConfigElement config = new MultipartConfigElement(tempdir.getCanonicalPath(), _maxFileSize, _maxRequestSize, _fileOutputBuffer);
+ MultiPartInputStream mpis = new MultiPartInputStream(in, content_type, config, tempdir);
+
+
try
{
- // Get first boundary
- byte[] bytes=TypeUtil.readLine(in);
- String line=bytes==null?null:new String(bytes,"UTF-8");
- if(line==null || !line.equals(boundary))
+ Collection<Part> parts = mpis.getParts();
+ if (parts != null)
{
- throw new IOException("Missing initial multi part boundary");
- }
-
- // Read each part
- boolean lastPart=false;
- String content_disposition=null;
- String content_transfer_encoding=null;
-
- outer:while(!lastPart)
- {
- while(true)
- {
- // read a line
- bytes=TypeUtil.readLine(in);
- if (bytes==null)
- break outer;
-
- // If blank line, end of part headers
- if(bytes.length==0)
- break;
- line=new String(bytes,"UTF-8");
-
- // place part header key and value in map
- int c=line.indexOf(':',0);
- if(c>0)
- {
- String key=line.substring(0,c).trim().toLowerCase();
- String value=line.substring(c+1,line.length()).trim();
- if(key.equals("content-disposition"))
- content_disposition=value;
- else if(key.equals("content-transfer-encoding"))
- content_transfer_encoding=value;
- }
- }
- // Extract content-disposition
- boolean form_data=false;
- if(content_disposition==null)
+ for (Part p:parts)
{
- throw new IOException("Missing content-disposition");
- }
-
- QuotedStringTokenizer tok=new QuotedStringTokenizer(content_disposition,";");
- String name=null;
- String filename=null;
- while(tok.hasMoreTokens())
- {
- String t=tok.nextToken().trim();
- String tl=t.toLowerCase();
- if(t.startsWith("form-data"))
- form_data=true;
- else if(tl.startsWith("name="))
- name=value(t);
- else if(tl.startsWith("filename="))
- filename=value(t);
- }
-
- // Check disposition
- if(!form_data)
- {
- continue;
- }
- //It is valid for reset and submit buttons to have an empty name.
- //If no name is supplied, the browser skips sending the info for that field.
- //However, if you supply the empty string as the name, the browser sends the
- //field, with name as the empty string. So, only continue this loop if we
- //have not yet seen a name field.
- if(name==null)
- {
- continue;
- }
-
- OutputStream out=null;
- File file=null;
- try
- {
- if (filename!=null && filename.length()>0)
+ MultiPartInputStream.MultiPart mp = (MultiPartInputStream.MultiPart)p;
+ if (mp.getFile() != null)
{
- file = File.createTempFile("MultiPart", "", tempdir);
- out = new FileOutputStream(file);
- if(_fileOutputBuffer>0)
- out = new BufferedOutputStream(out, _fileOutputBuffer);
- request.setAttribute(name,file);
- params.add(name, filename);
-
+ request.setAttribute(mp.getName(),mp.getFile());
+ if (mp.getContentDispositionFilename() != null)
+ params.add(mp.getName(), mp.getContentDispositionFilename());
if (_deleteFiles)
{
- file.deleteOnExit();
+ mp.getFile().deleteOnExit();
+
ArrayList files = (ArrayList)request.getAttribute(FILES);
if (files==null)
{
files=new ArrayList();
request.setAttribute(FILES,files);
}
- files.add(file);
- }
+ files.add(mp.getFile());
+ }
}
else
{
- out=new ByteArrayOutputStream();
- }
-
-
- if ("base64".equalsIgnoreCase(content_transfer_encoding))
- {
- in = new Base64InputStream(in);
- }
- else if ("quoted-printable".equalsIgnoreCase(content_transfer_encoding))
- {
- in = new FilterInputStream(in)
- {
- @Override
- public int read() throws IOException
- {
- int c = in.read();
- if (c >= 0 && c == '=')
- {
- int hi = in.read();
- int lo = in.read();
- if (hi < 0 || lo < 0)
- {
- throw new IOException("Unexpected end to quoted-printable byte");
- }
- char[] chars = new char[] { (char)hi, (char)lo };
- c = Integer.parseInt(new String(chars),16);
- }
- return c;
- }
- };
- }
-
- int state=-2;
- int c;
- boolean cr=false;
- boolean lf=false;
-
- // loop for all lines`
- while(true)
- {
- int b=0;
- while((c=(state!=-2)?state:in.read())!=-1)
- {
- state=-2;
- // look for CR and/or LF
- if(c==13||c==10)
- {
- if(c==13)
- state=in.read();
- break;
- }
- // look for boundary
- if(b>=0&&b<byteBoundary.length&&c==byteBoundary[b])
- b++;
- else
- {
- // this is not a boundary
- if(cr)
- out.write(13);
- if(lf)
- out.write(10);
- cr=lf=false;
- if(b>0)
- out.write(byteBoundary,0,b);
- b=-1;
- out.write(c);
- }
- }
- // check partial boundary
- if((b>0&&b<byteBoundary.length-2)||(b==byteBoundary.length-1))
- {
- if(cr)
- out.write(13);
- if(lf)
- out.write(10);
- cr=lf=false;
- out.write(byteBoundary,0,b);
- b=-1;
- }
- // boundary match
- if(b>0||c==-1)
- {
- if(b==byteBoundary.length)
- lastPart=true;
- if(state==10)
- state=-2;
- break;
- }
- // handle CR LF
- if(cr)
- out.write(13);
- if(lf)
- out.write(10);
- cr=(c==13);
- lf=(c==10||state==10);
- if(state==10)
- state=-2;
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ IO.copy(p.getInputStream(), bytes);
+ params.add(p.getName(), bytes.toByteArray());
}
}
- finally
- {
- out.close();
- }
-
- if (file==null)
- {
- bytes = ((ByteArrayOutputStream)out).toByteArray();
- params.add(name,bytes);
- }
}
-
+
// handle request
chain.doFilter(new Wrapper(srequest,params),response);
}
@@ -494,37 +328,4 @@ public class MultiPartFilter implements Filter
_encoding=enc;
}
}
-
- private static class Base64InputStream extends InputStream
- {
- BufferedReader _in;
- String _line;
- byte[] _buffer;
- int _pos;
-
- public Base64InputStream (InputStream in)
- {
- _in = new BufferedReader(new InputStreamReader(in));
- }
-
- @Override
- public int read() throws IOException
- {
- if (_buffer==null || _pos>= _buffer.length)
- {
- _line = _in.readLine();
- if (_line==null)
- return -1;
- if (_line.startsWith("--"))
- _buffer=(_line+"\r\n").getBytes();
- else if (_line.length()==0)
- _buffer="\r\n".getBytes();
- else
- _buffer=B64Code.decode(_line);
-
- _pos=0;
- }
- return _buffer[_pos++];
- }
- }
}
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/ProxyServlet.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/ProxyServlet.java
index 3a96304dd9..cb5e043a47 100644
--- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/ProxyServlet.java
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/ProxyServlet.java
@@ -580,7 +580,7 @@ public class ProxyServlet implements Servlet
* </ul>
* For example, if a request was received at /foo/bar and the ProxyTo was http://host:80/context
* and the Prefix was /foo, then the request would be proxied to http://host:80/context/bar
- *
+ *
*/
public static class Transparent extends ProxyServlet
{
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AbstractDoSFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AbstractDoSFilterTest.java
index c2def31697..34651edb09 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AbstractDoSFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AbstractDoSFilterTest.java
@@ -2,6 +2,9 @@ package org.eclipse.jetty.servlets;
import java.io.IOException;
import java.net.Socket;
+import java.util.EnumSet;
+
+import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
@@ -43,7 +46,7 @@ public abstract class AbstractDoSFilterTest
_tester.setContextPath("/ctx");
_tester.addServlet(TestServlet.class, "/*");
- _dosFilter = _tester.addFilter(filter, "/dos/*", 0);
+ _dosFilter = _tester.addFilter(filter, "/dos/*", EnumSet.allOf(DispatcherType.class));
_dosFilter.setInitParameter("maxRequestsPerSec", "4");
_dosFilter.setInitParameter("delayMs", "200");
_dosFilter.setInitParameter("throttledRequests", "1");
@@ -52,7 +55,7 @@ public abstract class AbstractDoSFilterTest
_dosFilter.setInitParameter("remotePort", "false");
_dosFilter.setInitParameter("insertHeaders", "true");
- _timeoutFilter = _tester.addFilter(filter, "/timeout/*", 0);
+ _timeoutFilter = _tester.addFilter(filter, "/timeout/*", EnumSet.allOf(DispatcherType.class));
_timeoutFilter.setInitParameter("maxRequestsPerSec", "4");
_timeoutFilter.setInitParameter("delayMs", "200");
_timeoutFilter.setInitParameter("throttledRequests", "1");
@@ -174,7 +177,7 @@ public abstract class AbstractDoSFilterTest
{
// Cause a delay, then sleep while holding pass
String request="GET /ctx/dos/sleeper HTTP/1.1\r\nHost: localhost\r\n\r\n";
- String last="GET /ctx/dos/sleeper?sleep=2000 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
+ String last="GET /ctx/dos/sleeper?sleep=3000 HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
String responses = doRequests(request+request+request+request,1,0,0,last);
}
catch(Exception e)
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AsyncProxyServer.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AsyncProxyServer.java
index f6c68ed039..6b261740d1 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AsyncProxyServer.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/AsyncProxyServer.java
@@ -13,6 +13,10 @@
package org.eclipse.jetty.servlets;
+import java.util.EnumSet;
+
+import javax.servlet.DispatcherType;
+
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
@@ -33,7 +37,7 @@ public class AsyncProxyServer
ServletHandler handler=new ServletHandler();
server.setHandler(handler);
- FilterHolder gzip = handler.addFilterWithMapping("org.eclipse.jetty.servlet.GzipFilter","/*",0);
+ FilterHolder gzip = handler.addFilterWithMapping("org.eclipse.jetty.servlet.GzipFilter","/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
gzip.setAsyncSupported(true);
gzip.setInitParameter("minGzipSize","256");
ServletHolder proxy = handler.addServletWithMapping("org.eclipse.proxy.AsyncProxyServlet","/");
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/CloseableDoSFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/CloseableDoSFilterTest.java
index 99cd5f419f..95defdd12a 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/CloseableDoSFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/CloseableDoSFilterTest.java
@@ -13,6 +13,7 @@
package org.eclipse.jetty.servlets;
+
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DoSFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DoSFilterTest.java
index bbf169f583..d7a2b31bd0 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DoSFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/DoSFilterTest.java
@@ -32,7 +32,8 @@ public class DoSFilterTest extends AbstractDoSFilterTest
{
public void closeConnection(HttpServletRequest request, HttpServletResponse response, Thread thread)
{
- try {
+ try
+ {
response.getWriter().append("DoSFilter: timeout");
super.closeConnection(request,response,thread);
}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java
index 2dc3048024..19774c160c 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java
@@ -19,7 +19,13 @@ import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.net.URL;
+import java.util.EnumSet;
+import java.util.Enumeration;
+import javax.servlet.DispatcherType;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -52,7 +58,8 @@ public class MultipartFilterTest
tester.setContextPath("/context");
tester.setResourceBase(_dir.getCanonicalPath());
tester.addServlet(DumpServlet.class, "/");
- FilterHolder multipartFilter = tester.addFilter(MultiPartFilter.class,"/*",FilterMapping.DEFAULT);
+ tester.setAttribute("javax.servlet.context.tempdir", _dir);
+ FilterHolder multipartFilter = tester.addFilter(MultiPartFilter.class,"/*", EnumSet.of(DispatcherType.REQUEST));
multipartFilter.setInitParameter("deleteFiles", "true");
tester.start();
}
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java
index 2b158eb6e8..11d7a5cc2d 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java
@@ -18,6 +18,8 @@ import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.URL;
+import java.util.EnumSet;
+import javax.servlet.DispatcherType;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@@ -52,7 +54,7 @@ public class PutFilterTest
tester.setContextPath("/context");
tester.setResourceBase(_dir.getCanonicalPath());
tester.addServlet(org.eclipse.jetty.servlet.DefaultServlet.class, "/");
- FilterHolder holder = tester.addFilter(PutFilter.class,"/*",0);
+ FilterHolder holder = tester.addFilter(PutFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
holder.setInitParameter("delAllowed","true");
// Bloody Windows does not allow file renaming
if (!System.getProperty("os.name").toLowerCase().contains("windows"))
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/QoSFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/QoSFilterTest.java
index 8c871aa199..acf14cfb58 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/QoSFilterTest.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/QoSFilterTest.java
@@ -14,8 +14,10 @@ package org.eclipse.jetty.servlets;
import java.io.IOException;
import java.net.URL;
+import java.util.EnumSet;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import javax.servlet.DispatcherType;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
@@ -89,7 +91,7 @@ public class QoSFilterTest
FilterHolder holder = new FilterHolder(QoSFilter2.class);
holder.setAsyncSupported(true);
holder.setInitParameter(QoSFilter.MAX_REQUESTS_INIT_PARAM, ""+MAX_QOS);
- _tester.getContext().getServletHandler().addFilterWithMapping(holder,"/*",FilterMapping.DEFAULT);
+ _tester.getContext().getServletHandler().addFilterWithMapping(holder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
for(int i = 0; i < NUM_CONNECTIONS; ++i )
{
@@ -107,8 +109,7 @@ public class QoSFilterTest
FilterHolder holder = new FilterHolder(QoSFilter2.class);
holder.setAsyncSupported(true);
holder.setInitParameter(QoSFilter.MAX_REQUESTS_INIT_PARAM, ""+MAX_QOS);
- _tester.getContext().getServletHandler().addFilterWithMapping(holder,"/*",FilterMapping.DEFAULT);
-
+ _tester.getContext().getServletHandler().addFilterWithMapping(holder,"/*",EnumSet.of(DispatcherType.REQUEST,DispatcherType.ASYNC));
for(int i = 0; i < NUM_CONNECTIONS; ++i )
{
new Thread(new Worker2(i)).start();
diff --git a/jetty-start/pom.xml b/jetty-start/pom.xml
index c9c8453f93..e227bee434 100644
--- a/jetty-start/pom.xml
+++ b/jetty-start/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-start</artifactId>
diff --git a/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config b/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config
index c75ffd022c..ca2d0ae5ea 100644
--- a/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config
+++ b/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config
@@ -92,7 +92,7 @@ $(jetty.home)/lib/jetty-io-$(version).jar
$(jetty.home)/lib/jetty-xml-$(version).jar ! available org.eclipse.jetty.xml.XmlParser
[Server,All,server,default]
-$(jetty.home)/lib/servlet-api-2.5.jar ! available javax.servlet.ServletContext
+$(jetty.home)/lib/servlet-api-3.0.jar ! available javax.servlet.ServletContext
$(jetty.home)/lib/jetty-http-$(version).jar ! available org.eclipse.jetty.http.HttpParser
$(jetty.home)/lib/jetty-continuation-$(version).jar ! available org.eclipse.jetty.continuation.Continuation
$(jetty.home)/lib/jetty-server-$(version).jar ! available org.eclipse.jetty.server.Server
@@ -101,7 +101,7 @@ $(jetty.home)/lib/jetty-server-$(version).jar
$(jetty.home)/lib/jetty-security-$(version).jar ! available org.eclipse.jetty.security.LoginService
[Server,All,servlet,default]
-$(jetty.home)/lib/servlet-api-2.5.jar ! available javax.servlet.ServletContext
+$(jetty.home)/lib/servlet-api-3.0.jar ! available javax.servlet.ServletContext
$(jetty.home)/lib/jetty-servlet-$(version).jar ! available org.eclipse.jetty.servlet.ServletHandler
[Server,All,webapp,default]
@@ -141,6 +141,9 @@ $(jetty.home)/lib/jetty-policy-$(version).jar
[All,Client,client]
$(jetty.home)/lib/jetty-http-$(version).jar ! available org.eclipse.jetty.http.HttpParser
$(jetty.home)/lib/jetty-client-$(version).jar ! available org.eclipse.jetty.client.HttpClient
+
+[All,websocket]
+$(jetty.home)/lib/jetty-websocket-$(version).jar ! available org.eclipse.jetty.websocket.WebSocket
[Client]
$(jetty.home)/lib/jetty-http-$(version).jar ! available org.eclipse.jetty.http.HttpParser
diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml
index 3a2c364d2e..0a48227649 100644
--- a/jetty-util/pom.xml
+++ b/jetty-util/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-util</artifactId>
@@ -75,6 +75,16 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java
index f03f4c0bfe..aaf43e81e6 100644
--- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiMap.java
@@ -82,7 +82,7 @@ public class MultiMap<K> implements ConcurrentMap<K,Object>, Serializable
* @param name The entry key.
* @return Unmodifieable List of values.
*/
- public List<Object> getValues(Object name)
+ public List getValues(Object name)
{
return LazyList.getList(_map.get(name),true);
}
diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStream.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStream.java
new file mode 100644
index 0000000000..a8b87de377
--- /dev/null
+++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStream.java
@@ -0,0 +1,628 @@
+// ========================================================================
+// Copyright (c) 2006-2010 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 java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.servlet.MultipartConfigElement;
+import javax.servlet.ServletException;
+import javax.servlet.http.Part;
+
+
+
+/**
+ * MultiPartInputStream
+ *
+ * Handle a MultiPart Mime input stream, breaking it up on the boundary into files and strings.
+ */
+public class MultiPartInputStream
+{
+ public static final MultipartConfigElement __DEFAULT_MULTIPART_CONFIG = new MultipartConfigElement(System.getProperty("java.io.tmpdir"));
+ protected InputStream _in;
+ protected MultipartConfigElement _config;
+ protected String _contentType;
+ protected MultiMap<String> _parts;
+ protected File _tmpDir;
+ protected File _contextTmpDir;
+
+
+
+
+ public class MultiPart implements Part
+ {
+ protected String _name;
+ protected String _filename;
+ protected File _file;
+ protected OutputStream _out;
+ protected String _contentType;
+ protected MultiMap<String> _headers;
+ protected long _size = 0;
+
+ public MultiPart (String name, String filename)
+ throws IOException
+ {
+ _name = name;
+ _filename = filename;
+ }
+
+ protected void setContentType (String contentType)
+ {
+ _contentType = contentType;
+ }
+
+
+ protected void open()
+ throws FileNotFoundException, IOException
+ {
+ //We will either be writing to a file, if it has a filename on the content-disposition
+ //and otherwise a byte-array-input-stream, OR if we exceed the getFileSizeThreshold, we
+ //will need to change to write to a file.
+ if (_filename != null && _filename.trim().length() > 0)
+ {
+ createFile();
+ }
+ else
+ {
+ //Write to a buffer in memory until we discover we've exceed the
+ //MultipartConfig fileSizeThreshold
+ _out = new ByteArrayOutputStream();
+ }
+ }
+
+ protected void close()
+ throws IOException
+ {
+ _out.close();
+ }
+
+
+ protected void write (int b)
+ throws IOException, ServletException
+ {
+ if (MultiPartInputStream.this._config.getMaxFileSize() > 0 && _size + 1 > MultiPartInputStream.this._config.getMaxFileSize())
+ throw new ServletException ("Multipart Mime part "+_name+" exceeds max filesize");
+
+ if (MultiPartInputStream.this._config.getFileSizeThreshold() > 0 && _size + 1 > MultiPartInputStream.this._config.getFileSizeThreshold() && _file==null)
+ createFile();
+ _out.write(b);
+ _size ++;
+ }
+
+ protected void write (byte[] bytes, int offset, int length)
+ throws IOException, ServletException
+ {
+ if (MultiPartInputStream.this._config.getMaxFileSize() > 0 && _size + length > MultiPartInputStream.this._config.getMaxFileSize())
+ throw new ServletException ("Multipart Mime part "+_name+" exceeds max filesize");
+
+ if (MultiPartInputStream.this._config.getFileSizeThreshold() > 0 && _size + length > MultiPartInputStream.this._config.getFileSizeThreshold() && _file==null)
+ createFile();
+
+ _out.write(bytes, offset, length);
+ _size += length;
+ }
+
+ protected void createFile ()
+ throws IOException
+ {
+ _file = File.createTempFile("MultiPart", "", MultiPartInputStream.this._tmpDir);
+ FileOutputStream fos = new FileOutputStream(_file);
+ BufferedOutputStream bos = new BufferedOutputStream(fos);
+
+ if (_size > 0 && _out != null)
+ {
+ //already written some bytes, so need to copy them into the file
+ _out.flush();
+ ((ByteArrayOutputStream)_out).writeTo(bos);
+ _out.close();
+ }
+ _out = bos;
+ }
+
+
+
+ protected void setHeaders(MultiMap<String> headers)
+ {
+ _headers = headers;
+ }
+
+ /**
+ * @see javax.servlet.http.Part#getContentType()
+ */
+ public String getContentType()
+ {
+ return _contentType;
+ }
+
+ /**
+ * @see javax.servlet.http.Part#getHeader(java.lang.String)
+ */
+ public String getHeader(String name)
+ {
+ return (String)_headers.getValue(name, 0);
+ }
+
+ /**
+ * @see javax.servlet.http.Part#getHeaderNames()
+ */
+ public Collection<String> getHeaderNames()
+ {
+ return _headers.keySet();
+ }
+
+ /**
+ * @see javax.servlet.http.Part#getHeaders(java.lang.String)
+ */
+ public Collection<String> getHeaders(String name)
+ {
+ return _headers.getValues(name);
+ }
+
+ /**
+ * @see javax.servlet.http.Part#getInputStream()
+ */
+ public InputStream getInputStream() throws IOException
+ {
+ if (_file != null)
+ {
+ return new BufferedInputStream (new FileInputStream(_file));
+ }
+ else
+ {
+ //part content is in a ByteArrayOutputStream
+ return new ByteArrayInputStream(((ByteArrayOutputStream)_out).toByteArray());
+ }
+ }
+
+ /**
+ * @see javax.servlet.http.Part#getName()
+ */
+ public String getName()
+ {
+ return _name;
+ }
+
+ /**
+ * @see javax.servlet.http.Part#getSize()
+ */
+ public long getSize()
+ {
+ return _size;
+ }
+
+ /**
+ * @see javax.servlet.http.Part#write(java.lang.String)
+ */
+ public void write(String fileName) throws IOException
+ {
+ if (_file == null)
+ {
+ //part data is only in the ByteArrayOutputStream and never been written to disk
+ _file = new File (_tmpDir, fileName);
+ BufferedOutputStream bos = null;
+ try
+ {
+ bos = new BufferedOutputStream(new FileOutputStream(_file));
+ ((ByteArrayOutputStream)_out).writeTo(bos);
+ bos.flush();
+ }
+ finally
+ {
+ if (bos != null)
+ bos.close();
+ }
+ }
+ else
+ {
+ //the part data is already written to a temporary file, just rename it
+ _file.renameTo(new File(_tmpDir, fileName));
+ }
+ }
+
+ /**
+ * @see javax.servlet.http.Part#delete()
+ */
+ public void delete() throws IOException
+ {
+ if (_file != null)
+ _file.delete();
+ }
+
+
+ /**
+ * Get the file, if any, the data has been written to.
+ * @return
+ */
+ public File getFile ()
+ {
+ return _file;
+ }
+
+
+ /**
+ * Get the filename from the content-disposition.
+ * @return null or the filename
+ */
+ public String getContentDispositionFilename ()
+ {
+ return _filename;
+ }
+ }
+
+
+
+
+ /**
+ * @param in Request input stream
+ * @param contentType Content-Type header
+ * @param config MultipartConfigElement
+ * @param contextTmpDir javax.servlet.context.tempdir
+ */
+ public MultiPartInputStream (InputStream in, String contentType, MultipartConfigElement config, File contextTmpDir)
+ {
+ _in = new BufferedInputStream(in);
+ _contentType = contentType;
+ _config = config;
+ _contextTmpDir = contextTmpDir;
+ if (_contextTmpDir == null)
+ _contextTmpDir = new File (System.getProperty("java.io.tmpdir"));
+ if (_config == null)
+ _config = new MultipartConfigElement(_contextTmpDir.getAbsolutePath());
+ }
+
+
+
+ public Collection<Part> getParts()
+ throws IOException, ServletException
+ {
+ parse();
+ Collection<Object> values = _parts.values();
+ List<Part> parts = new ArrayList<Part>();
+ for (Object o: values)
+ {
+ List<Part> asList = LazyList.getList(o, false);
+ parts.addAll(asList);
+ }
+ return parts;
+ }
+
+
+ public Part getPart(String name)
+ throws IOException, ServletException
+ {
+ parse();
+ return (Part)_parts.getValue(name, 0);
+ }
+
+
+ protected void parse ()
+ throws IOException, ServletException
+ {
+ //have we already parsed the input?
+ if (_parts != null)
+ return;
+
+ //initialize
+ long total = 0; //keep running total of size of bytes read from input and throw an exception if exceeds MultipartConfigElement._maxRequestSize
+ _parts = new MultiMap<String>();
+
+ //if its not a multipart request, don't parse it
+ if (_contentType == null || !_contentType.startsWith("multipart/form-data"))
+ return;
+
+ //sort out the location to which to write the files
+
+ if (_config.getLocation() == null)
+ _tmpDir = _contextTmpDir;
+ else if ("".equals(_config.getLocation()))
+ _tmpDir = _contextTmpDir;
+ else
+ {
+ File f = new File (_config.getLocation());
+ if (f.isAbsolute())
+ _tmpDir = f;
+ else
+ _tmpDir = new File (_contextTmpDir, _config.getLocation());
+ }
+
+ if (!_tmpDir.exists())
+ _tmpDir.mkdirs();
+
+ String boundary="--"+QuotedStringTokenizer.unquote(value(_contentType.substring(_contentType.indexOf("boundary="))).trim());
+ byte[] byteBoundary=(boundary+"--").getBytes(StringUtil.__ISO_8859_1);
+
+ // Get first boundary
+ byte[] bytes=TypeUtil.readLine(_in);
+ String line=bytes==null?null:new String(bytes,"UTF-8");
+ if(line==null || !line.equals(boundary))
+ {
+ throw new IOException("Missing initial multi part boundary");
+ }
+
+ // Read each part
+ boolean lastPart=false;
+ String contentDisposition=null;
+ String contentType=null;
+ String contentTransferEncoding=null;
+ outer:while(!lastPart)
+ {
+ MultiMap<String> headers = new MultiMap<String>();
+ while(true)
+ {
+ bytes=TypeUtil.readLine(_in);
+ if(bytes==null)
+ break outer;
+
+ // If blank line, end of part headers
+ if(bytes.length==0)
+ break;
+
+ total += bytes.length;
+ if (_config.getMaxRequestSize() > 0 && total > _config.getMaxRequestSize())
+ throw new ServletException ("Request exceeds maxRequestSize ("+_config.getMaxRequestSize()+")");
+
+ line=new String(bytes,"UTF-8");
+
+ //get content-disposition and content-type
+ int c=line.indexOf(':',0);
+ if(c>0)
+ {
+ String key=line.substring(0,c).trim().toLowerCase();
+ String value=line.substring(c+1,line.length()).trim();
+ headers.put(key, value);
+ if (key.equalsIgnoreCase("content-disposition"))
+ contentDisposition=value;
+ if (key.equalsIgnoreCase("content-type"))
+ contentType = value;
+ if(key.equals("content-transfer-encoding"))
+ contentTransferEncoding=value;
+
+ }
+ }
+
+ // Extract content-disposition
+ boolean form_data=false;
+ if(contentDisposition==null)
+ {
+ throw new IOException("Missing content-disposition");
+ }
+
+ QuotedStringTokenizer tok=new QuotedStringTokenizer(contentDisposition,";");
+ String name=null;
+ String filename=null;
+ while(tok.hasMoreTokens())
+ {
+ String t=tok.nextToken().trim();
+ String tl=t.toLowerCase();
+ if(t.startsWith("form-data"))
+ form_data=true;
+ else if(tl.startsWith("name="))
+ name=value(t);
+ else if(tl.startsWith("filename="))
+ filename=value(t);
+ }
+
+ // Check disposition
+ if(!form_data)
+ {
+ continue;
+ }
+ //It is valid for reset and submit buttons to have an empty name.
+ //If no name is supplied, the browser skips sending the info for that field.
+ //However, if you supply the empty string as the name, the browser sends the
+ //field, with name as the empty string. So, only continue this loop if we
+ //have not yet seen a name field.
+ if(name==null)
+ {
+ continue;
+ }
+
+ if ("base64".equalsIgnoreCase(contentTransferEncoding))
+ {
+ _in = new Base64InputStream(_in);
+ }
+ else if ("quoted-printable".equalsIgnoreCase(contentTransferEncoding))
+ {
+ _in = new FilterInputStream(_in)
+ {
+ @Override
+ public int read() throws IOException
+ {
+ int c = in.read();
+ if (c >= 0 && c == '=')
+ {
+ int hi = in.read();
+ int lo = in.read();
+ if (hi < 0 || lo < 0)
+ {
+ throw new IOException("Unexpected end to quoted-printable byte");
+ }
+ char[] chars = new char[] { (char)hi, (char)lo };
+ c = Integer.parseInt(new String(chars),16);
+ }
+ return c;
+ }
+ };
+ }
+
+
+
+ //Have a new Part
+ MultiPart part = new MultiPart(name, filename);
+ part.setHeaders(headers);
+ part.setContentType(contentType);
+ _parts.add(name, part);
+
+ part.open();
+
+ try
+ {
+ int state=-2;
+ int c;
+ boolean cr=false;
+ boolean lf=false;
+
+ // loop for all lines`
+ while(true)
+ {
+ int b=0;
+ while((c=(state!=-2)?state:_in.read())!=-1)
+ {
+ total ++;
+ if (_config.getMaxRequestSize() > 0 && total > _config.getMaxRequestSize())
+ throw new ServletException("Request exceeds maxRequestSize ("+_config.getMaxRequestSize()+")");
+
+ state=-2;
+ // look for CR and/or LF
+ if(c==13||c==10)
+ {
+ if(c==13)
+ state=_in.read();
+ break;
+ }
+ // look for boundary
+ if(b>=0&&b<byteBoundary.length&&c==byteBoundary[b])
+ b++;
+ else
+ {
+ // this is not a boundary
+ if(cr)
+ part.write(13);
+
+ if(lf)
+ part.write(10);
+
+ cr=lf=false;
+ if(b>0)
+ part.write(byteBoundary,0,b);
+
+ b=-1;
+ part.write(c);
+ }
+ }
+ // check partial boundary
+ if((b>0&&b<byteBoundary.length-2)||(b==byteBoundary.length-1))
+ {
+ if(cr)
+ part.write(13);
+
+ if(lf)
+ part.write(10);
+
+ cr=lf=false;
+ part.write(byteBoundary,0,b);
+ b=-1;
+ }
+ // boundary match
+ if(b>0||c==-1)
+ {
+ if(b==byteBoundary.length)
+ lastPart=true;
+ if(state==10)
+ state=-2;
+ break;
+ }
+ // handle CR LF
+ if(cr)
+ part.write(13);
+
+ if(lf)
+ part.write(10);
+
+ cr=(c==13);
+ lf=(c==10||state==10);
+ if(state==10)
+ state=-2;
+ }
+ }
+ finally
+ {
+
+ part.close();
+ }
+ }
+ }
+
+
+ /* ------------------------------------------------------------ */
+ private String value(String nameEqualsValue)
+ {
+ String value=nameEqualsValue.substring(nameEqualsValue.indexOf('=')+1).trim();
+ int i=value.indexOf(';');
+ if(i>0)
+ value=value.substring(0,i);
+ if(value.startsWith("\""))
+ {
+ value=value.substring(1,value.indexOf('"',1));
+ }
+ else
+ {
+ i=value.indexOf(' ');
+ if(i>0)
+ value=value.substring(0,i);
+ }
+ return value;
+ }
+
+ private static class Base64InputStream extends InputStream
+ {
+ BufferedReader _in;
+ String _line;
+ byte[] _buffer;
+ int _pos;
+
+ public Base64InputStream (InputStream in)
+ {
+ _in = new BufferedReader(new InputStreamReader(in));
+ }
+
+ @Override
+ public int read() throws IOException
+ {
+ if (_buffer==null || _pos>= _buffer.length)
+ {
+ _line = _in.readLine();
+ if (_line==null)
+ return -1;
+ if (_line.startsWith("--"))
+ _buffer=(_line+"\r\n").getBytes();
+ else if (_line.length()==0)
+ _buffer="\r\n".getBytes();
+ else
+ _buffer=B64Code.decode(_line);
+
+ _pos=0;
+ }
+ return _buffer[_pos++];
+ }
+ }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartInputStreamTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartInputStreamTest.java
new file mode 100644
index 0000000000..c66a14eac1
--- /dev/null
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartInputStreamTest.java
@@ -0,0 +1,187 @@
+// ========================================================================
+// Copyright (c) 2006-2009 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 java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.util.Collection;
+
+import javax.servlet.MultipartConfigElement;
+import javax.servlet.ServletException;
+import javax.servlet.http.Part;
+
+import junit.framework.TestCase;
+
+/**
+ * MultiPartInputStreamTest
+ *
+ *
+ */
+public class MultiPartInputStreamTest extends TestCase
+{
+ protected String _contentType = "multipart/form-data, boundary=AaB03x";
+ protected String _multi =
+ "--AaB03x\r\n"+
+ "content-disposition: form-data; name=\"field1\"\r\n"+
+ "\r\n"+
+ "Joe Blow\r\n"+
+ "--AaB03x\r\n"+
+ "content-disposition: form-data; name=\"stuff\"; filename=\"stuff.txt\"\r\n"+
+ "Content-Type: text/plain\r\n"+
+ "\r\n"+
+ "000000000000000000000000000000000000000000000000000\r\n"+
+ "--AaB03x--\r\n";
+
+ protected String _dirname = System.getProperty("java.io.tmpdir")+File.separator+"myfiles-"+System.currentTimeMillis();
+
+
+ public void testNonMultiPartRequest()
+ throws Exception
+ {
+ MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50);
+ MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(_multi.getBytes()),
+ "Content-type: text/plain",
+ config,
+ new File(_dirname));
+ assertTrue(mpis.getParts().isEmpty());
+ }
+
+ public void testNoLimits()
+ throws Exception
+ {
+ MultipartConfigElement config = new MultipartConfigElement(_dirname);
+ MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(_multi.getBytes()),
+ _contentType,
+ config,
+ new File(_dirname));
+ Collection<Part> parts = mpis.getParts();
+ assertFalse(parts.isEmpty());
+ }
+
+ public void testRequestTooBig ()
+ throws Exception
+ {
+ MultipartConfigElement config = new MultipartConfigElement(_dirname, 60, 100, 50);
+ MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(_multi.getBytes()),
+ _contentType,
+ config,
+ new File(_dirname));
+
+ try
+ {
+ mpis.getParts();
+ fail("Request should have exceeded maxRequestSize");
+ }
+ catch (ServletException e)
+ {
+ assertTrue(e.getMessage().startsWith("Request exceeds maxRequestSize"));
+ }
+ }
+
+ public void testFileTooBig()
+ throws Exception
+ {
+ MultipartConfigElement config = new MultipartConfigElement(_dirname, 40, 1024, 30);
+ MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(_multi.getBytes()),
+ _contentType,
+ config,
+ new File(_dirname));
+
+ try
+ {
+ mpis.getParts();
+ fail("stuff.txt should have been larger than maxFileSize");
+ }
+ catch (ServletException e)
+ {
+ assertTrue(e.getMessage().startsWith("Multipart Mime part"));
+ }
+ }
+
+
+ public void testMulti ()
+ throws Exception
+ {
+ MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50);
+ MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(_multi.getBytes()),
+ _contentType,
+ config,
+ new File(_dirname));
+
+ Collection<Part> parts = mpis.getParts();
+ assertEquals(2, parts.size());
+ Part field1 = mpis.getPart("field1");
+ assertNotNull(field1);
+ assertEquals("field1", field1.getName());
+ InputStream is = field1.getInputStream();
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ IO.copy(is, os);
+ assertEquals("Joe Blow", new String(os.toByteArray()));
+ assertEquals(8, field1.getSize());
+ field1.write("field1.txt");
+ File f = new File (_dirname+File.separator+"field1.txt");
+ assertTrue(f.exists());
+ field1.delete();
+ assertFalse(f.exists());
+
+ Part stuff = mpis.getPart("stuff");
+ assertEquals("text/plain", stuff.getContentType());
+ assertEquals("text/plain", stuff.getHeader("content-type"));
+ assertEquals(1, stuff.getHeaders("content-type").size());
+ assertEquals("form-data; name=\"stuff\"; filename=\"stuff.txt\"", stuff.getHeader("content-disposition"));
+ assertEquals(2, stuff.getHeaderNames().size());
+ assertEquals(51, stuff.getSize());
+ f = ((MultiPartInputStream.MultiPart)stuff).getFile();
+ assertNotNull(f); // longer than 100 bytes, should already be a file
+ assertTrue(f.exists());
+ assertNotSame("stuff.txt", f.getName());
+ stuff.write("stuff.txt");
+ f = new File(_dirname+File.separator+"stuff.txt");
+ assertTrue(f.exists());
+ }
+
+ public void testMultiSameNames ()
+ throws Exception
+ {
+ String sameNames = "--AaB03x\r\n"+
+ "content-disposition: form-data; name=\"stuff\"; filename=\"stuff1.txt\"\r\n"+
+ "Content-Type: text/plain\r\n"+
+ "\r\n"+
+ "00000\r\n"+
+ "--AaB03x\r\n"+
+ "content-disposition: form-data; name=\"stuff\"; filename=\"stuff2.txt\"\r\n"+
+ "Content-Type: text/plain\r\n"+
+ "\r\n"+
+ "000000000000000000000000000000000000000000000000000\r\n"+
+ "--AaB03x--\r\n";
+
+ MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50);
+ MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(sameNames.getBytes()),
+ _contentType,
+ config,
+ new File(_dirname));
+
+ Collection<Part> parts = mpis.getParts();
+ assertEquals(2, parts.size());
+ for (Part p:parts)
+ assertEquals("stuff", p.getName());
+
+ //if they all have the name name, then only retrieve the first one
+ Part p = mpis.getPart("stuff");
+ assertNotNull(p);
+ assertEquals(5, p.getSize());
+ }
+}
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java
index 317c5699e4..fa37b30db3 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java
@@ -105,21 +105,21 @@ public class ResourceTest
/* ------------------------------------------------------------ */
@BeforeClass
public static void setUp()
- throws Exception
+ throws Exception
{
if (data!=null)
return;
-
+
File file = new File(__userDir);
file=new File(file.getCanonicalPath());
URI uri = file.toURI();
__userURL=uri.toURL();
-
+
__userURL = new URL(__userURL.toString() + "src/test/java/org/eclipse/jetty/util/resource/");
- FilePermission perm = (FilePermission) __userURL.openConnection().getPermission();
- __userDir = new File(perm.getName()).getCanonicalPath() + File.separatorChar;
- __relDir = "src/test/java/org/eclipse/jetty/util/resource/".replace('/', File.separatorChar);
-
+ FilePermission perm = (FilePermission) __userURL.openConnection().getPermission();
+ __userDir = new File(perm.getName()).getCanonicalPath() + File.separatorChar;
+ __relDir = "src/test/java/org/eclipse/jetty/util/resource/".replace('/', File.separatorChar);
+
System.err.println("User Dir="+__userDir);
System.err.println("Rel Dir="+__relDir);
System.err.println("User URL="+__userURL);
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/thread/TimeoutTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/TimeoutTest.java
index ab7883818f..e38b56d520 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/thread/TimeoutTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/thread/TimeoutTest.java
@@ -24,6 +24,8 @@ import org.junit.Test;
public class TimeoutTest
{
+ private boolean _stress=Boolean.getBoolean("STRESS");
+
Object lock = new Object();
Timeout timeout = new Timeout(null);
Timeout.Task[] tasks;
@@ -131,6 +133,9 @@ public class TimeoutTest
@Test
public void testStress() throws Exception
{
+ if ( !_stress )
+ return;
+
final int LOOP=250;
final AtomicBoolean running=new AtomicBoolean(true);
final AtomicIntegerArray count = new AtomicIntegerArray( 4 );
diff --git a/jetty-webapp/pom.xml b/jetty-webapp/pom.xml
index 9441bf59b0..96e2e30537 100644
--- a/jetty-webapp/pom.xml
+++ b/jetty-webapp/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-webapp</artifactId>
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/JettyWebXmlConfiguration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/JettyWebXmlConfiguration.java
index 037ed9a253..850159ec2d 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/JettyWebXmlConfiguration.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/JettyWebXmlConfiguration.java
@@ -25,7 +25,7 @@ import org.eclipse.jetty.xml.XmlConfiguration;
*
* JettyWebConfiguration.
*
- * Looks for Xmlconfiguration files in WEB-INF. Searches in order for the first of jettyX-web.xml, jetty-web.xml or web-jetty.xml
+ * Looks for Xmlconfiguration files in WEB-INF. Searches in order for the first of jetty6-web.xml, jetty-web.xml or web-jetty.xml
*
*
*
@@ -64,7 +64,7 @@ public class JettyWebXmlConfiguration extends AbstractConfiguration
if(web_inf!=null&&web_inf.isDirectory())
{
// do jetty.xml file
- Resource jetty=web_inf.addPath("jetty7-web.xml");
+ Resource jetty=web_inf.addPath("jetty8-web.xml");
if(!jetty.exists())
jetty=web_inf.addPath(JETTY_WEB_XML);
if(!jetty.exists())
@@ -114,6 +114,13 @@ public class JettyWebXmlConfiguration extends AbstractConfiguration
private void setupXmlConfiguration(XmlConfiguration jetty_config, Resource web_inf)
{
Map<String,String> props = jetty_config.getProperties();
+ if (props == null)
+ {
+ props = new HashMap<String, String>();
+ jetty_config.setProperties(props);
+ }
+
+ // TODO - should this be an id rather than a property?
props.put(PROPERTY_THIS_WEB_INF_URL, String.valueOf(web_inf.getURL()));
}
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaData.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaData.java
index 212a08a069..3c96248fe5 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaData.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaData.java
@@ -311,7 +311,14 @@ public class MetaData
int j = fullname.lastIndexOf("/", i);
orderedLibs.add(fullname.substring(j+1,i+4));
}
- context.setAttribute(ORDERED_LIBS, orderedLibs);
+ context.setAttribute(ServletContext.ORDERED_LIBS, orderedLibs);
+ }
+
+ // set the webxml version
+ if (_webXmlRoot != null)
+ {
+ context.getServletContext().setEffectiveMajorVersion(_webXmlRoot.getMajorVersion());
+ context.getServletContext().setEffectiveMinorVersion(_webXmlRoot.getMinorVersion());
}
for (DescriptorProcessor p:_descriptorProcessors)
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java
index f5c66f6c26..a07e185e41 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java
@@ -75,6 +75,17 @@ public class MetaInfConfiguration extends AbstractConfiguration
scanner.scan(null, uris, true);
}
}
+ @Override
+ public void configure(WebAppContext context) throws Exception
+ {
+
+ }
+
+ @Override
+ public void deconfigure(WebAppContext context) throws Exception
+ {
+
+ }
@Override
public void postConfigure(WebAppContext context) throws Exception
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Ordering.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Ordering.java
index 2f07404f2b..b0566a5fd6 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Ordering.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Ordering.java
@@ -56,6 +56,7 @@ public interface Ordering
* Order the list of jars in WEB-INF/lib according to the ordering declarations in the descriptors
* @see org.eclipse.jetty.webapp.Ordering#order(java.util.List)
*/
+ @Override
public List<Resource> order(List<Resource> jars)
{
List<Resource> orderedList = new ArrayList<Resource>();
@@ -93,7 +94,7 @@ public interface Ordering
return orderedList;
}
-
+ @Override
public boolean isAbsolute()
{
return true;
@@ -113,7 +114,7 @@ public interface Ordering
_order.add(OTHER);
}
-
+ @Override
public boolean hasOther ()
{
return _hasOther;
@@ -140,7 +141,7 @@ public interface Ordering
* in the various web-fragment.xml files.
* @see org.eclipse.jetty.webapp.Ordering#order(java.util.List)
*/
-
+ @Override
public List<Resource> order(List<Resource> jars)
{
//for each jar, put it into the ordering according to the fragment ordering
@@ -210,13 +211,13 @@ public interface Ordering
return orderedList;
}
-
+ @Override
public boolean isAbsolute ()
{
return false;
}
-
+ @Override
public boolean hasOther ()
{
return !_beforeOthers.isEmpty() || !_afterOthers.isEmpty();
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/StandardDescriptorProcessor.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/StandardDescriptorProcessor.java
index 7820a36e57..02ba3906ef 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/StandardDescriptorProcessor.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/StandardDescriptorProcessor.java
@@ -20,20 +20,26 @@ import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.EventListener;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import javax.servlet.DispatcherType;
+import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+import javax.servlet.SessionTrackingMode;
import org.eclipse.jetty.http.security.Constraint;
import org.eclipse.jetty.security.ConstraintAware;
import org.eclipse.jetty.security.ConstraintMapping;
import org.eclipse.jetty.security.authentication.FormAuthenticator;
-import org.eclipse.jetty.server.DispatcherType;
import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.FilterMapping;
+import org.eclipse.jetty.servlet.Holder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
@@ -185,7 +191,7 @@ public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
*/
if (holder == null)
{
- holder = context.getServletHandler().newServletHolder();
+ holder = context.getServletHandler().newServletHolder(Holder.Source.DESCRIPTOR);
holder.setName(servlet_name);
context.getServletHandler().addServlet(holder);
}
@@ -462,6 +468,136 @@ public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
}
}
}
+
+ String async=node.getString("async-supported",false,true);
+ if (async!=null)
+ {
+ boolean val = async.length()==0||Boolean.valueOf(async);
+ Origin o =context.getMetaData().getOrigin(servlet_name+".servlet.async-supported");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //set it
+ holder.setAsyncSupported(val);
+ context.getMetaData().setOrigin(servlet_name+".servlet.async-supported", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //async-supported set by previous web xml descriptor, only allow override if we're parsing another web descriptor(web.xml/web-override.xml/web-default.xml)
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ holder.setAsyncSupported(val);
+ context.getMetaData().setOrigin(servlet_name+".servlet.async-supported", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //async-supported set by another fragment, this fragment's value must match
+ if (holder.isAsyncSupported() != val)
+ throw new IllegalStateException("Conflicting async-supported="+async+" for servlet "+servlet_name+" in "+descriptor.getResource());
+ break;
+ }
+ }
+ }
+
+ String enabled = node.getString("enabled", false, true);
+ if (enabled!=null)
+ {
+ boolean is_enabled = enabled.length()==0||Boolean.valueOf(enabled);
+ // TODO handle enabled?
+ Origin o = context.getMetaData().getOrigin(servlet_name+".servlet.enabled");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //hasn't been set yet, so set it
+ //TODO
+ context.getMetaData().setOrigin(servlet_name+".servlet.enabled", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //was set in a web xml descriptor, only allow override from another web xml descriptor
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ //TODO
+ context.getMetaData().setOrigin(servlet_name+".servlet.enabled", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //was set by another fragment, this fragment's value must match
+ //TODO
+ break;
+ }
+ }
+ }
+
+ /*
+ * If multipart config not set, then set it and record it was by the web.xml or fragment.
+ * If it was set by web.xml then if this is a fragment, ignore the settings.
+ * If it was set by a fragment, if this is a fragment and the values are different, error!
+ */
+ XmlParser.Node multipart = node.get("multipart-config");
+ if (multipart != null)
+ {
+ String location = node.getString("location", false, true);
+ String maxFile = node.getString("max-file-size", false, true);
+ String maxRequest = node.getString("max-request-size", false, true);
+ String threshold = node.getString("file-size-threshold",false,true);
+ MultipartConfigElement element = new MultipartConfigElement(location,
+ (maxFile==null||"".equals(maxFile)?-1L:Long.parseLong(maxFile)),
+ (maxRequest==null||"".equals(maxRequest)?-1L:Long.parseLong(maxRequest)),
+ (threshold==null||"".equals(threshold)?0:Integer.parseInt(threshold)));
+
+ Origin o = context.getMetaData().getOrigin(servlet_name+".servlet.multipart-config");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //hasn't been set, so set it
+ holder.getRegistration().setMultipartConfig(element);
+ context.getMetaData().setOrigin(servlet_name+".servlet.multipart-config", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //was set in a web xml, only allow changes if we're parsing another web xml (web.xml/web-default.xml/web-override.xml)
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ holder.getRegistration().setMultipartConfig(element);
+ context.getMetaData().setOrigin(servlet_name+".servlet.multipart-config", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //another fragment set the value, this fragment's values must match exactly or it is an error
+ MultipartConfigElement cfg = ((ServletHolder.Registration)holder.getRegistration()).getMultipartConfig();
+
+ if (cfg.getMaxFileSize() != element.getMaxFileSize())
+ throw new IllegalStateException("Conflicting multipart-config max-file-size for servlet "+servlet_name+" in "+descriptor.getResource());
+ if (cfg.getMaxRequestSize() != element.getMaxRequestSize())
+ throw new IllegalStateException("Conflicting multipart-config max-request-size for servlet "+servlet_name+" in "+descriptor.getResource());
+ if (cfg.getFileSizeThreshold() != element.getFileSizeThreshold())
+ throw new IllegalStateException("Conflicting multipart-config file-size-threshold for servlet "+servlet_name+" in "+descriptor.getResource());
+ if ((cfg.getLocation() != null && (element.getLocation() == null || element.getLocation().length()==0))
+ || (cfg.getLocation() == null && (element.getLocation()!=null || element.getLocation().length() > 0)))
+ throw new IllegalStateException("Conflicting multipart-config location for servlet "+servlet_name+" in "+descriptor.getResource());
+ break;
+ }
+ }
+ }
}
@@ -526,6 +662,282 @@ public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
int timeout = Integer.parseInt(tNode.toString(false, true));
context.getSessionHandler().getSessionManager().setMaxInactiveInterval(timeout * 60);
}
+
+ //Servlet Spec 3.0
+ // <tracking-mode>
+ // this is additive across web-fragments
+ Iterator iter = node.iterator("tracking-mode");
+ Set<SessionTrackingMode> modes = new HashSet<SessionTrackingMode>();
+ modes.addAll(context.getSessionHandler().getSessionManager().getEffectiveSessionTrackingModes());
+ while (iter.hasNext())
+ {
+ XmlParser.Node mNode = (XmlParser.Node) iter.next();
+ String trackMode = mNode.toString(false, true);
+ modes.add(SessionTrackingMode.valueOf(trackMode));
+ }
+ context.getSessionHandler().getSessionManager().setSessionTrackingModes(modes);
+
+
+ //Servlet Spec 3.0
+ //<cookie-config>
+ XmlParser.Node cookieConfig = node.get("cookie-config");
+ if (cookieConfig != null)
+ {
+ // <name>
+ String name = cookieConfig.getString("name", false, true);
+ if (name != null)
+ {
+ Origin o = context.getMetaData().getOrigin("cookie-config.name");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //no <cookie-config><name> set yet, accept it
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setName(name);
+ context.getMetaData().setOrigin("cookie-config.name", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //<cookie-config><name> set in a web xml, only allow web-default/web-override to change
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setName(name);
+ context.getMetaData().setOrigin("cookie-config.name", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //a web-fragment set the value, all web-fragments must have the same value
+ if (!context.getSessionHandler().getSessionManager().getSessionCookieConfig().getName().equals(name))
+ throw new IllegalStateException("Conflicting cookie-config name "+name+" in "+descriptor.getResource());
+ break;
+ }
+ }
+ }
+
+ // <domain>
+ String domain = cookieConfig.getString("domain", false, true);
+ if (domain != null)
+ {
+ Origin o = context.getMetaData().getOrigin("cookie-config.domain");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //no <cookie-config><domain> set yet, accept it
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setDomain(domain);
+ context.getMetaData().setOrigin("cookie-config.domain", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //<cookie-config><domain> set in a web xml, only allow web-default/web-override to change
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setDomain(domain);
+ context.getMetaData().setOrigin("cookie-config.domain", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //a web-fragment set the value, all web-fragments must have the same value
+ if (!context.getSessionHandler().getSessionManager().getSessionCookieConfig().getDomain().equals(domain))
+ throw new IllegalStateException("Conflicting cookie-config domain "+domain+" in "+descriptor.getResource());
+ break;
+ }
+ }
+ }
+
+ // <path>
+ String path = cookieConfig.getString("path", false, true);
+ if (path != null)
+ {
+ Origin o = context.getMetaData().getOrigin("cookie-config.path");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //no <cookie-config><domain> set yet, accept it
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setPath(path);
+ context.getMetaData().setOrigin("cookie-config.path", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //<cookie-config><domain> set in a web xml, only allow web-default/web-override to change
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setPath(path);
+ context.getMetaData().setOrigin("cookie-config.path", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //a web-fragment set the value, all web-fragments must have the same value
+ if (!context.getSessionHandler().getSessionManager().getSessionCookieConfig().getPath().equals(path))
+ throw new IllegalStateException("Conflicting cookie-config path "+path+" in "+descriptor.getResource());
+ break;
+ }
+ }
+ }
+
+ // <comment>
+ String comment = cookieConfig.getString("comment", false, true);
+ if (comment != null)
+ {
+ Origin o = context.getMetaData().getOrigin("cookie-config.comment");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //no <cookie-config><comment> set yet, accept it
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setComment(comment);
+ context.getMetaData().setOrigin("cookie-config.comment", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //<cookie-config><comment> set in a web xml, only allow web-default/web-override to change
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setComment(comment);
+ context.getMetaData().setOrigin("cookie-config.comment", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //a web-fragment set the value, all web-fragments must have the same value
+ if (!context.getSessionHandler().getSessionManager().getSessionCookieConfig().getComment().equals(comment))
+ throw new IllegalStateException("Conflicting cookie-config comment "+comment+" in "+descriptor.getResource());
+ break;
+ }
+ }
+ }
+
+ // <http-only>true/false
+ tNode = cookieConfig.get("http-only");
+ if (tNode != null)
+ {
+ boolean httpOnly = Boolean.parseBoolean(tNode.toString(false,true));
+ Origin o = context.getMetaData().getOrigin("cookie-config.http-only");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //no <cookie-config><http-only> set yet, accept it
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setHttpOnly(httpOnly);
+ context.getMetaData().setOrigin("cookie-config.http-only", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //<cookie-config><http-only> set in a web xml, only allow web-default/web-override to change
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setHttpOnly(httpOnly);
+ context.getMetaData().setOrigin("cookie-config.http-only", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //a web-fragment set the value, all web-fragments must have the same value
+ if (context.getSessionHandler().getSessionManager().getSessionCookieConfig().isHttpOnly() != httpOnly)
+ throw new IllegalStateException("Conflicting cookie-config http-only "+httpOnly+" in "+descriptor.getResource());
+ break;
+ }
+ }
+ }
+
+ // <secure>true/false
+ tNode = cookieConfig.get("secure");
+ if (tNode != null)
+ {
+ boolean secure = Boolean.parseBoolean(tNode.toString(false,true));
+ Origin o = context.getMetaData().getOrigin("cookie-config.secure");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //no <cookie-config><secure> set yet, accept it
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setSecure(secure);
+ context.getMetaData().setOrigin("cookie-config.secure", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //<cookie-config><secure> set in a web xml, only allow web-default/web-override to change
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setSecure(secure);
+ context.getMetaData().setOrigin("cookie-config.secure", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //a web-fragment set the value, all web-fragments must have the same value
+ if (context.getSessionHandler().getSessionManager().getSessionCookieConfig().isSecure() != secure)
+ throw new IllegalStateException("Conflicting cookie-config secure "+secure+" in "+descriptor.getResource());
+ break;
+ }
+ }
+ }
+
+ // <max-age>
+ tNode = cookieConfig.get("max-age");
+ if (tNode != null)
+ {
+ int maxAge = Integer.parseInt(tNode.toString(false,true));
+ Origin o = context.getMetaData().getOrigin("cookie-config.max-age");
+ switch (o)
+ {
+ case NotSet:
+ {
+ //no <cookie-config><max-age> set yet, accept it
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setMaxAge(maxAge);
+ context.getMetaData().setOrigin("cookie-config.max-age", descriptor);
+ break;
+ }
+ case WebXml:
+ case WebDefaults:
+ case WebOverride:
+ {
+ //<cookie-config><max-age> set in a web xml, only allow web-default/web-override to change
+ if (!(descriptor instanceof FragmentDescriptor))
+ {
+ context.getSessionHandler().getSessionManager().getSessionCookieConfig().setMaxAge(maxAge);
+ context.getMetaData().setOrigin("cookie-config.max-age", descriptor);
+ }
+ break;
+ }
+ case WebFragment:
+ {
+ //a web-fragment set the value, all web-fragments must have the same value
+ if (context.getSessionHandler().getSessionManager().getSessionCookieConfig().getMaxAge() != maxAge)
+ throw new IllegalStateException("Conflicting cookie-config max-age "+maxAge+" in "+descriptor.getResource());
+ break;
+ }
+ }
+ }
+ }
}
@@ -666,7 +1078,7 @@ public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
{
//a value was set by a web-fragment, all fragments must have the same value
if (!encoding.equals(context.getLocaleEncoding(locale)))
- throw new IllegalStateException("Conflicting locale-encoding mapping for locale "+locale+" in "+descriptor.getResource());
+ throw new IllegalStateException("Conflicting loacle-encoding mapping for locale "+locale+" in "+descriptor.getResource());
break;
}
}
@@ -1162,7 +1574,7 @@ public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
FilterHolder holder = context.getServletHandler().getFilter(name);
if (holder == null)
{
- holder = context.getServletHandler().newFilterHolder();
+ holder = context.getServletHandler().newFilterHolder(Holder.Source.DESCRIPTOR);
holder.setName(name);
context.getServletHandler().addFilter(holder);
}
@@ -1403,7 +1815,7 @@ public class StandardDescriptorProcessor extends IterativeDescriptorProcessor
{
try
{
- return ((ServletContextHandler.Context)context.getServletContext()).createListener(clazz);
+ return context.getServletContext().createListener(clazz);
}
catch (ServletException se)
{
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java
index fafe73e8d7..6ecd7b1394 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java
@@ -436,5 +436,4 @@ public class WebAppClassLoader extends URLClassLoader
{
return "WebAppClassLoader=" + _name+"@"+Long.toHexString(hashCode());
}
-
}
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java
index f59a5684c7..8014c028b1 100644
--- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java
+++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java
@@ -79,8 +79,8 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL
"org.eclipse.jetty.webapp.WebXmlConfiguration",
"org.eclipse.jetty.webapp.MetaInfConfiguration",
"org.eclipse.jetty.webapp.FragmentConfiguration",
- "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
- "org.eclipse.jetty.webapp.TagLibConfiguration"
+ "org.eclipse.jetty.webapp.JettyWebXmlConfiguration"//,
+ //"org.eclipse.jetty.webapp.TagLibConfiguration"
} ;
// System classes are classes that cannot be replaced by
@@ -145,7 +145,6 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL
private boolean _allowDuplicateFragmentNames = false;
private boolean _throwUnavailableOnStartupException = false;
-
private MetaData _metadata=new MetaData();
public static WebAppContext getCurrentWebAppContext()
diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java
index d2cfc895c4..ebe6a2ea1e 100644
--- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java
+++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java
@@ -87,24 +87,6 @@ public class WebAppContextTest
assertTrue(Arrays.equals(configs,wac.getConfigurations()));
}
- @Test
- public void testRealPathDoesNotExist() throws Exception
- {
- Server server = new Server(0);
- WebAppContext context = new WebAppContext(".", "/");
- server.setHandler(context);
- server.start();
-
- // When
- ServletContext ctx = context.getServletContext();
-
- // Then
- // This passes:
- assertNotNull(ctx.getRealPath("/doesnotexist"));
- // This fails:
- assertNotNull(ctx.getRealPath("/doesnotexist/"));
- }
-
/**
* tests that the servlet context white list works
*
diff --git a/jetty-websocket/pom.xml b/jetty-websocket/pom.xml
index c5c132f822..17a6b58f96 100644
--- a/jetty-websocket/pom.xml
+++ b/jetty-websocket/pom.xml
@@ -2,7 +2,7 @@
<parent>
<artifactId>jetty-project</artifactId>
<groupId>org.eclipse.jetty</groupId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty</groupId>
@@ -23,9 +23,9 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <type>jar</type>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <scope>provided</scope>
</dependency>
</dependencies>
<build>
diff --git a/jetty-websocket/src/test/java/org/eclipse/jetty/websocket/WebSocketParserD06Test.java b/jetty-websocket/src/test/java/org/eclipse/jetty/websocket/WebSocketParserD06Test.java
index bcd513657a..e941abbaeb 100644
--- a/jetty-websocket/src/test/java/org/eclipse/jetty/websocket/WebSocketParserD06Test.java
+++ b/jetty-websocket/src/test/java/org/eclipse/jetty/websocket/WebSocketParserD06Test.java
@@ -13,6 +13,7 @@ import org.eclipse.jetty.io.BufferCache.CachedBuffer;
import org.eclipse.jetty.io.ByteArrayBuffer;
import org.eclipse.jetty.io.ByteArrayEndPoint;
import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.util.TypeUtil;
import org.eclipse.jetty.util.Utf8StringBuilder;
import org.junit.Before;
import org.junit.Test;
@@ -117,7 +118,7 @@ public class WebSocketParserD06Test
_in.put((byte)0x84);
_in.put((byte)11);
_in.put("Hello World".getBytes(StringUtil.__UTF8));
- // System.err.println("tosend="+TypeUtil.toHexString(_in.asArray()));
+ System.err.println("tosend="+TypeUtil.toHexString(_in.asArray()));
int filled =_parser.parseNext();
diff --git a/jetty-xml/pom.xml b/jetty-xml/pom.xml
index 77ba5dbe45..b138e602dd 100644
--- a/jetty-xml/pom.xml
+++ b/jetty-xml/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jetty-xml</artifactId>
diff --git a/pom.xml b/pom.xml
index 1f22e6c040..799af9442a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,27 +7,29 @@
</parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
<name>Jetty :: Project</name>
<url>${jetty.url}</url>
<packaging>pom</packaging>
<properties>
<javax-activation-version>1.1</javax-activation-version>
<javax-mail-version>1.4.1</javax-mail-version>
- <javax-servlet-jsp-version>2.1.v20100127</javax-servlet-jsp-version>
<javax-transaction-version>1.1.1</javax-transaction-version>
<jetty.url>http://www.eclipse.org/jetty</jetty.url>
<junit-version>4.8.1</junit-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4j-version>1.5.11</slf4j-version>
+ <servlet.spec.groupId>org.mortbay.jetty</servlet.spec.groupId>
+ <servlet.spec.artifactId>servlet-api</servlet.spec.artifactId>
+ <servlet.spec.version>3.0.20100224</servlet.spec.version>
<build-support-version>1.0</build-support-version>
<jetty.test.helper>1.5</jetty.test.helper>
<jetty.test.policy>1.2</jetty.test.policy>
</properties>
<scm>
- <connection>scm:svn:http://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/tags/jetty-7.4.2-SNAPSHOT</connection>
- <developerConnection>scm:svn:svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/tags/jetty-7.4.2-SNAPSHOT</developerConnection>
- <url>http://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/tags/jetty-7.4.2-SNAPSHOT</url>
+ <connection>scm:svn:http://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/branches/jetty-8</connection>
+ <developerConnection>scm:svn:svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/branches/jetty-8</developerConnection>
+ <url>http://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/branches/jetty-8</url>
</scm>
<build>
<defaultGoal>install</defaultGoal>
@@ -35,8 +37,8 @@
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
- <source>1.5</source>
- <target>1.5</target>
+ <source>1.6</source>
+ <target>1.6</target>
<verbose>false</verbose>
</configuration>
</plugin>
@@ -308,7 +310,6 @@
<module>jetty-servlet</module>
<module>jetty-webapp</module>
<module>jetty-servlets</module>
- <module>jetty-jsp-2.1</module>
<module>jetty-deploy</module>
<module>jetty-ajp</module>
<module>jetty-jndi</module>
@@ -319,20 +320,22 @@
<module>jetty-start</module>
<module>jetty-nested</module>
<module>jetty-overlay-deployer</module>
+ <module>jetty-osgi</module>
<module>test-continuation</module>
<module>test-continuation-jetty6</module>
<module>test-jetty-servlet</module>
<module>test-jetty-webapp</module>
<module>test-jetty-nested</module>
<module>example-jetty-embedded</module>
+ <module>example-async-rest</module>
<module>tests</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <version>${servlet.spec.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
@@ -417,10 +420,14 @@
-->
<id>osgi</id>
<activation>
- <activeByDefault>true</activeByDefault>
+
+ <activeByDefault>false</activeByDefault>
+ <!--
+ <activeByDefault>true</activeByDefault>
<file>
<exists>${basedir}/pom.xml</exists>
</file>
+ -->
</activation>
<modules>
<module>jetty-osgi</module>
@@ -524,8 +531,8 @@
<configuration>
<excludePackageNames>com.acme</excludePackageNames>
<links>
- <link>http://java.sun.com/j2se/1.5.0/docs/api</link>
- <link>http://java.sun.com/javaee/5/docs/api</link>
+ <link>http://java.sun.com/javase/6/docs/api/</link>
+ <link>http://java.sun.com/javaee/6/docs/api</link>
<link>http://junit.sourceforge.net/javadoc/</link>
</links>
<tags>
diff --git a/test-continuation-jetty6/pom.xml b/test-continuation-jetty6/pom.xml
index da65aaaa34..af247d7ef5 100644
--- a/test-continuation-jetty6/pom.xml
+++ b/test-continuation-jetty6/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>test-continuation-jetty6</artifactId>
@@ -28,16 +28,34 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>2.5-20081211</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${project.version}</version>
<scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>test-continuation</artifactId>
<version>${project.version}</version>
<scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
@@ -45,12 +63,6 @@
<version>6.1.24</version>
<type>jar</type>
<scope>test</scope>
- <exclusions>
- <exclusion>
- <artifactId>servlet-api-2.5</artifactId>
- <groupId>org.mortbay.jetty</groupId>
- </exclusion>
- </exclusions>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
diff --git a/test-continuation-jetty6/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java b/test-continuation-jetty6/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java
new file mode 100644
index 0000000000..9e311d569d
--- /dev/null
+++ b/test-continuation-jetty6/src/test/java/org/eclipse/jetty/continuation/ContinuationBase.java
@@ -0,0 +1,423 @@
+// ========================================================================
+// Copyright (c) 2004-2009 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.continuation;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Socket;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import junit.framework.TestCase;
+
+
+
+public abstract class ContinuationBase extends TestCase
+{
+ protected SuspendServlet _servlet=new SuspendServlet();
+ protected int _port;
+
+ protected void doit(String type) throws Exception
+ {
+ String response;
+
+ response=process(null,null);
+ assertContains(type,response);
+ assertContains("NORMAL",response);
+ assertNotContains("history: onTimeout",response);
+ assertNotContains("history: onComplete",response);
+
+ response=process("sleep=200",null);
+ assertContains("SLEPT",response);
+ assertNotContains("history: onTimeout",response);
+ assertNotContains("history: onComplete",response);
+
+ response=process("suspend=200",null);
+ assertContains("TIMEOUT",response);
+ assertContains("history: onTimeout",response);
+ assertContains("history: onComplete",response);
+
+ response=process("suspend=200&resume=10",null);
+ assertContains("RESUMED",response);
+ assertNotContains("history: onTimeout",response);
+ assertContains("history: onComplete",response);
+
+ response=process("suspend=200&resume=0",null);
+ assertContains("RESUMED",response);
+ assertNotContains("history: onTimeout",response);
+ assertContains("history: onComplete",response);
+
+ response=process("suspend=200&complete=10",null);
+ assertContains("COMPLETED",response);
+ assertNotContains("history: onTimeout",response);
+ assertContains("history: onComplete",response);
+
+ response=process("suspend=200&complete=0",null);
+ assertContains("COMPLETED",response);
+ assertNotContains("history: onTimeout",response);
+ assertContains("history: onComplete",response);
+
+
+ response=process("suspend=1000&resume=10&suspend2=1000&resume2=10",null);
+ assertEquals(2,count(response,"history: suspend"));
+ assertEquals(2,count(response,"history: resume"));
+ assertEquals(0,count(response,"history: onTimeout"));
+ assertEquals(1,count(response,"history: onComplete"));
+ assertContains("RESUMED",response);
+
+ response=process("suspend=1000&resume=10&suspend2=1000&resume2=10",null);
+ assertEquals(2,count(response,"history: suspend"));
+ assertEquals(2,count(response,"history: resume"));
+ assertEquals(0,count(response,"history: onTimeout"));
+ assertEquals(1,count(response,"history: onComplete"));
+ assertContains("RESUMED",response);
+
+ response=process("suspend=1000&resume=10&suspend2=1000&complete2=10",null);
+ assertEquals(2,count(response,"history: suspend"));
+ assertEquals(1,count(response,"history: resume"));
+ assertEquals(0,count(response,"history: onTimeout"));
+ assertEquals(1,count(response,"history: onComplete"));
+ assertContains("COMPLETED",response);
+
+ response=process("suspend=1000&resume=10&suspend2=10",null);
+ assertEquals(2,count(response,"history: suspend"));
+ assertEquals(1,count(response,"history: resume"));
+ assertEquals(1,count(response,"history: onTimeout"));
+ assertEquals(1,count(response,"history: onComplete"));
+ assertContains("TIMEOUT",response);
+
+
+
+ response=process("suspend=10&suspend2=1000&resume2=10",null);
+ assertEquals(2,count(response,"history: suspend"));
+ assertEquals(1,count(response,"history: resume"));
+ assertEquals(1,count(response,"history: onTimeout"));
+ assertEquals(1,count(response,"history: onComplete"));
+ assertContains("RESUMED",response);
+
+ response=process("suspend=10&suspend2=1000&resume2=10",null);
+ assertEquals(2,count(response,"history: suspend"));
+ assertEquals(1,count(response,"history: resume"));
+ assertEquals(1,count(response,"history: onTimeout"));
+ assertEquals(1,count(response,"history: onComplete"));
+ assertContains("RESUMED",response);
+
+ response=process("suspend=10&suspend2=1000&complete2=10",null);
+ assertEquals(2,count(response,"history: suspend"));
+ assertEquals(0,count(response,"history: resume"));
+ assertEquals(1,count(response,"history: onTimeout"));
+ assertEquals(1,count(response,"history: onComplete"));
+ assertContains("COMPLETED",response);
+
+ response=process("suspend=10&suspend2=10",null);
+ assertEquals(2,count(response,"history: suspend"));
+ assertEquals(0,count(response,"history: resume"));
+ assertEquals(2,count(response,"history: onTimeout"));
+ assertEquals(1,count(response,"history: onComplete"));
+ assertContains("TIMEOUT",response);
+
+ }
+
+
+ private int count(String responses,String substring)
+ {
+ int count=0;
+ int i=responses.indexOf(substring);
+ while (i>=0)
+ {
+ count++;
+ i=responses.indexOf(substring,i+substring.length());
+ }
+
+ return count;
+ }
+
+ protected void assertContains(String content,String response)
+ {
+ assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
+ if (response.indexOf(content,15)<0)
+ {
+ System.err.println(content+" NOT IN '"+response+"'");
+ assertTrue(false);
+ }
+ }
+
+ protected void assertNotContains(String content,String response)
+ {
+ assertEquals("HTTP/1.1 200 OK",response.substring(0,15));
+ if (response.indexOf(content,15)>=0)
+ {
+ System.err.println(content+" IS IN '"+response+"'");
+ assertTrue(false);
+ }
+ }
+
+ public synchronized String process(String query,String content) throws Exception
+ {
+ String request = "GET /";
+
+ if (query!=null)
+ request+="?"+query;
+ request+=" HTTP/1.1\r\n"+
+ "Host: localhost\r\n"+
+ "Connection: close\r\n";
+ if (content!=null)
+ request+="Content-Length: "+content.length()+"\r\n";
+ request+="\r\n" + content;
+
+ Socket socket = new Socket("localhost",_port);
+ socket.getOutputStream().write(request.getBytes("UTF-8"));
+
+ String response = toString(socket.getInputStream());
+ return response;
+ }
+
+
+ protected abstract String toString(InputStream in) throws IOException;
+
+
+ private static class SuspendServlet extends HttpServlet
+ {
+ private Timer _timer=new Timer();
+
+ public SuspendServlet()
+ {}
+
+ /* ------------------------------------------------------------ */
+ protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
+ {
+ final Continuation continuation = ContinuationSupport.getContinuation(request,response);
+
+ response.addHeader("history",continuation.getClass().toString());
+
+ int read_before=0;
+ long sleep_for=-1;
+ long suspend_for=-1;
+ long suspend2_for=-1;
+ long resume_after=-1;
+ long resume2_after=-1;
+ long complete_after=-1;
+ long complete2_after=-1;
+
+ if (request.getParameter("read")!=null)
+ read_before=Integer.parseInt(request.getParameter("read"));
+ if (request.getParameter("sleep")!=null)
+ sleep_for=Integer.parseInt(request.getParameter("sleep"));
+ if (request.getParameter("suspend")!=null)
+ suspend_for=Integer.parseInt(request.getParameter("suspend"));
+ if (request.getParameter("suspend2")!=null)
+ suspend2_for=Integer.parseInt(request.getParameter("suspend2"));
+ if (request.getParameter("resume")!=null)
+ resume_after=Integer.parseInt(request.getParameter("resume"));
+ if (request.getParameter("resume2")!=null)
+ resume2_after=Integer.parseInt(request.getParameter("resume2"));
+ if (request.getParameter("complete")!=null)
+ complete_after=Integer.parseInt(request.getParameter("complete"));
+ if (request.getParameter("complete2")!=null)
+ complete2_after=Integer.parseInt(request.getParameter("complete2"));
+
+ if (continuation.isInitial())
+ {
+ if (read_before>0)
+ {
+ byte[] buf=new byte[read_before];
+ request.getInputStream().read(buf);
+ }
+ else if (read_before<0)
+ {
+ InputStream in = request.getInputStream();
+ int b=in.read();
+ while(b!=-1)
+ b=in.read();
+ }
+
+ if (suspend_for>=0)
+ {
+ if (suspend_for>0)
+ continuation.setTimeout(suspend_for);
+ continuation.addContinuationListener(__listener);
+ ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","suspend");
+ continuation.suspend();
+
+ if (complete_after>0)
+ {
+ TimerTask complete = new TimerTask()
+ {
+ public void run()
+ {
+ try
+ {
+ response.setStatus(200);
+ response.getOutputStream().println("COMPLETED\n");
+ continuation.complete();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ };
+ synchronized (_timer)
+ {
+ _timer.schedule(complete,complete_after);
+ }
+ }
+ else if (complete_after==0)
+ {
+ response.setStatus(200);
+ response.getOutputStream().println("COMPLETED\n");
+ continuation.complete();
+ }
+ else if (resume_after>0)
+ {
+ TimerTask resume = new TimerTask()
+ {
+ public void run()
+ {
+ ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
+ continuation.resume();
+ }
+ };
+ synchronized (_timer)
+ {
+ _timer.schedule(resume,resume_after);
+ }
+ }
+ else if (resume_after==0)
+ {
+ ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
+ continuation.resume();
+ }
+ }
+ else if (sleep_for>=0)
+ {
+ try
+ {
+ Thread.sleep(sleep_for);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+ response.setStatus(200);
+ response.getOutputStream().println("SLEPT\n");
+ }
+ else
+ {
+ response.setStatus(200);
+ response.getOutputStream().println("NORMAL\n");
+ }
+ }
+ else if (suspend2_for>=0 && request.getAttribute("2nd")==null)
+ {
+ request.setAttribute("2nd","cycle");
+
+ if (suspend2_for>0)
+ continuation.setTimeout(suspend2_for);
+ // continuation.addContinuationListener(__listener);
+ ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","suspend");
+ continuation.suspend();
+
+ if (complete2_after>0)
+ {
+ TimerTask complete = new TimerTask()
+ {
+ public void run()
+ {
+ try
+ {
+ response.setStatus(200);
+ response.getOutputStream().println("COMPLETED\n");
+ continuation.complete();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ };
+ synchronized (_timer)
+ {
+ _timer.schedule(complete,complete2_after);
+ }
+ }
+ else if (complete2_after==0)
+ {
+ response.setStatus(200);
+ response.getOutputStream().println("COMPLETED\n");
+ continuation.complete();
+ }
+ else if (resume2_after>0)
+ {
+ TimerTask resume = new TimerTask()
+ {
+ public void run()
+ {
+ ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
+ continuation.resume();
+ }
+ };
+ synchronized (_timer)
+ {
+ _timer.schedule(resume,resume2_after);
+ }
+ }
+ else if (resume2_after==0)
+ {
+ ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","resume");
+ continuation.resume();
+ }
+ return;
+ }
+ else if (continuation.isExpired())
+ {
+ response.setStatus(200);
+ response.getOutputStream().println("TIMEOUT\n");
+ }
+ else if (continuation.isResumed())
+ {
+ response.setStatus(200);
+ response.getOutputStream().println("RESUMED\n");
+ }
+ else
+ {
+ response.setStatus(200);
+ response.getOutputStream().println("unknown???\n");
+ }
+ }
+ }
+
+
+
+ private static ContinuationListener __listener =
+ new ContinuationListener()
+ {
+ public void onComplete(Continuation continuation)
+ {
+ ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","onComplete");
+ }
+
+ public void onTimeout(Continuation continuation)
+ {
+ ((HttpServletResponse)continuation.getServletResponse()).addHeader("history","onTimeout");
+ continuation.resume();
+ }
+
+ };
+}
diff --git a/test-continuation-jetty6/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java b/test-continuation-jetty6/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java
new file mode 100644
index 0000000000..0f788b1698
--- /dev/null
+++ b/test-continuation-jetty6/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java
@@ -0,0 +1,78 @@
+// ========================================================================
+// Copyright (c) 2004-2009 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.continuation;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.servlet.Context;
+import org.mortbay.jetty.servlet.FilterHolder;
+import org.mortbay.jetty.servlet.ServletHandler;
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.util.IO;
+
+
+public class FauxContinuationTest extends ContinuationBase
+{
+ protected Server _server = new Server();
+ protected ServletHandler _servletHandler;
+ protected SelectChannelConnector _connector;
+ FilterHolder _filter;
+
+ protected void setUp() throws Exception
+ {
+ _connector = new SelectChannelConnector();
+ _server.setConnectors(new Connector[]{ _connector });
+ Context servletContext = new Context(Context.NO_SECURITY|Context.NO_SESSIONS);
+ _server.setHandler(servletContext);
+ _servletHandler=servletContext.getServletHandler();
+ ServletHolder holder=new ServletHolder(_servlet);
+ _servletHandler.addServletWithMapping(holder,"/");
+ _filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",0);
+ }
+
+ protected void tearDown() throws Exception
+ {
+ _server.stop();
+ }
+
+ public void testFaux() throws Exception
+ {
+ _filter.setInitParameter("debug","true");
+ _filter.setInitParameter("faux","true");
+ _server.start();
+ _port=_connector.getLocalPort();
+
+ doit("FauxContinuation");
+ }
+
+
+
+ protected String toString(InputStream in) throws IOException
+ {
+ return IO.toString(in);
+ }
+}
diff --git a/test-continuation/pom.xml b/test-continuation/pom.xml
index e915d1d489..33ce0f2737 100644
--- a/test-continuation/pom.xml
+++ b/test-continuation/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>test-continuation</artifactId>
diff --git a/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java b/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java
index f70727d03e..7452584182 100644
--- a/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java
+++ b/test-continuation/src/test/java/org/eclipse/jetty/continuation/ContinuationTest.java
@@ -15,6 +15,7 @@ package org.eclipse.jetty.continuation;
import java.io.IOException;
import java.io.InputStream;
+import java.util.EnumSet;
import org.eclipse.jetty.continuation.test.ContinuationBase;
import org.eclipse.jetty.server.Connector;
@@ -44,6 +45,7 @@ public class ContinuationTest extends ContinuationBase
_server.setHandler(servletContext);
_servletHandler=servletContext.getServletHandler();
ServletHolder holder=new ServletHolder(_servlet);
+ holder.setAsyncSupported(true);
_servletHandler.addServletWithMapping(holder,"/");
_server.start();
diff --git a/test-continuation/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java b/test-continuation/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java
index 9820e71c6f..d6f50fc4a4 100644
--- a/test-continuation/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java
+++ b/test-continuation/src/test/java/org/eclipse/jetty/continuation/FauxContinuationTest.java
@@ -15,6 +15,9 @@ package org.eclipse.jetty.continuation;
import java.io.IOException;
import java.io.InputStream;
+import java.util.EnumSet;
+
+import javax.servlet.DispatcherType;
import org.eclipse.jetty.continuation.test.ContinuationBase;
import org.eclipse.jetty.server.Connector;
@@ -44,7 +47,7 @@ public class FauxContinuationTest extends ContinuationBase
ServletHolder holder=new ServletHolder(_servlet);
_servletHandler.addServletWithMapping(holder,"/");
- _filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",0);
+ _filter=_servletHandler.addFilterWithMapping(ContinuationFilter.class,"/*",null);
_filter.setInitParameter("debug","true");
_filter.setInitParameter("faux","true");
_server.start();
diff --git a/test-jetty-nested/pom.xml b/test-jetty-nested/pom.xml
index ba658360ee..252ba5a369 100644
--- a/test-jetty-nested/pom.xml
+++ b/test-jetty-nested/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>test-jetty-nested</artifactId>
<name>Jetty :: Nested Test</name>
diff --git a/test-jetty-servlet/pom.xml b/test-jetty-servlet/pom.xml
index 449605533b..2492f1f433 100644
--- a/test-jetty-servlet/pom.xml
+++ b/test-jetty-servlet/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>test-jetty-servlet</artifactId>
diff --git a/test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/HttpTester.java b/test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/HttpTester.java
index 531121a75d..edbcd5a4bd 100644
--- a/test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/HttpTester.java
+++ b/test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/HttpTester.java
@@ -326,7 +326,7 @@ public class HttpTester
cookie.getMaxAge(),
cookie.getComment(),
cookie.getSecure(),
- false,
+ cookie.isHttpOnly(),
cookie.getVersion());
}
diff --git a/test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/ServletTester.java b/test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/ServletTester.java
index 8b3958981a..a1aec59a57 100644
--- a/test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/ServletTester.java
+++ b/test-jetty-servlet/src/main/java/org/eclipse/jetty/testing/ServletTester.java
@@ -14,9 +14,12 @@
package org.eclipse.jetty.testing;
import java.net.InetAddress;
+import java.util.EnumSet;
import java.util.Enumeration;
import java.util.EventListener;
+import javax.servlet.DispatcherType;
+
import org.eclipse.jetty.io.ByteArrayBuffer;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
@@ -228,7 +231,7 @@ public class ServletTester
* @return the FilterHolder
* @see org.eclipse.jetty.servlet.ServletContextHandler#addFilter(java.lang.Class, java.lang.String, int)
*/
- public FilterHolder addFilter(Class filterClass, String pathSpec, int dispatches)
+ public FilterHolder addFilter(Class filterClass, String pathSpec, EnumSet<DispatcherType> dispatches)
{
return _context.addFilter(filterClass,pathSpec,dispatches);
}
@@ -241,7 +244,7 @@ public class ServletTester
* @return the FilterHolder
* @see org.eclipse.jetty.servlet.ServletContextHandler#addFilter(java.lang.String, java.lang.String, int)
*/
- public FilterHolder addFilter(String filterClass, String pathSpec, int dispatches)
+ public FilterHolder addFilter(String filterClass, String pathSpec, EnumSet<DispatcherType> dispatches)
{
return _context.addFilter(filterClass,pathSpec,dispatches);
}
diff --git a/test-jetty-webapp/pom.xml b/test-jetty-webapp/pom.xml
index 790366ef50..a7cd0beb0c 100644
--- a/test-jetty-webapp/pom.xml
+++ b/test-jetty-webapp/pom.xml
@@ -2,7 +2,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty</groupId>
@@ -164,11 +164,11 @@
<artifactId>jetty-servlets</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <scope>provided</scope>
- </dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <scope>provided</scope>
+ </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-websocket</artifactId>
diff --git a/test-jetty-webapp/src/main/java/com/acme/Dump.java b/test-jetty-webapp/src/main/java/com/acme/Dump.java
index cd4c2de057..e59c794887 100644
--- a/test-jetty-webapp/src/main/java/com/acme/Dump.java
+++ b/test-jetty-webapp/src/main/java/com/acme/Dump.java
@@ -103,6 +103,18 @@ public class Dump extends HttpServlet
@Override
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException
{
+ if (!request.isUserInRole("user"))
+ {
+ try
+ {
+ request.login("user", "password");
+ }
+ catch(ServletException se)
+ {
+ se.printStackTrace();
+ }
+ }
+
// Handle a dump of data
final String data= request.getParameter("data");
final String chars= request.getParameter("chars");
diff --git a/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml b/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml
index eee0a8801b..1d0b8ca1d1 100644
--- a/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml
+++ b/test-jetty-webapp/src/main/webapp/WEB-INF/web.xml
@@ -2,8 +2,9 @@
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- version="2.5">
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ metadata-complete="false"
+ version="3.0">
<display-name>Test WebApp</display-name>
@@ -20,6 +21,7 @@
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.acme.TestFilter</filter-class>
+ <async-support>true</async-support>
<init-param>
<param-name>remote</param-name>
<param-value>false</param-value>
@@ -34,6 +36,7 @@
<filter>
<filter-name>QoSFilter</filter-name>
<filter-class>org.eclipse.jetty.servlets.QoSFilter</filter-class>
+ <async-support>true</async-support>
<init-param>
<param-name>maxRequests</param-name>
<param-value>20</param-value>
@@ -52,6 +55,7 @@
<filter>
<filter-name>MultiPart</filter-name>
<filter-class>org.eclipse.jetty.servlets.MultiPartFilter</filter-class>
+ <async-support>true</async-support>
<init-param>
<param-name>deleteFiles</param-name>
<param-value>true</param-value>
@@ -66,6 +70,7 @@
<filter>
<filter-name>GzipFilter</filter-name>
<filter-class>org.eclipse.jetty.servlets.IncludableGzipFilter</filter-class>
+ <async-support>true</async-support>
<init-param>
<param-name>bufferSize</param-name>
<param-value>8192</param-value>
@@ -130,6 +135,7 @@
<servlet>
<servlet-name>Dump</servlet-name>
<servlet-class>com.acme.Dump</servlet-class>
+ <async-support>true</async-support>
<load-on-startup>1</load-on-startup>
<run-as><role-name>admin</role-name></run-as>
</servlet>
@@ -165,6 +171,7 @@
<servlet>
<servlet-name>Dispatch</servlet-name>
<servlet-class>com.acme.DispatchServlet</servlet-class>
+ <async-support>true</async-support>
<load-on-startup>1</load-on-startup>
</servlet>
@@ -187,6 +194,7 @@
<servlet>
<servlet-name>Chat</servlet-name>
<servlet-class>com.acme.ChatServlet</servlet-class>
+ <async-support>true</async-support>
<load-on-startup>1</load-on-startup>
</servlet>
@@ -234,6 +242,7 @@
<servlet>
<servlet-name>TransparentProxy</servlet-name>
<servlet-class>org.eclipse.jetty.servlets.ProxyServlet$Transparent</servlet-class>
+ <async-support>true</async-support>
<init-param>
<param-name>Prefix</param-name><param-value>/javadoc</param-value>
</init-param>
diff --git a/test-jetty-webapp/src/main/webapp/index.html b/test-jetty-webapp/src/main/webapp/index.html
index 28f1b26eeb..f96f625d95 100644
--- a/test-jetty-webapp/src/main/webapp/index.html
+++ b/test-jetty-webapp/src/main/webapp/index.html
@@ -6,9 +6,9 @@
</HEAD>
<BODY>
<A HREF="http://jetty.eclipse.org"><IMG SRC="jetty_banner.gif"></A>
-<h1>Welcome to Jetty 7</h1>
+<h1>Welcome to Jetty 8</h1>
<p>
-This is the Test webapp for the Jetty 7 HTTP Server and Servlet Container.
+This is the Test webapp for the Jetty 8 HTTP Server and Servlet Container.
For more information about Jetty, please visit our
<a href="http://www.eclipse.org/jetty">website</a>
or <a href="http://wiki.eclipse.org/Jetty">wiki</a>.
diff --git a/tests/pom.xml b/tests/pom.xml
index 3fa588c11e..4c7b3c2a13 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -21,7 +21,7 @@
<parent>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>tests-parent</artifactId>
diff --git a/tests/test-integration/pom.xml b/tests/test-integration/pom.xml
index 6a660d1b41..f4c25968f9 100644
--- a/tests/test-integration/pom.xml
+++ b/tests/test-integration/pom.xml
@@ -20,7 +20,7 @@
<parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>tests-parent</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>test-integration</artifactId>
diff --git a/tests/test-loginservice/pom.xml b/tests/test-loginservice/pom.xml
index 3fed18deb7..57179396da 100644
--- a/tests/test-loginservice/pom.xml
+++ b/tests/test-loginservice/pom.xml
@@ -21,7 +21,7 @@
<parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>tests-parent</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>test-loginservice</artifactId>
<name>Jetty Tests :: Login Service</name>
diff --git a/tests/test-sessions/pom.xml b/tests/test-sessions/pom.xml
index 2c8e44cef3..3ed3ec0024 100644
--- a/tests/test-sessions/pom.xml
+++ b/tests/test-sessions/pom.xml
@@ -21,7 +21,7 @@
<parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>tests-parent</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>test-sessions-parent</artifactId>
<name>Jetty Tests :: Sessions :: Parent</name>
diff --git a/tests/test-sessions/test-hash-sessions/pom.xml b/tests/test-sessions/test-hash-sessions/pom.xml
index 6a0c80ed17..cc74e22280 100644
--- a/tests/test-sessions/test-hash-sessions/pom.xml
+++ b/tests/test-sessions/test-hash-sessions/pom.xml
@@ -21,7 +21,7 @@
<parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>test-sessions-parent</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>test-hash-sessions</artifactId>
<name>Jetty Tests :: Sessions :: Hash</name>
diff --git a/tests/test-sessions/test-jdbc-sessions/pom.xml b/tests/test-sessions/test-jdbc-sessions/pom.xml
index 0dc261c2e4..324f688c6b 100644
--- a/tests/test-sessions/test-jdbc-sessions/pom.xml
+++ b/tests/test-sessions/test-jdbc-sessions/pom.xml
@@ -21,7 +21,7 @@
<parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>test-sessions-parent</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>test-jdbc-sessions</artifactId>
<name>Jetty Tests :: Sessions :: JDBC</name>
diff --git a/tests/test-sessions/test-sessions-common/pom.xml b/tests/test-sessions/test-sessions-common/pom.xml
index e840515495..3782efaf4d 100644
--- a/tests/test-sessions/test-sessions-common/pom.xml
+++ b/tests/test-sessions/test-sessions-common/pom.xml
@@ -21,7 +21,7 @@
<parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>test-sessions-parent</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>test-sessions-common</artifactId>
<name>Jetty Tests :: Sessions :: Common</name>
diff --git a/tests/test-webapps/pom.xml b/tests/test-webapps/pom.xml
index 9b920db55b..06e2dbffa4 100644
--- a/tests/test-webapps/pom.xml
+++ b/tests/test-webapps/pom.xml
@@ -21,7 +21,7 @@
<parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>tests-parent</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>test-webapps-parent</artifactId>
<name>Jetty Tests :: WebApps :: Parent</name>
diff --git a/tests/test-webapps/test-webapp-rfc2616/pom.xml b/tests/test-webapps/test-webapp-rfc2616/pom.xml
index 5df38b312e..b0aac34840 100644
--- a/tests/test-webapps/test-webapp-rfc2616/pom.xml
+++ b/tests/test-webapps/test-webapp-rfc2616/pom.xml
@@ -21,7 +21,7 @@
<parent>
<groupId>org.eclipse.jetty.tests</groupId>
<artifactId>test-webapps-parent</artifactId>
- <version>7.4.3-SNAPSHOT</version>
+ <version>8.0.0.RC0-SNAPSHOT</version>
</parent>
<artifactId>test-webapp-rfc2616</artifactId>
<name>Jetty Tests :: WebApp :: RFC2616</name>
@@ -34,11 +34,10 @@
<artifactId>jetty-servlets</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- <scope>provided</scope>
- </dependency>
+ <dependency>
+ <groupId>${servlet.spec.groupId}</groupId>
+ <artifactId>${servlet.spec.artifactId}</artifactId>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
</project>

Back to the top