From b959a742d07bb1e0ab8bb3bf05073c59934b7e29 Mon Sep 17 00:00:00 2001 From: Jesse McConnell Date: Mon, 20 May 2013 09:20:28 -0500 Subject: [PATCH] [Bug 404508] enable overlay deployer --- jetty-overlay-deployer/pom.xml | 63 + .../src/main/assembly/config.xml | 18 + .../src/main/config/etc/jetty-overlay.xml | 24 + .../main/config/overlays/instances/README.TXT | 27 + .../src/main/config/overlays/nodes/README.TXT | 20 + .../main/config/overlays/templates/README.TXT | 32 + .../main/config/overlays/webapps/README.TXT | 6 + .../jetty/overlays/OverlayedAppProvider.java | 1523 +++++++++++++++++ .../jetty/overlays/TemplateContext.java | 290 ++++ .../eclipse/jetty/overlays/OverlayServer.java | 100 ++ .../overlays/OverlayedAppProviderTest.java | 589 +++++++ .../myfoo=blue/WEB-INF/classes/resourceA.txt | 1 + .../myfoo=blue/WEB-INF/classes/resourceB.txt | 1 + .../WEB-INF/lib-overlay/resources.jar | Bin 0 -> 921 bytes .../instances/myfoo=blue/WEB-INF/overlay.xml | 16 + .../myfoo=blue/WEB-INF/web-overlay.xml | 21 + .../myfoo=blue/lib/META-INF/MANIFEST.MF | 3 + .../instances/myfoo=blue/lib/resources.jar | Bin 0 -> 921 bytes .../overlays/instances/myfoo=blue/logo.png | Bin 0 -> 2128 bytes .../webapp/WEB-INF/classes/resourceA.txt | 1 + .../webapp/WEB-INF/classes/resourceB.txt | 1 + .../instances/myfoo=blue/webapp/logo.png | Bin 0 -> 2128 bytes .../myfoo=green/WEB-INF/classes/resourceA.txt | 1 + .../myfoo=green/WEB-INF/classes/resourceB.txt | 1 + .../WEB-INF/lib-overlay/resources.jar | Bin 0 -> 925 bytes .../instances/myfoo=green/WEB-INF/overlay.xml | 16 + .../myfoo=green/WEB-INF/web-overlay.xml | 21 + .../myfoo=green/lib/META-INF/MANIFEST.MF | 3 + .../instances/myfoo=green/lib/resources.jar | Bin 0 -> 925 bytes .../overlays/instances/myfoo=green/logo.png | Bin 0 -> 11230 bytes .../webapp/WEB-INF/classes/resourceA.txt | 1 + .../webapp/WEB-INF/classes/resourceB.txt | 1 + .../instances/myfoo=green/webapp/logo.png | Bin 0 -> 11230 bytes .../myfoo=red/WEB-INF/classes/resourceA.txt | 1 + .../myfoo=red/WEB-INF/classes/resourceB.txt | 1 + .../WEB-INF/lib-overlay/resources.jar | Bin 0 -> 917 bytes .../instances/myfoo=red/WEB-INF/overlay.xml | 16 + .../myfoo=red/WEB-INF/web-overlay.xml | 21 + .../myfoo=red/lib/META-INF/MANIFEST.MF | 3 + .../instances/myfoo=red/lib/resources.jar | Bin 0 -> 917 bytes .../overlays/instances/myfoo=red/logo.png | Bin 0 -> 4499 bytes .../webapp/WEB-INF/classes/resourceA.txt | 1 + .../webapp/WEB-INF/classes/resourceB.txt | 1 + .../instances/myfoo=red/webapp/logo.png | Bin 0 -> 4499 bytes .../instances/root=root/WEB-INF/overlay.xml | 12 + .../nodes/nodeA/WEB-INF/classes/resourceA.txt | 1 + .../nodes/nodeA/WEB-INF/classes/resourceB.txt | 1 + .../nodes/nodeA/WEB-INF/classes/resourceC.txt | 1 + .../nodes/nodeA/WEB-INF/classes/resourceD.txt | 1 + .../WEB-INF/lib-overlay/nodeResources.jar | Bin 0 -> 1119 bytes .../nodes/nodeA/WEB-INF/web-overlay.xml | 19 + .../nodes/nodeA/lib/META-INF/MANIFEST.MF | 3 + .../nodes/nodeA/lib/nodeResources.jar | Bin 0 -> 1119 bytes .../WEB-INF/classes/META-INF/MANIFEST.MF | 3 + .../webapp/WEB-INF/classes/resourceA.txt | 1 + .../webapp/WEB-INF/classes/resourceB.txt | 1 + .../webapp/WEB-INF/classes/resourceC.txt | 1 + .../webapp/WEB-INF/classes/resourceD.txt | 1 + .../home/overlays/nodes/nodeB/WEB-INF/web.xml | 19 + .../myfoo=foo/WEB-INF/classes/resourceA.txt | 1 + .../myfoo=foo/WEB-INF/classes/resourceB.txt | 1 + .../myfoo=foo/WEB-INF/classes/resourceC.txt | 1 + .../myfoo=foo/WEB-INF/classes/resourceD.txt | 1 + .../myfoo=foo/WEB-INF/classes/resourceE.txt | 1 + .../myfoo=foo/WEB-INF/classes/resourceF.txt | 1 + .../templates/myfoo=foo/WEB-INF/jetty-web.xml | 6 + .../WEB-INF/lib-overlay/templateResources.jar | Bin 0 -> 1409 bytes .../templates/myfoo=foo/WEB-INF/template.xml | 18 + .../myfoo=foo/WEB-INF/web-default.xml | 482 ++++++ .../myfoo=foo/WEB-INF/web-overlay.xml | 40 + .../overlays/templates/myfoo=foo/index.html | 10 + .../overlays/templates/myfoo=foo/index.jsp | 54 + .../myfoo=foo/lib/META-INF/MANIFEST.MF | 3 + .../myfoo=foo/lib/templateResources.jar | Bin 0 -> 1409 bytes .../overlays/templates/myfoo=foo/logo.png | Bin 0 -> 2001 bytes .../webapp/WEB-INF/classes/resourceA.txt | 1 + .../webapp/WEB-INF/classes/resourceB.txt | 1 + .../webapp/WEB-INF/classes/resourceC.txt | 1 + .../webapp/WEB-INF/classes/resourceD.txt | 1 + .../webapp/WEB-INF/classes/resourceE.txt | 1 + .../webapp/WEB-INF/classes/resourceF.txt | 1 + .../templates/myfoo=foo/webapp/index.html | 10 + .../templates/myfoo=foo/webapp/index.jsp | 54 + .../templates/myfoo=foo/webapp/logo.png | Bin 0 -> 2001 bytes .../templates/root/WEB-INF/overlay.xml | 18 + .../home/overlays/templates/root/index.html | 7 + .../overlays/templates/root/webapp/index.html | 7 + .../webapps/foo/WEB-INF/classes/resourceA.txt | 1 + .../webapps/foo/WEB-INF/classes/resourceB.txt | 1 + .../webapps/foo/WEB-INF/classes/resourceC.txt | 1 + .../webapps/foo/WEB-INF/classes/resourceD.txt | 1 + .../foo/WEB-INF/lib/webappResources.jar | Bin 0 -> 901 bytes .../home/overlays/webapps/foo/WEB-INF/web.xml | 21 + .../home/overlays/webapps/foo/index.html | 2 + .../eclipse/jetty/proxy/ProxyServletTest.java | 34 +- pom.xml | 1 + 96 files changed, 3664 insertions(+), 7 deletions(-) create mode 100644 jetty-overlay-deployer/pom.xml create mode 100644 jetty-overlay-deployer/src/main/assembly/config.xml create mode 100644 jetty-overlay-deployer/src/main/config/etc/jetty-overlay.xml create mode 100644 jetty-overlay-deployer/src/main/config/overlays/instances/README.TXT create mode 100644 jetty-overlay-deployer/src/main/config/overlays/nodes/README.TXT create mode 100644 jetty-overlay-deployer/src/main/config/overlays/templates/README.TXT create mode 100644 jetty-overlay-deployer/src/main/config/overlays/webapps/README.TXT create mode 100644 jetty-overlay-deployer/src/main/java/org/eclipse/jetty/overlays/OverlayedAppProvider.java create mode 100644 jetty-overlay-deployer/src/main/java/org/eclipse/jetty/overlays/TemplateContext.java create mode 100644 jetty-overlay-deployer/src/test/java/org/eclipse/jetty/overlays/OverlayServer.java create mode 100644 jetty-overlay-deployer/src/test/java/org/eclipse/jetty/overlays/OverlayedAppProviderTest.java create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/lib-overlay/resources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/web-overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/lib/META-INF/MANIFEST.MF create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/lib/resources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/logo.png create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/logo.png create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/lib-overlay/resources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/web-overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/lib/META-INF/MANIFEST.MF create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/lib/resources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/logo.png create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/logo.png create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/lib-overlay/resources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/web-overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/lib/META-INF/MANIFEST.MF create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/lib/resources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/logo.png create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/logo.png create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/instances/root=root/WEB-INF/overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceC.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceD.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/lib-overlay/nodeResources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/web-overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/lib/META-INF/MANIFEST.MF create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/lib/nodeResources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/META-INF/MANIFEST.MF create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceC.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceD.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeB/WEB-INF/web.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceC.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceD.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceE.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceF.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/jetty-web.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/lib-overlay/templateResources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/template.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-default.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/index.html create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/index.jsp create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/lib/META-INF/MANIFEST.MF create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/lib/templateResources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/logo.png create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/WEB-INF/classes/resourceC.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/WEB-INF/classes/resourceD.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/WEB-INF/classes/resourceE.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/WEB-INF/classes/resourceF.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/index.html create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/index.jsp create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/logo.png create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/WEB-INF/overlay.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/index.html create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/webapp/index.html create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceA.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceB.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceC.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceD.txt create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/lib/webappResources.jar create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/web.xml create mode 100644 jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/index.html diff --git a/jetty-overlay-deployer/pom.xml b/jetty-overlay-deployer/pom.xml new file mode 100644 index 00000000000..8b853167ee7 --- /dev/null +++ b/jetty-overlay-deployer/pom.xml @@ -0,0 +1,63 @@ + + + org.eclipse.jetty + jetty-project + 9.0.4-SNAPSHOT + + 4.0.0 + jetty-overlay-deployer + Jetty :: Overlay Deployer + Overlayed deployer + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + + ${basedir}/src/main/assembly/config.xml + + + + + + + + + + org.eclipse.jetty + jetty-deploy + ${project.version} + + + org.eclipse.jetty + jetty-server + ${project.version} + + + org.eclipse.jetty + jetty-plus + ${project.version} + + + org.eclipse.jetty.orbit + javax.transaction + test + + + org.eclipse.jetty.toolchain + jetty-test-helper + test + + + + + diff --git a/jetty-overlay-deployer/src/main/assembly/config.xml b/jetty-overlay-deployer/src/main/assembly/config.xml new file mode 100644 index 00000000000..b9b398e630e --- /dev/null +++ b/jetty-overlay-deployer/src/main/assembly/config.xml @@ -0,0 +1,18 @@ + + + config + false + + jar + + + + src/main/config + + + etc/** + overlays/** + + + + diff --git a/jetty-overlay-deployer/src/main/config/etc/jetty-overlay.xml b/jetty-overlay-deployer/src/main/config/etc/jetty-overlay.xml new file mode 100644 index 00000000000..62317a312e1 --- /dev/null +++ b/jetty-overlay-deployer/src/main/config/etc/jetty-overlay.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + /overlays + + 1 + + + + + diff --git a/jetty-overlay-deployer/src/main/config/overlays/instances/README.TXT b/jetty-overlay-deployer/src/main/config/overlays/instances/README.TXT new file mode 100644 index 00000000000..5dda0e30496 --- /dev/null +++ b/jetty-overlay-deployer/src/main/config/overlays/instances/README.TXT @@ -0,0 +1,27 @@ + + +Cloudtide instance +=================== + +This directory contains overlays (as directories or jars) that +are define instances of templates to be deployed. + +An instance filename consists of a template name, the '=' character (or '--' string) +and then an instance identifier. For example: + + mytemplate=redInstance + +This defines a instance called redInstance using the template called mytemplate. + +An overlay is structed as a WAR, but also may contain: + * WEB-INF/lib-overlay directory, which can contain jar files made available to + the overlay.xml configuration (unlike any overlayed WEB-INF/lib jars). + + * A WEB-INF/overlay.xml file, which is an XmlConfiguration format file used to + inject the ContextHandler instance. + + * A WEB-INF/web-overlay.xml fragment that is applied as an override descriptor + + * Static content that overlays the static content of the webapp, node and template. + + * WEB-INF/classes and WEB-INF/lib that overlays the code of the webapp, node and template. diff --git a/jetty-overlay-deployer/src/main/config/overlays/nodes/README.TXT b/jetty-overlay-deployer/src/main/config/overlays/nodes/README.TXT new file mode 100644 index 00000000000..d6e8595a06b --- /dev/null +++ b/jetty-overlay-deployer/src/main/config/overlays/nodes/README.TXT @@ -0,0 +1,20 @@ + + +Cloudtide nodes +=============== + +This directory contains overlays (as directories or jars) that +are applied to all instances for a given node. + +An overlay is structed as a WAR, but also may contain: + * WEB-INF/lib-overlay directory, which can contain jar files made available to + the overlay.xml configuration (unlike any overlayed WEB-INF/lib jars). + + * A WEB-INF/overlay.xml file, which is an XmlConfiguration format file used to + inject the ContextHandler instance. + + * A WEB-INF/web-overlay.xml fragment that is applied as an override descriptor + + * Static content that overlays the static content of the webapp, node and template. + + * WEB-INF/classes and WEB-INF/lib that overlays the code of the webapp, node and template. diff --git a/jetty-overlay-deployer/src/main/config/overlays/templates/README.TXT b/jetty-overlay-deployer/src/main/config/overlays/templates/README.TXT new file mode 100644 index 00000000000..52ed0d236ed --- /dev/null +++ b/jetty-overlay-deployer/src/main/config/overlays/templates/README.TXT @@ -0,0 +1,32 @@ + +Cloudtide templates +=================== + +This directory contains overlays (as directories or jars) that +are applied to webapps to create templates. Templates are not directly +deployed, but are used by overlays in the instances directory. + +A Template filename consists of a template name, the '=' character and +then the webapp name. For example: + + mytemplate=mywebapp-1.2.3 + +This defines a template called mytemplate that overlays either the mywebapp-1.2.3.war +file or the mywebapp-1.2.3 directory in cloudtide/webapps. + +An overlay is structed as a WAR, and may contain: + * WEB-INF/template.xml a XmlConfiguration formatted file that is applied to a shared + instance of TemplateContext to provide the common classloader and resource cache to + all instances of the template. + + * WEB-INF/lib-overlay directory, which can contain jar files made available to + the overlay.xml configuration (unlike any overlayed WEB-INF/lib jars). + + * A WEB-INF/overlay.xml file, which is an XmlConfiguration format file used to + inject the ContextHandler instance. + + * A WEB-INF/web-overlay.xml fragment that is applied as an override descriptor + + * Static content that overlays the static content of the webapp, node and template. + + * WEB-INF/classes and WEB-INF/lib that overlays the code of the webapp, node and template. diff --git a/jetty-overlay-deployer/src/main/config/overlays/webapps/README.TXT b/jetty-overlay-deployer/src/main/config/overlays/webapps/README.TXT new file mode 100644 index 00000000000..f709dce94d7 --- /dev/null +++ b/jetty-overlay-deployer/src/main/config/overlays/webapps/README.TXT @@ -0,0 +1,6 @@ + +Cloudtide webapplication +------------------------ + +This directory contains webapplication directories or war files that are used by the +cloudtide templates diff --git a/jetty-overlay-deployer/src/main/java/org/eclipse/jetty/overlays/OverlayedAppProvider.java b/jetty-overlay-deployer/src/main/java/org/eclipse/jetty/overlays/OverlayedAppProvider.java new file mode 100644 index 00000000000..6dab7c401ea --- /dev/null +++ b/jetty-overlay-deployer/src/main/java/org/eclipse/jetty/overlays/OverlayedAppProvider.java @@ -0,0 +1,1523 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 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.overlays; + +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.net.URLClassLoader; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.Timer; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.regex.Pattern; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.eclipse.jetty.deploy.App; +import org.eclipse.jetty.deploy.AppProvider; +import org.eclipse.jetty.deploy.ConfigurationManager; +import org.eclipse.jetty.deploy.DeploymentManager; +import org.eclipse.jetty.jndi.java.javaRootURLContext; +import org.eclipse.jetty.jndi.local.localContextRoot; +import org.eclipse.jetty.server.ResourceCache; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.servlet.Holder; +import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.util.IO; +import org.eclipse.jetty.util.Scanner; +import org.eclipse.jetty.util.component.AbstractLifeCycle; +import org.eclipse.jetty.util.log.Logger; +import org.eclipse.jetty.util.resource.JarResource; +import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.ResourceCollection; +import org.eclipse.jetty.webapp.JettyWebXmlConfiguration; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.xml.XmlConfiguration; +import org.xml.sax.SAXException; + +/** + * Overlayed AppProvider + *

+ * This {@link AppProvider} implementation can deploy either {@link WebAppContext}s or plain + * {@link ContextHandler}s that are assembled from a series of overlays: + *

+ *
webapp
The webapp overlay is a WAR file or docroot directory. The intent is that + * the WAR should be deployed to this AppProvider unchanged from how it was delivered. All configuration + * and extension should be able to be done in an overlay.
+ *
template
A template overlay is applied to a WAR file to configure it for all instances of + * the webapp to be deployed in the server(s)
+ *
node
A node overlay is applied to a template to configure it all instances of the template + * with node specific information (eg IP address, DB servers etc.).
+ *
instance
An instance overlay is applied to a node and/or template to configure it + * for a specific instance of the template (eg per tenant configuration).
+ *
+ *

+ * Each overlays may provide the following files and subdirectories:

+ *
WEB-INF/lib-overlay
+ *
The lib-overlay directory can contain jars that are applied to a {@link URLClassLoader} that is + * available before any overlay.xml files are executed, so that classes from these jars may be used by the + * overlay.xml.
+ * + *
WEB-INF/overlay.xml
+ *
This {@link XmlConfiguration} formatted file must exist in the WEB-INF directory of an overlay and is + * used to configure a {@link ContextHandler} or {@link WebAppContext}. The overlay.xml from the template + * overlay can be used to instantiate the ContextHandler instance, so a derived class maybe used.
+ * + *
WEB-INF/template.xml
+ *
This {@link XmlConfiguration} formatted file if it exists in a template or node overlay, is applied to a shared instance of {@link TemplateContext}. + * Any ID's created in a template are available as ID's in overlay.xml for an instance.
+ * + *
WEB-INF/webdefault.xml
+ *
If present in an overlay, then the most specific version is passed to + * {@link WebAppContext#setDefaultsDescriptor(String)}. Typically this is set in the template overlay.
+ * + *
WEB-INF/web-overlay.xml
+ *
The web-overlay.xml file of an overlay is applied to a web application as + * with {@link WebAppContext#addOverrideDescriptor(String)}. This allows incremental changes to web.xml without + * totally replacing it (see webapp). Typically this is used to set init parameters.
+ * + *
.
+ *
This root directory contains static content that overlays the static content of the webapp + * or earlier overlays. Using this directory, files like index.html or logo.png can be added or replaced. It can + * also be used to replace files within WEB-INF including web.xml classes and libs.
+ *
+ *

+ * Any init parameters set on the context, filters or servlets may have parameterized values, with the parameters + * including: + *

+ *
${overlays.dir}
+ *
the root overlay scan directory as a canonical file name.
+ *
${overlay.webapp}
+ *
the webapp name, same as {@link Webapp#getName()}.
+ *
${overlay.template}
+ *
the template name, as {@link Template#getName()}.
+ *
${overlay.template.name}
+ *
the template classifier, as {@link Template#getTemplateName()}.
+ *
${overlay.template.classifier}
+ *
the template classifier, as {@link Template#getClassifier()()}.
+ *
${overlay.node}
+ *
the node name, as {@link Node#getName()}.
+ *
${overlay.instance}
+ *
the instance name, {@link Instance#getName()}.
+ *
${overlay.instance.classifier}
+ *
the instance name, {@link Instance#getClassifier()()}.
+ *
${*}
+ *
Any properties obtained via {@link #getConfigurationManager()}.{@link ConfigurationManager#getProperties()}
+ *
+ *
+ *

+ * The OverlayedAppProvider will scan the "webapps", "templates", "nodes" and "instances" subdirectories of + * the directory configured with {@link #setScanDir(File)}. New webapps and overlays and modified files within + * the overlays will trigger hot deployment, redeployment or undeployment. The scan for modified files is + * restricted to only top level files (eg overlay.xml) and the files matching WEB-INF/*.xml WEB-INF/lib/* + * and WEB-INF/classes/*. The webapps/overlays may be directory structures or war/jar archives. + *

+ * The filenames of the templates and instances are used to match them together and with a webapplication. + * A webapp may be named anyway, but it is good practise to include a version number (eg webapps/foo-1.2.3.war + * or webapps/foo-1.2.3/). A template for that webapplication must have a name that includes the template name + * and the war name separated by '=' (eg templates/myFoo=foo-1.2.3.jar or templates/myFoo=foo-1.2.3/). + * An instance overlay is named with the template name and an arbitrary instance name separated by '=' + * (eg instances/myFoo=instance1.jar instances/myFoo=instance2/ etc.). + *

+ * If a template name does not include a webapp name, then the template is created as a ContextHandler + * instead of a WebAppContext (with the exact type being determined by overlay.xml). + */ +public class OverlayedAppProvider extends AbstractLifeCycle implements AppProvider +{ + private final static Logger __log=org.eclipse.jetty.util.log.Log.getLogger("OverlayedAppProvider"); + /** + * Property set for overlay.xml and template.xml files that gives the root overlay scan directory as a canonical file name. + */ + public final static String OVERLAYS_DIR="overlays.dir"; + /** + * Property set for overlay.xml and template.xml files that gives the current webapp name, as {@link Webapp#getName()}. + */ + public final static String OVERLAY_WEBAPP="overlay.webapp"; + /** + * Property set for overlay.xml and template.xml files that gives the current template full name, as {@link Template#getName()}. + */ + public final static String OVERLAY_TEMPLATE="overlay.template"; + /** + * Property set for overlay.xml and template.xml files that gives the current template name, as {@link Template#getTemplateName()}. + */ + public final static String OVERLAY_TEMPLATE_NAME="overlay.template.name"; + /** + * Property set for overlay.xml and template.xml files that gives the current template classifier, as {@link Template#getClassifier()}. + */ + public final static String OVERLAY_TEMPLATE_CLASSIFIER="overlay.template.classifier"; + /** + * Property set for overlay.xml and template.xml files that gives the current node name, as {@link Node#getName()}. + */ + public final static String OVERLAY_NODE="overlay.node"; + /** + * Property set for overlay.xml and template.xml files that gives the current instance name, {@link Instance#getName()}. + */ + public final static String OVERLAY_INSTANCE="overlay.instance"; + /** + * Property set for overlay.xml and template.xml files that gives the current instance clasifier, {@link Instance#getClassifier()}. + */ + public final static String OVERLAY_INSTANCE_CLASSIFIER="overlay.instance.classifier"; + + public final static String WEBAPPS="webapps"; + public final static String TEMPLATES="templates"; + public final static String NODES="nodes"; + public final static String INSTANCES="instances"; + + public final static String LIB="WEB-INF/lib-overlay"; + public final static String WEBAPP="."; + public final static String OVERLAY_XML="WEB-INF/overlay.xml"; + public final static String TEMPLATE_XML="WEB-INF/template.xml"; + public final static String WEB_DEFAULT_XML="WEB-INF/web-default.xml"; + public final static String WEB_FRAGMENT_XML="WEB-INF/web-overlay.xml"; + + enum Monitor { WEBAPPS,TEMPLATES,NODES,INSTANCES} ; + + public final static List __scanPatterns = new ArrayList(); + + static + { + List regexes = new ArrayList(); + + for (String s:new String[] {".war",".jar","/WEB-INF/syslib/[^/]*","/WEB-INF/lib/[^/]*","/WEB-INF/classes/[^/]*","/WEB-INF/[^/]*\\.xml",}) + { + regexes.add(WEBAPPS+"/[^/]*"+s); + regexes.add(TEMPLATES+"/[^/]*"+s); + regexes.add(NODES+"/[^/]*"+s); + regexes.add(INSTANCES+"/[^/]*"+s); + } + + for (String s: regexes) + __scanPatterns.add(Pattern.compile(s,Pattern.CASE_INSENSITIVE)); + }; + + private String _nodeName; + private File _scanDir; + private File _tmpDir; + private String _scanDirURI; + private long _loading; + private Node _node; + private final Map _webapps = new HashMap(); + private final Map _templates = new HashMap(); + private final Map _instances = new HashMap(); + private final Map _deployed = new HashMap(); + private final Map _shared = new HashMap(); + private boolean _copydir=false; + private DeploymentManager _deploymentManager; + private ConfigurationManager _configurationManager; + private String _serverID="Server"; + private final Set _removedLayers = new HashSet(); + private Timer _sessionScavenger = new Timer(); + + private final Scanner _scanner = new Scanner(); + private final Scanner.BulkListener _listener = new Scanner.BulkListener() + { + public void filesChanged(List filenames) throws Exception + { + __log.debug("Changed {}",filenames); + + Set changes = new HashSet(); + for (String filename:filenames) + { + + File file=new File(filename); + if (file.getName().startsWith(".") || file.getName().endsWith(".swp")) + continue; + + String relname=file.toURI().getPath().substring(_scanDirURI.length()); + + File rel = new File(relname); + + String dir=null; + String name=null; + String parent=rel.getParent(); + while (parent!=null) + { + name=rel.getName(); + dir=parent; + rel=rel.getParentFile(); + parent=rel.getParent(); + } + + String uri=dir+"/"+name; + + for (Pattern p : __scanPatterns) + { + if (p.matcher(relname).matches()) + { + __log.debug("{} == {}",relname,p.pattern()); + changes.add(uri); + } + else + __log.debug("{} != {}",relname,p.pattern()); + } + } + + if (changes.size()>0) + OverlayedAppProvider.this.updateLayers(changes); + } + }; + + + /* ------------------------------------------------------------ */ + public OverlayedAppProvider() + { + try + { + _nodeName=InetAddress.getLocalHost().getHostName(); + } + catch(UnknownHostException e) + { + __log.debug(e); + _nodeName="unknown"; + } + } + + + + /* ------------------------------------------------------------ */ + public void setDeploymentManager(DeploymentManager deploymentManager) + { + _deploymentManager=deploymentManager; + } + + /* ------------------------------------------------------------ */ + public DeploymentManager getDeploymentManager() + { + return _deploymentManager; + } + + /* ------------------------------------------------------------ */ + public ConfigurationManager getConfigurationManager() + { + return _configurationManager; + } + + /* ------------------------------------------------------------ */ + /** Set the configurationManager. + * @param configurationManager the configurationManager to set + */ + public void setConfigurationManager(ConfigurationManager configurationManager) + { + _configurationManager = configurationManager; + } + + /* ------------------------------------------------------------ */ + /** + * @return The name in {@link XmlConfiguration#getIdMap()} of the {@link Server} instance. Default "Server". + */ + public String getServerID() + { + return _serverID; + } + + /* ------------------------------------------------------------ */ + /** + * @param serverID The name in {@link XmlConfiguration#getIdMap()} of the {@link Server} instance. + */ + public void setServerID(String serverID) + { + _serverID = serverID; + } + + + /** + * Create Context Handler. + *

+ * Callback from the deployment manager to create a context handler instance. + * @see org.eclipse.jetty.deploy.AppProvider#createContextHandler(org.eclipse.jetty.deploy.App) + */ + public synchronized ContextHandler createContextHandler(App app) throws Exception + { + final OverlayedApp overlayed = (OverlayedApp)app; + final String origin = overlayed.getOriginId(); + final Instance instance = overlayed.getInstance(); + final Template template = instance.getTemplate(); + final Webapp webapp = template.getWebapp(); + final Node node = _node; + + // remember the original loader + ClassLoader orig_loader = Thread.currentThread().getContextClassLoader(); + try + { + // Look for existing shared resources + String key=(node==null?"":node.getLoadedKey())+template.getLoadedKey()+(webapp==null?"":webapp.getLoadedKey()); + instance.setSharedKey(key); + + TemplateContext shared=_shared.get(key); + // Create shared resourced + if (shared==null) + shared=createTemplateContext(key,webapp,template,node,orig_loader); + + // Build the instance lib loader + ClassLoader shared_loader = shared.getWebappLoader()!=null?shared.getWebappLoader():(shared.getLibLoader()!=null?shared.getLibLoader():orig_loader); + ClassLoader loader = shared_loader; + Resource instance_lib = instance.getResource(LIB); + if (instance_lib.exists()) + { + List libs = new ArrayList(); + for (String jar :instance_lib.list()) + { + if (!jar.toLowerCase(Locale.ENGLISH).endsWith(".jar")) + continue; + libs.add(instance_lib.addPath(jar).getURL()); + } + + __log.debug("{}: libs={}",origin,libs); + loader = URLClassLoader.newInstance(libs.toArray(new URL[]{}),loader); + } + + // set the thread loader + Thread.currentThread().setContextClassLoader(loader); + + // Create properties to be shared by overlay.xmls + Map idMap = new HashMap(); + idMap.putAll(shared.getIdMap()); + idMap.put(_serverID,getDeploymentManager().getServer()); + + // Create the instance context for the template + ContextHandler context=null; + + Resource template_context_xml = template.getResource(OVERLAY_XML); + if (template_context_xml.exists()) + { + __log.debug("{}: overlay.xml={}",origin,template_context_xml); + XmlConfiguration xmlc = newXmlConfiguration(template_context_xml.getURL(),idMap,template,instance); + context=(ContextHandler)xmlc.configure(); + idMap=xmlc.getIdMap(); + } + else if (webapp==null) + // If there is no webapp, this is a plain context + context=new ContextHandler(); + else + // It is a webapp context + context=new WebAppContext(); + + // Set the resource base + final Resource instance_webapp = instance.getResource(WEBAPP); + if (instance_webapp.exists()) + { + context.setBaseResource(new ResourceCollection(instance_webapp,shared.getBaseResource())); + + // Create the resource cache + ResourceCache cache = new ResourceCache(shared.getResourceCache(),instance_webapp,context.getMimeTypes(),false,false); + context.setAttribute(ResourceCache.class.getCanonicalName(),cache); + } + else + { + context.setBaseResource(shared.getBaseResource()); + context.setAttribute(ResourceCache.class.getCanonicalName(),shared.getResourceCache()); + } + __log.debug("{}: baseResource={}",origin,context.getResourceBase()); + + // Set the shared session scavenger timer + context.setAttribute("org.eclipse.jetty.server.session.timer", _sessionScavenger); + + // Apply any node or instance overlay.xml + for (Resource context_xml : getLayeredResources(OVERLAY_XML,node,instance)) + { + __log.debug("{}: overlay.xml={}",origin,context_xml); + XmlConfiguration xmlc = newXmlConfiguration(context_xml.getURL(),idMap,template,instance); + xmlc.getIdMap().put("Cache",context.getAttribute(ResourceCache.class.getCanonicalName())); + xmlc.configure(context); + idMap=xmlc.getIdMap(); + } + + // Is it a webapp? + if (context instanceof WebAppContext) + { + final WebAppContext webappcontext = (WebAppContext)context; + + if (Arrays.asList(((WebAppContext)context).getServerClasses()).toString().equals(Arrays.asList(WebAppContext.__dftServerClasses).toString())) + { + __log.debug("clear server classes"); + webappcontext.setServerClasses(null); + } + + // set classloader + webappcontext.setCopyWebDir(false); + webappcontext.setCopyWebInf(false); + webappcontext.setExtractWAR(false); + + if (instance_webapp.exists()) + { + final Resource classes=instance_webapp.addPath("WEB-INF/classes"); + final Resource lib=instance_webapp.addPath("WEB-INF/lib"); + + if (classes.exists()||lib.exists()) + { + final AtomicBoolean locked =new AtomicBoolean(false); + + WebAppClassLoader webapp_loader=new WebAppClassLoader(loader,webappcontext) + { + @Override + public void addClassPath(Resource resource) throws IOException + { + if (!locked.get()) + super.addClassPath(resource); + } + + @Override + public void addClassPath(String classPath) throws IOException + { + if (!locked.get()) + super.addClassPath(classPath); + } + + @Override + public void addJars(Resource lib) + { + if (!locked.get()) + super.addJars(lib); + } + }; + + if (classes.exists()) + webapp_loader.addClassPath(classes); + if (lib.exists()) + webapp_loader.addJars(lib); + locked.set(true); + + loader=webapp_loader; + } + } + + // Make sure loader is unique for JNDI + if (loader==shared_loader) + loader = new URLClassLoader(new URL[]{},shared_loader); + + // add default descriptor + List webdefaults=getLayeredResources(WEB_DEFAULT_XML,instance,node,template); + if (webdefaults.size()>0) + { + Resource webdefault = webdefaults.get(0); + __log.debug("{}: defaultweb={}",origin,webdefault); + webappcontext.setDefaultsDescriptor(webdefault.toString()); + } + + // add overlay descriptors + for (Resource override : getLayeredResources(WEB_FRAGMENT_XML,template,node,instance)) + { + __log.debug("{}: web override={}",origin,override); + webappcontext.addOverrideDescriptor(override.toString()); + } + } + + context.setClassLoader(loader); + + __log.debug("{}: baseResource={}",origin,context.getBaseResource()); + + Resource jetty_web_xml = context.getResource("/WEB-INF/"+JettyWebXmlConfiguration.JETTY_WEB_XML); + if (jetty_web_xml!=null && jetty_web_xml.exists()) + context.setAttribute(JettyWebXmlConfiguration.XML_CONFIGURATION,newXmlConfiguration(jetty_web_xml.getURL(),idMap,template,instance)); + + // Add listener to expand parameters from descriptors before other listeners execute + Map params = new HashMap(); + populateParameters(params,template,instance); + context.addEventListener(new ParameterExpander(params,context)); + + System.err.println("created:\n"+context.dump()); + + return context; + } + finally + { + Thread.currentThread().setContextClassLoader(orig_loader); + } + } + + /* ------------------------------------------------------------ */ + private XmlConfiguration newXmlConfiguration(URL url, Map idMap, Template template, Instance instance) throws SAXException, IOException + { + XmlConfiguration xmlc = new XmlConfiguration(url); + populateParameters(xmlc.getProperties(),template,instance); + xmlc.getIdMap().putAll(idMap); + + return xmlc; + } + + /* ------------------------------------------------------------ */ + private void populateParameters(Map params,Template template, Instance instance) + { + try + { + params.put(OVERLAYS_DIR,_scanDir.getCanonicalPath()); + if (template!=null) + { + params.put(OVERLAY_TEMPLATE,template.getName()); + params.put(OVERLAY_TEMPLATE_NAME,template.getTemplateName()); + params.put(OVERLAY_TEMPLATE_CLASSIFIER,template.getClassifier()); + params.put(OVERLAY_WEBAPP,template.getWebapp()==null?null:template.getWebapp().getName()); + } + if (_node!=null) + params.put(OVERLAY_NODE,_node.getName()); + if (instance!=null) + { + params.put(OVERLAY_INSTANCE,instance.getName()); + params.put(OVERLAY_INSTANCE_CLASSIFIER,instance.getClassifier()); + } + if (getConfigurationManager()!=null) + params.putAll(getConfigurationManager().getProperties()); + } + catch(Exception e) + { + throw new RuntimeException(e); + } + } + + + /* ------------------------------------------------------------ */ + private TemplateContext createTemplateContext(final String key, Webapp webapp, Template template, Node node, ClassLoader parent) throws Exception + { + __log.info("created {}",key); + + // look for libs + // If we have libs directories, create classloader and make it available to + // the XMLconfiguration + List libs = new ArrayList(); + for (Resource lib : getLayeredResources(LIB,node,template)) + { + for (String jar :lib.list()) + { + if (!jar.toLowerCase(Locale.ENGLISH).endsWith(".jar")) + continue; + libs.add(lib.addPath(jar).getURL()); + } + } + final ClassLoader libLoader; + if (libs.size()>0) + { + __log.debug("{}: libs={}",key,libs); + libLoader=new URLClassLoader(libs.toArray(new URL[]{}),parent) + { + public String toString() {return "libLoader@"+Long.toHexString(hashCode())+"-lib-"+key;} + }; + + } + else + libLoader=parent; + + Thread.currentThread().setContextClassLoader(libLoader); + + + // Make the shared resourceBase + List bases = new ArrayList(); + for (Resource wa : getLayers(node,template)) + bases.add(wa); + if (webapp!=null) + bases.add(webapp.getBaseResource()); + Resource baseResource = bases.size()==1?bases.get(0):new ResourceCollection(bases.toArray(new Resource[bases.size()])); + __log.debug("{}: baseResource={}",key,baseResource); + + + // Make the shared context + TemplateContext shared = new TemplateContext(key,getDeploymentManager().getServer(),baseResource,libLoader); + _shared.put(key,shared); + + + // Create properties to be shared by overlay.xmls + Map idMap = new HashMap(); + idMap.put(_serverID,getDeploymentManager().getServer()); + + + // Create the shared context for the template + // This instance will never be start, but is used to capture the + // shared results of running the template and node overlay.xml files. + // If there is a template overlay.xml, give it the chance to create the ContextHandler instance + // otherwise create an instance ourselves + for (Resource template_xml : getLayeredResources(TEMPLATE_XML,template,node)) + { + __log.debug("{}: template.xml={}",key,template_xml); + XmlConfiguration xmlc = newXmlConfiguration(template_xml.getURL(),idMap,template,null); + xmlc.getIdMap().putAll(idMap); + xmlc.configure(shared); + idMap=xmlc.getIdMap(); + } + + shared.setIdMap(idMap); + shared.start(); + + return shared; + } + + /* ------------------------------------------------------------ */ + /** + * @return The node name (defaults to hostname) + */ + public String getNodeName() + { + return _nodeName; + } + + /* ------------------------------------------------------------ */ + /** + * @param nodeName Set the node name + */ + public void setNodeName(String nodeName) + { + _nodeName = nodeName; + } + + /* ------------------------------------------------------------ */ + /** Get the scanDir. + * @return the scanDir + */ + public File getScanDir() + { + return _scanDir; + } + + /* ------------------------------------------------------------ */ + /** Set the scanDir. + * @param scanDir the scanDir to set + */ + public void setScanDir(File scanDir) + { + _scanDir = scanDir; + } + + /* ------------------------------------------------------------ */ + /** Set the temporary directory. + * @param tmpDir the directory for temporary files. If null, then getScanDir()+"/tmp" is used if it exists, else the system default is used. + */ + public void setTmpDir(File tmpDir) + { + _tmpDir=tmpDir; + } + + /* ------------------------------------------------------------ */ + /** Get the temporary directory. + * return the tmpDir. If null, then getScanDir()+"/tmp" is used if it exists, else the system default is used. + */ + public File getTmpDir() + { + return _tmpDir; + } + + /* ------------------------------------------------------------ */ + /** + * @return The scan interval + * @see org.eclipse.jetty.util.Scanner#getScanInterval() + */ + public int getScanInterval() + { + return _scanner.getScanInterval(); + } + + /* ------------------------------------------------------------ */ + /** + * @param scanInterval The scan interval + * @see org.eclipse.jetty.util.Scanner#setScanInterval(int) + */ + public void setScanInterval(int scanInterval) + { + _scanner.setScanInterval(scanInterval); + } + + /* ------------------------------------------------------------ */ + /** + * @see org.eclipse.jetty.util.Scanner#scan() + */ + public void scan() + { + _scanner.scan(); + } + + /* ------------------------------------------------------------ */ + /** + * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart() + */ + @Override + protected void doStart() throws Exception + { + __log.info("Node={} Scan=",_nodeName,_scanDir); + if (_scanDir==null || !_scanDir.exists()) + throw new IllegalStateException("!scandir"); + + _scanDirURI=_scanDir.toURI().getPath(); + _scanner.setScanDepth(6); // enough for templates/name/webapps/WEB-INF/lib/foo.jar + List dirs = Arrays.asList(new File[] + { + new File(_scanDir,WEBAPPS), + new File(_scanDir,TEMPLATES), + new File(_scanDir,NODES), + new File(_scanDir,INSTANCES) + }); + for (File file : dirs) + { + if (!file.exists() && !file.isDirectory()) + __log.warn("No directory: "+file.getAbsolutePath()); + } + _scanner.setScanDirs(dirs); + _scanner.addListener(_listener); + _scanner.start(); + + super.doStart(); + } + + /* ------------------------------------------------------------ */ + /** + * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStop() + */ + @Override + protected void doStop() throws Exception + { + _scanner.removeListener(_listener); + _scanner.stop(); + + if (_deploymentManager.isRunning()) + { + for (App app: _deployed.values()) + _deploymentManager.removeApp(app); + } + _deployed.clear(); + + for (Layer layer : _webapps.values()) + layer.release(); + _webapps.clear(); + for (Layer layer : _templates.values()) + layer.release(); + _templates.clear(); + if (_node!=null) + _node.release(); + for (Layer layer : _instances.values()) + layer.release(); + _instances.clear(); + + super.doStop(); + } + + /* ------------------------------------------------------------ */ + protected synchronized void updateLayers(Set layerURIs) + { + _loading=System.currentTimeMillis(); + for (String ruri: layerURIs) + { + try + { + // Decompose the name + File directory; + File archive; + File origin = new File(new URI(_scanDir.toURI()+ruri)); + String name=origin.getName(); + + Monitor monitor = Monitor.valueOf(origin.getParentFile().getName().toUpperCase(Locale.ENGLISH)); + + String ext=".war"; + + // check directory vs archive + if (origin.isDirectory() || !origin.exists() && !ruri.toLowerCase(Locale.ENGLISH).endsWith(ext)) + { + // directories have priority over archives + directory=origin; + archive=new File(directory.toString()+ext); + } + else + { + // check extension name + if (!ruri.toLowerCase(Locale.ENGLISH).endsWith(ext)) + continue; + + name=name.substring(0,name.length()-4); + archive=origin; + directory=new File(new URI(_scanDir.toURI()+ruri.substring(0,ruri.length()-4))); + + // Look to see if directory exists + if (directory.exists()) + { + __log.info("Directory exists, ignoring change to {}",ruri); + continue; + } + } + + Layer layer=null; + + switch(monitor) + { + case WEBAPPS: + if (origin.exists()) + layer=loadWebapp(name,origin); + else + { + removeWebapp(name); + if (origin==directory && archive.exists()) + layer=loadWebapp(name,archive); + } + + break; + + case TEMPLATES: + if (origin.exists()) + layer=loadTemplate(name,origin); + else + { + removeTemplate(name); + if (origin==directory && archive.exists()) + layer=loadTemplate(name,archive); + } + break; + + case NODES: + if (name.equalsIgnoreCase(_nodeName)) + { + if (origin.exists()) + layer=loadNode(origin); + else + { + removeNode(); + if (origin==directory && archive.exists()) + layer=loadNode(archive); + } + } + break; + + case INSTANCES: + if (origin.exists()) + layer=loadInstance(name,origin); + else + { + removeInstance(name); + if (origin==directory && archive.exists()) + layer=loadInstance(name,archive); + } + break; + + } + + if (layer!=null) + __log.info("loaded {}",layer.getLoadedKey()); + } + catch(Exception e) + { + __log.warn(e); + } + } + + redeploy(); + + // Release removed layers + for (Layer layer : _removedLayers) + { + if (layer!=null) + { + __log.info("unload {}",layer.getLoadedKey()); + layer.release(); + } + } + _removedLayers.clear(); + + if (__log.isDebugEnabled()) + { + System.err.println("updated:"); + System.err.println("java:"+javaRootURLContext.getRoot().dump()); + System.err.println("local:"+localContextRoot.getRoot().dump()); + if (getDeploymentManager()!=null && getDeploymentManager().getServer()!=null) + System.err.println(getDeploymentManager().getServer().dump()); + } + } + + /* ------------------------------------------------------------ */ + protected File tmpdir(String name,String suffix) throws IOException + { + File dir=_tmpDir; + if (dir==null || !dir.isDirectory() || !dir.canWrite()) + { + dir=new File(_scanDir,"tmp"); + if (!dir.isDirectory() || !dir.canWrite()) + dir=null; + } + + File tmp = File.createTempFile(name+"_","."+suffix,dir); + tmp=tmp.getCanonicalFile(); + if (tmp.exists()) + IO.delete(tmp); + tmp.mkdir(); + tmp.deleteOnExit(); + return tmp; + } + + /* ------------------------------------------------------------ */ + /** + * Walks the defined webapps, templates, nodes and instances to + * determine what should be deployed, then adjust reality to match. + */ + protected void redeploy() + { + Map templates = new ConcurrentHashMap(); + + // Check for duplicate templates + for (Template template : _templates.values()) + { + Template other=templates.get(template.getTemplateName()); + if (other!=null) + { + __log.warn("Multiple Templates: {} & {}",template.getName(),other.getName()); + if (other.getName().compareToIgnoreCase(template.getName())<=0) + continue; + } + templates.put(template.getTemplateName(),template); + } + + // Match webapps to templates + for (Template template : templates.values()) + { + String webappname=template.getClassifier(); + + if (webappname==null) + continue; + + Webapp webapp = _webapps.get(webappname); + + if (webapp==null) + { + __log.warn("No webapp found for template: {}",template.getName()); + templates.remove(template.getTemplateName()); + } + else + { + template.setWebapp(webapp); + } + } + + // Match instance to templates and check if what needs to be deployed or undeployed. + Set deployed = new HashSet(); + List deploy = new ArrayList(); + + for (Instance instance : _instances.values()) + { + Template template=templates.get(instance.getTemplateName()); + instance.setTemplate(template); + if (template!=null) + { + String key=instance.getInstanceKey(); + App app = _deployed.get(key); + if (app==null) + deploy.add(instance); + else + deployed.add(key); + } + } + + // Look for deployed apps that need to be undeployed + List undeploy = new ArrayList(); + for (String key : _deployed.keySet()) + { + if (!deployed.contains(key)) + undeploy.add(key); + } + + // Do the undeploys + for (String key : undeploy) + { + App app = _deployed.remove(key); + if (app!=null) + { + __log.info("Undeploy {}",key); + _deploymentManager.removeApp(app); + } + } + + // ready the deploys + for (Instance instance : deploy) + { + String key=instance.getInstanceKey(); + OverlayedApp app = new OverlayedApp(_deploymentManager,this,key,instance); + _deployed.put(key,app); + } + + // Remove unused Shared stuff + Set sharedKeys = new HashSet(_shared.keySet()); + for (OverlayedApp app : _deployed.values()) + { + Instance instance = app.getInstance(); + sharedKeys.remove(instance.getSharedKey()); + } + for (String sharedKey: sharedKeys) + { + __log.debug("Remove "+sharedKey); + TemplateContext shared=_shared.remove(sharedKey); + if (shared!=null) + { + try + { + shared.stop(); + } + catch(Exception e) + { + __log.warn(e); + } + shared.destroy(); + } + } + + // Do the deploys + for (Instance instance : deploy) + { + String key=instance.getInstanceKey(); + OverlayedApp app = _deployed.get(key); + __log.info("Deploy {}",key); + _deploymentManager.addApp(app); + } + + + } + + /* ------------------------------------------------------------ */ + protected void removeInstance(String name) + { + _removedLayers.add(_instances.remove(name)); + } + + /* ------------------------------------------------------------ */ + protected Instance loadInstance(String name, File origin) + throws IOException + { + Instance instance=new Instance(name,origin); + _removedLayers.add(_instances.put(name,instance)); + return instance; + } + + /* ------------------------------------------------------------ */ + protected void removeNode() + { + if (_node!=null) + _removedLayers.add(_node); + _node=null; + } + + /* ------------------------------------------------------------ */ + protected Node loadNode(File origin) + throws IOException + { + if (_node!=null) + _removedLayers.add(_node); + _node=new Node(_nodeName,origin); + return _node; + } + + /* ------------------------------------------------------------ */ + protected void removeTemplate(String name) + { + _removedLayers.add(_templates.remove(name)); + } + + /* ------------------------------------------------------------ */ + protected Template loadTemplate(String name, File origin) + throws IOException + { + Template template=new Template(name,origin); + _removedLayers.add(_templates.put(name,template)); + return template; + } + + protected void removeWebapp(String name) + { + _removedLayers.add(_webapps.remove(name)); + } + + /* ------------------------------------------------------------ */ + protected Webapp loadWebapp(String name, File origin) + throws IOException + { + Webapp webapp = new Webapp(name,origin); + _removedLayers.add(_webapps.put(name,webapp)); + return webapp; + } + + /* ------------------------------------------------------------ */ + private static List getLayers(Layer... layers) + { + List resources = new ArrayList(); + for (Layer layer: layers) + { + if (layer==null) + continue; + Resource resource = layer.getBaseResource(); + if (resource.exists()) + resources.add(resource); + } + return resources; + } + + /* ------------------------------------------------------------ */ + private static List getLayeredResources(String path, Layer... layers) + { + List resources = new ArrayList(); + for (Layer layer: layers) + { + if (layer==null) + continue; + Resource resource = layer.getResource(path); + if (resource.exists()) + resources.add(resource); + } + return resources; + } + + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + class Layer + { + private final String _name; + private final File _origin; + private final long _loaded=_loading; + private final Resource _resourceBase; + private final boolean _resourceBaseIsCopy; + + public Layer(String name, File origin) + throws IOException + { + super(); + _name = name; + _origin = origin; + + Resource resource = Resource.newResource(origin.toURI()); + + if (resource.isDirectory()) + { + if (_copydir) + { + File tmp=tmpdir(name,"extract"); + __log.info("Extract {} to {}",origin,tmp); + IO.copyDir(origin,tmp); + _resourceBase=Resource.newResource(tmp.toURI()); + _resourceBaseIsCopy=true; + } + else + { + _resourceBase=resource; + _resourceBaseIsCopy=false; + } + } + else + { + Resource jar = JarResource.newJarResource(resource); + File tmp=tmpdir(name,"extract"); + __log.info("Extract {} to {}",jar,tmp); + jar.copyTo(tmp); + _resourceBase=Resource.newResource(tmp.toURI()); + _resourceBaseIsCopy=true; + } + } + + public String getName() + { + return _name; + } + + public File getOrigin() + { + return _origin; + } + + public long getLoaded() + { + return _loaded; + } + + public Resource getBaseResource() + { + return _resourceBase; + } + + public Resource getResource(String path) + { + try + { + return getBaseResource().addPath(path); + } + catch(Exception e) + { + __log.warn(e); + } + return null; + } + + public String getLoadedKey() + { + return _name+"@"+_loaded; + } + + public void release() + { + if (_resourceBaseIsCopy) + { + try + { + File file = _resourceBase.getFile(); + if (file!=null) + IO.delete(file); + } + catch(Exception e) + { + __log.warn(e); + } + } + } + + public String toString() + { + return getLoadedKey(); + } + } + + class Webapp extends Layer + { + public Webapp(String name, File origin) throws IOException + { + super(name,origin); + } + } + + class Overlay extends Layer + { + public Overlay(String name, File origin) throws IOException + { + super(name,origin); + } + + public Resource getContext() + { + return getResource(OVERLAY_XML); + } + } + + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + class Node extends Overlay + { + public Node(String name, File origin) throws IOException + { + super(name,origin); + } + } + + + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + class ClassifiedOverlay extends Overlay + { + private final String _templateName; + private final String _classifier; + + public ClassifiedOverlay(String name, File origin) throws IOException + { + super(name,origin); + + int l=1; + int e=name.indexOf('='); + if (e<0) + { + l=2; + e=name.indexOf("--"); + } + _templateName=e>=0?name.substring(0,e):name; + _classifier=e>=0?name.substring(e+l):null; + } + + public String getTemplateName() + { + return _templateName; + } + + public String getClassifier() + { + return _classifier; + } + } + + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + class Template extends ClassifiedOverlay + { + private Webapp _webapp; + + public Webapp getWebapp() + { + return _webapp; + } + + public void setWebapp(Webapp webapp) + { + _webapp = webapp; + } + + public Template(String name, File origin) throws IOException + { + super(name,origin); + } + } + + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + class Instance extends ClassifiedOverlay + { + Template _template; + String _sharedKey; + + public Instance(String name, File origin) throws IOException + { + super(name,origin); + if (getClassifier()==null) + throw new IllegalArgumentException("Instance without '=':"+name); + } + + public void setSharedKey(String key) + { + _sharedKey=key; + } + + public String getSharedKey() + { + return _sharedKey; + } + + public void setTemplate(Template template) + { + _template=template; + } + + public Template getTemplate() + { + return _template; + } + + public String getInstanceKey() + { + return + (_template.getWebapp()==null?"":_template.getWebapp().getLoadedKey())+"|"+ + _template.getLoadedKey()+"|"+ + (_node==null?"":_node.getLoadedKey())+"|"+ + getLoadedKey(); + } + } + + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + static class OverlayedApp extends App + { + final Instance _instance; + + public OverlayedApp(DeploymentManager manager, AppProvider provider, String originId, Instance instance) + { + super(manager,provider,originId); + _instance=instance; + } + + public Instance getInstance() + { + return _instance; + } + } + + + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + private final class ParameterExpander implements ServletContextListener + { + private final Map _params; + private final ContextHandler _ctx; + + private ParameterExpander(Map params, ContextHandler ctx) + { + _params = params; + _ctx = ctx; + } + + public void contextInitialized(ServletContextEvent sce) + { + Enumeration e=_ctx.getInitParameterNames(); + while (e.hasMoreElements()) + { + String name = e.nextElement(); + _ctx.setInitParameter(name,expandParameter(_ctx.getInitParameter(name))); + } + + ServletHandler servletHandler = _ctx.getChildHandlerByClass(ServletHandler.class); + if (servletHandler!=null) + { + List> holders = new ArrayList>(); + if (servletHandler.getFilters()!=null) + holders.addAll(Arrays.asList(servletHandler.getFilters())); + if (servletHandler.getHandler()!=null) + holders.addAll(Arrays.asList(servletHandler.getServlets())); + for (Holder holder: holders) + { + e=holder.getInitParameterNames(); + while (e.hasMoreElements()) + { + String name = e.nextElement(); + holder.setInitParameter(name,expandParameter(holder.getInitParameter(name))); + } + } + } + } + + private String expandParameter(String value) + { + int i=0; + while (true) + { + int open=value.indexOf("${",i); + if (open<0) + return value; + int close=value.indexOf("}",open); + if (close<0) + return value; + + String param = value.substring(open+2,close); + if (_params.containsKey(param)) + { + String tmp=value.substring(0,open)+_params.get(param); + i=tmp.length(); + value=tmp+value.substring(close+1); + } + else + i=close+1; + } + } + + public void contextDestroyed(ServletContextEvent sce) + { + } + } +} diff --git a/jetty-overlay-deployer/src/main/java/org/eclipse/jetty/overlays/TemplateContext.java b/jetty-overlay-deployer/src/main/java/org/eclipse/jetty/overlays/TemplateContext.java new file mode 100644 index 00000000000..081451c3eb5 --- /dev/null +++ b/jetty-overlay-deployer/src/main/java/org/eclipse/jetty/overlays/TemplateContext.java @@ -0,0 +1,290 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 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.overlays; + +import java.io.IOException; +import java.security.PermissionCollection; +import java.util.Map; + +import org.eclipse.jetty.http.MimeTypes; +import org.eclipse.jetty.server.ResourceCache; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.util.component.ContainerLifeCycle; +import org.eclipse.jetty.util.component.Destroyable; +import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.webapp.ClasspathPattern; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.xml.XmlConfiguration; + +/** + * A Cloudtide template context. + *

+ * This class is configured by the template.xml files and is used to control the + * shared resource cache and classloader. + *

+ * This class is an AggregateLifeCycle, so dependent beans may be added to the template and will be started, stopped and destroyed with the template. + * The template is started after the template.xml file have been applied. It is stopped and destroyed after the last instance using the template is undeployed. + */ +public class TemplateContext extends ContainerLifeCycle implements WebAppClassLoader.Context, Destroyable +{ + private final ClassLoader _libLoader; + + private final Resource _baseResource; + private final ResourceCache _resourceCache; + private final Server _server; + private final MimeTypes _mimeTypes; + private final WebAppClassLoader _webappLoader; + + private ClasspathPattern _systemClasses; + private ClasspathPattern _serverClasses; + private PermissionCollection _permissions; + + private boolean _parentLoaderPriority; + + private String _extraClasspath; + + private Map _idMap; + + + public ClassLoader getLibLoader() + { + return _libLoader; + } + + public TemplateContext() + { + _server=null; + _baseResource=null; + _mimeTypes=new MimeTypes(); + _resourceCache=null; + _webappLoader=null; + _libLoader=null; + } + + public TemplateContext(String key, Server server,Resource baseResource, ClassLoader libLoader) throws IOException + { + _server=server; + _baseResource=baseResource; + _mimeTypes=new MimeTypes(); + _resourceCache=new ResourceCache(null,baseResource,_mimeTypes,false,false); + + String[] patterns = (String[])_server.getAttribute(WebAppContext.SERVER_SRV_CLASSES); + _serverClasses=new ClasspathPattern(patterns==null?WebAppContext.__dftServerClasses:patterns); + patterns = (String[])_server.getAttribute(WebAppContext.SERVER_SYS_CLASSES); + _systemClasses=new ClasspathPattern(patterns==null?WebAppContext.__dftSystemClasses:patterns); + _libLoader=libLoader; + + + // Is this a webapp or a normal context + Resource classes=getBaseResource().addPath("WEB-INF/classes/"); + Resource lib=getBaseResource().addPath("WEB-INF/lib/"); + if (classes.exists() && classes.isDirectory() || lib.exists() && lib.isDirectory()) + { + _webappLoader=new WebAppClassLoader(_libLoader,this); + _webappLoader.setName(key); + if (classes.exists()) + _webappLoader.addClassPath(classes); + if (lib.exists()) + _webappLoader.addJars(lib); + } + else + _webappLoader=null; + + } + + /* ------------------------------------------------------------ */ + public Resource getBaseResource() + { + return _baseResource; + } + + /* ------------------------------------------------------------ */ + /** + * @return Comma or semicolon separated path of filenames or URLs + * pointing to directories or jar files. Directories should end + * with '/'. + */ + public String getExtraClasspath() + { + return _extraClasspath; + } + + /* ------------------------------------------------------------ */ + public MimeTypes getMimeTypes() + { + return _mimeTypes; + } + + + /* ------------------------------------------------------------ */ + public PermissionCollection getPermissions() + { + return _permissions; + } + + /* ------------------------------------------------------------ */ + public ResourceCache getResourceCache() + { + return _resourceCache; + } + + /* ------------------------------------------------------------ */ + public Server getServer() + { + return _server; + } + + /* ------------------------------------------------------------ */ + WebAppClassLoader getWebappLoader() + { + return _webappLoader; + } + + /* ------------------------------------------------------------ */ + public boolean isParentLoaderPriority() + { + return _parentLoaderPriority; + } + + /* ------------------------------------------------------------ */ + public boolean isServerClass(String clazz) + { + return _serverClasses.match(clazz); + } + + /* ------------------------------------------------------------ */ + public boolean isSystemClass(String clazz) + { + return _systemClasses.match(clazz); + } + + /* ------------------------------------------------------------ */ + public Resource newResource(String urlOrPath) throws IOException + { + return Resource.newResource(urlOrPath); + } + + /* ------------------------------------------------------------ */ + /** + * @param extraClasspath Comma or semicolon separated path of filenames or URLs + * pointing to directories or jar files. Directories should end + * with '/'. + */ + public void setExtraClasspath(String extraClasspath) + { + _extraClasspath=extraClasspath; + } + + /* ------------------------------------------------------------ */ + /** + * @param java2compliant The java2compliant to set. + */ + public void setParentLoaderPriority(boolean java2compliant) + { + _parentLoaderPriority = java2compliant; + } + + /* ------------------------------------------------------------ */ + /** + * @param permissions The permissions to set. + */ + public void setPermissions(PermissionCollection permissions) + { + _permissions = permissions; + } + + /* ------------------------------------------------------------ */ + /** + * Set the server classes patterns. + *

+ * Server classes/packages are classes used to implement the server and are hidden + * from the context. If the context needs to load these classes, it must have its + * own copy of them in WEB-INF/lib or WEB-INF/classes. + * A class pattern is a string of one of the forms:

+ *
org.package.Classname
Match a specific class
+ *
org.package.
Match a specific package hierarchy
+ *
-org.package.Classname
Exclude a specific class
+ *
-org.package.
Exclude a specific package hierarchy
+ *
+ * @param serverClasses The serverClasses to set. + */ + public void setServerClasses(String[] serverClasses) + { + _serverClasses = new ClasspathPattern(serverClasses); + } + + /* ------------------------------------------------------------ */ + /** + * Set the system classes patterns. + *

+ * System classes/packages are classes provided by the JVM and that + * cannot be replaced by classes of the same name from WEB-INF, + * regardless of the value of {@link #setParentLoaderPriority(boolean)}. + * A class pattern is a string of one of the forms:

+ *
org.package.Classname
Match a specific class
+ *
org.package.
Match a specific package hierarchy
+ *
-org.package.Classname
Exclude a specific class
+ *
-org.package.
Exclude a specific package hierarchy
+ *
+ * @param systemClasses The systemClasses to set. + */ + public void setSystemClasses(String[] systemClasses) + { + _systemClasses = new ClasspathPattern(systemClasses); + } + + /* ------------------------------------------------------------ */ + public void addSystemClass(String classname) + { + _systemClasses.addPattern(classname); + } + + /* ------------------------------------------------------------ */ + public void addServerClass(String classname) + { + _serverClasses.addPattern(classname); + } + + /* ------------------------------------------------------------ */ + public void destroy() + { + if (_baseResource!=null) + _baseResource.release(); + if (_resourceCache!=null) + _resourceCache.flushCache(); + if(_idMap!=null) + _idMap.clear(); + } + + /* ------------------------------------------------------------ */ + public void setIdMap(Map idMap) + { + _idMap=idMap; + } + + /* ------------------------------------------------------------ */ + public Map getIdMap() + { + return _idMap; + } + + + +} \ No newline at end of file diff --git a/jetty-overlay-deployer/src/test/java/org/eclipse/jetty/overlays/OverlayServer.java b/jetty-overlay-deployer/src/test/java/org/eclipse/jetty/overlays/OverlayServer.java new file mode 100644 index 00000000000..f7167ab7cd1 --- /dev/null +++ b/jetty-overlay-deployer/src/test/java/org/eclipse/jetty/overlays/OverlayServer.java @@ -0,0 +1,100 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 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.overlays; + +import java.io.File; + +import org.eclipse.jetty.deploy.DeploymentManager; +import org.eclipse.jetty.jndi.NamingUtil; +import org.eclipse.jetty.overlays.OverlayedAppProvider; +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.server.handler.DefaultHandler; +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.server.handler.RequestLogHandler; +import org.eclipse.jetty.server.handler.StatisticsHandler; + +public class OverlayServer +{ + public static void main(String[] args) throws Exception + { + // NamingUtil.__log.setDebugEnabled(true); + String jetty_home = System.getProperty("jetty.home","target/test-classes/home"); + System.setProperty("jetty.home",jetty_home); + + Server server = new Server(); + server.setAttribute("org.eclipse.jetty.webapp.configuration", + new String[] + { + org.eclipse.jetty.webapp.WebInfConfiguration.class.getCanonicalName(), + org.eclipse.jetty.webapp.WebXmlConfiguration.class.getCanonicalName(), + org.eclipse.jetty.webapp.MetaInfConfiguration.class.getCanonicalName(), + org.eclipse.jetty.webapp.FragmentConfiguration.class.getCanonicalName(), + org.eclipse.jetty.plus.webapp.EnvConfiguration.class.getCanonicalName(), + org.eclipse.jetty.plus.webapp.PlusConfiguration.class.getCanonicalName(), + org.eclipse.jetty.webapp.JettyWebXmlConfiguration.class.getCanonicalName(), + org.eclipse.jetty.webapp.TagLibConfiguration.class.getCanonicalName() + } + ); + + // Setup Connectors + ServerConnector connector = new ServerConnector(server); + connector.setPort(8080); + server.addConnector(connector); + + HandlerCollection handlers = new HandlerCollection(); + ContextHandlerCollection contexts = new ContextHandlerCollection(); + RequestLogHandler requestLogHandler = new RequestLogHandler(); + handlers.setHandlers(new Handler[] + { contexts, new DefaultHandler(), requestLogHandler }); + + StatisticsHandler stats = new StatisticsHandler(); + stats.setHandler(handlers); + + server.setHandler(stats); + + // Setup deployers + DeploymentManager deployer = new DeploymentManager(); + deployer.setContexts(contexts); + server.addBean(deployer); + + OverlayedAppProvider provider = new OverlayedAppProvider(); + + provider.setNodeName("nodeA"); + provider.setScanDir(new File(jetty_home + "/overlays")); + provider.setScanInterval(2); + + deployer.addAppProvider(provider); + + server.setStopAtShutdown(true); + //server.setSendServerVersion(true); + + // Uncomment to work with JNDI examples + // new org.eclipse.jetty.plus.jndi.Transaction(new com.atomikos.icatch.jta.UserTransactionImp()); + + + + + server.start(); + server.join(); + } + +} diff --git a/jetty-overlay-deployer/src/test/java/org/eclipse/jetty/overlays/OverlayedAppProviderTest.java b/jetty-overlay-deployer/src/test/java/org/eclipse/jetty/overlays/OverlayedAppProviderTest.java new file mode 100644 index 00000000000..9a5ed717935 --- /dev/null +++ b/jetty-overlay-deployer/src/test/java/org/eclipse/jetty/overlays/OverlayedAppProviderTest.java @@ -0,0 +1,589 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 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.overlays; + +import java.io.File; +import java.io.FileOutputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +import org.eclipse.jetty.util.IO; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + + +public class OverlayedAppProviderTest +{ + File _tmp; + File _scan; + File _webapps; + File _templates; + File _nodes; + File _instances; + + @Before + public void before() throws Exception + { + _tmp=File.createTempFile("OAPTest",null); + if (_tmp.exists()) + IO.delete(_tmp); + _tmp.mkdir(); + + _scan = new File(_tmp,"scan").getCanonicalFile(); + _webapps = new File(_scan,OverlayedAppProvider.WEBAPPS); + _templates = new File(_scan,OverlayedAppProvider.TEMPLATES); + _nodes = new File(_scan,OverlayedAppProvider.NODES); + _instances = new File(_scan,OverlayedAppProvider.INSTANCES); + _webapps.mkdirs(); + _templates.mkdir(); + _nodes.mkdir(); + _instances.mkdir(); + } + + @After + public void after() throws Exception + { + if (_tmp.exists()) + IO.delete(_tmp); + } + + @Test + public void testScanForWars() throws Exception + { + final ConcurrentLinkedQueue> scanned = new ConcurrentLinkedQueue>(); + OverlayedAppProvider provider = new OverlayedAppProvider() + { + /* ------------------------------------------------------------ */ + /** + * @see org.eclipse.jetty.overlays.OverlayedAppProvider#updateLayers(java.util.Set) + */ + @Override + protected void updateLayers(Set filenames) + { + scanned.offer(filenames); + } + }; + provider.setScanInterval(0); + + + provider.setScanDir(_scan); + provider.start(); + provider.scan(); + provider.scan(); + + assertTrue(scanned.isEmpty()); + + + // Check scanning for archives + File war = new File(_webapps,"foo-1.2.3.war"); + touch(war); + File template = new File(_templates,"foo=foo-1.2.3.war"); + touch(template); + File node = new File(_nodes,"nodeA.war"); + touch(node); + File instance = new File(_instances,"foo=instance.war"); + touch(instance); + + provider.scan(); + provider.scan(); + + Set results = scanned.poll(); + assertTrue(results!=null); + assertEquals(4,results.size()); + assertTrue(results.contains("webapps/foo-1.2.3.war")); + assertTrue(results.contains("templates/foo=foo-1.2.3.war")); + assertTrue(results.contains("nodes/nodeA.war")); + assertTrue(results.contains("instances/foo=instance.war")); + + provider.scan(); + provider.scan(); + assertTrue(scanned.isEmpty()); + + IO.delete(war); + IO.delete(template); + IO.delete(node); + IO.delete(instance); + + provider.scan(); + provider.scan(); + results = scanned.poll(); + assertTrue(results!=null); + assertEquals(4,results.size()); + assertTrue(results.contains("webapps/foo-1.2.3.war")); + assertTrue(results.contains("templates/foo=foo-1.2.3.war")); + assertTrue(results.contains("nodes/nodeA.war")); + assertTrue(results.contains("instances/foo=instance.war")); + + } + + @Test + public void testScanForDirs() throws Exception + { + final ConcurrentLinkedQueue> scanned = new ConcurrentLinkedQueue>(); + OverlayedAppProvider provider = new OverlayedAppProvider() + { + /* ------------------------------------------------------------ */ + /** + * @see org.eclipse.jetty.overlays.OverlayedAppProvider#updateLayers(java.util.Set) + */ + @Override + protected void updateLayers(Set filenames) + { + scanned.offer(filenames); + } + }; + provider.setScanInterval(0); + + + provider.setScanDir(_scan); + provider.start(); + provider.scan(); + + assertTrue(scanned.isEmpty()); + + + // Check scanning for directories + File war = new File(_webapps,"foo-1.2.3"); + war.mkdir(); + File template = new File(_templates,"foo=foo-1.2.3"); + template.mkdir(); + File node = new File(_nodes,"nodeA"); + node.mkdir(); + File instance = new File(_instances,"foo=instance"); + instance.mkdir(); + for (File f : new File[] { war,template,node,instance } ) + { + File webinf = new File(f,"WEB-INF"); + webinf.mkdir(); + touch(webinf,"web.xml"); + } + + provider.scan(); + provider.scan(); + + Set results = scanned.poll(); + assertTrue(results!=null); + assertEquals(4,results.size()); + assertTrue(results.contains("webapps/foo-1.2.3")); + assertTrue(results.contains("templates/foo=foo-1.2.3")); + assertTrue(results.contains("nodes/nodeA")); + assertTrue(results.contains("instances/foo=instance")); + + provider.scan(); + provider.scan(); + assertTrue(scanned.isEmpty()); + + + // Touch everything + touch(war,"WEB-INF/web.xml"); + touch(war,"WEB-INF/spring.XML"); + touch(war,"WEB-INF/other"); + touch(war,"WEB-INF/lib/bar.jar"); + touch(war,"WEB-INF/classes/bar.class"); + + for (File d : new File[]{template,node,instance}) + { + touch(d,"WEB-INF/web-fragment.xml"); + touch(d,"WEB-INF/overlay.xml"); + touch(d,"WEB-INF/other"); + touch(d,"WEB-INF/lib/bar.jar"); + } + + provider.scan(); + provider.scan(); + results = scanned.poll(); + assertTrue(results!=null); + assertEquals(4,results.size()); + assertTrue(results.contains("webapps/foo-1.2.3")); + assertTrue(results.contains("templates/foo=foo-1.2.3")); + assertTrue(results.contains("nodes/nodeA")); + assertTrue(results.contains("instances/foo=instance")); + + + // Touch xml + Thread.sleep(1000); // needed so last modified is different + for (File d : new File[]{war,template,node,instance}) + touch(d,"WEB-INF/web.xml"); + provider.scan(); + provider.scan(); + results = scanned.poll(); + assertTrue(results!=null); + assertEquals(4,results.size()); + assertTrue(results.contains("webapps/foo-1.2.3")); + assertTrue(results.contains("templates/foo=foo-1.2.3")); + assertTrue(results.contains("nodes/nodeA")); + assertTrue(results.contains("instances/foo=instance")); + + // Touch XML + Thread.sleep(1000); + for (File d : new File[]{war,template,node,instance}) + touch(d,"WEB-INF/spring.XML"); + provider.scan(); + provider.scan(); + results = scanned.poll(); + assertTrue(results!=null); + assertEquals(4,results.size()); + assertTrue(results.contains("webapps/foo-1.2.3")); + assertTrue(results.contains("templates/foo=foo-1.2.3")); + assertTrue(results.contains("nodes/nodeA")); + assertTrue(results.contains("instances/foo=instance")); + + + // Touch unrelated + for (File d : new File[]{war,template,node,instance}) + touch(d,"index.html"); + provider.scan(); + provider.scan(); + results = scanned.poll(); + assertEquals(null,results); + + // Touch jar + Thread.sleep(1000); + for (File d : new File[]{war,template,node,instance}) + touch(d,"WEB-INF/lib/bar.jar"); + provider.scan(); + provider.scan(); + results = scanned.poll(); + assertTrue(results!=null); + assertEquals(4,results.size()); + assertTrue(results.contains("webapps/foo-1.2.3")); + assertTrue(results.contains("templates/foo=foo-1.2.3")); + assertTrue(results.contains("nodes/nodeA")); + assertTrue(results.contains("instances/foo=instance")); + + // touch other class + Thread.sleep(1000); + for (File d : new File[]{war,template,node,instance}) + touch(d,"index.html"); + provider.scan(); + provider.scan(); + results = scanned.poll(); + assertTrue(scanned.isEmpty()); + + + // delete all + IO.delete(war); + IO.delete(template); + IO.delete(node); + IO.delete(instance); + + provider.scan(); + provider.scan(); + results = scanned.poll(); + assertTrue(results!=null); + assertEquals(4,results.size()); + assertTrue(results.contains("webapps/foo-1.2.3")); + assertTrue(results.contains("templates/foo=foo-1.2.3")); + assertTrue(results.contains("nodes/nodeA")); + assertTrue(results.contains("instances/foo=instance")); + + } + + + @Test + public void testTriageURI() throws Exception + { + final BlockingQueue scanned = new LinkedBlockingQueue(); + OverlayedAppProvider provider = new OverlayedAppProvider() + { + protected void removeInstance(String name) + { + scanned.add("removeInstance "+name); + } + protected Instance loadInstance(String name, File origin) + { + scanned.add("loadInstance "+name); + scanned.add(origin.getAbsolutePath()); + return null; + } + protected void removeNode() + { + scanned.add("removeNode"); + } + protected Node loadNode(File origin) + { + scanned.add("loadNode"); + scanned.add(origin.getAbsolutePath()); + return null; + } + protected void removeTemplate(String name) + { + scanned.add("removeTemplate "+name); + } + protected Template loadTemplate(String name, File origin) + { + scanned.add("loadTemplate "+name); + scanned.add(origin.getAbsolutePath()); + return null; + } + protected void removeWebapp(String name) + { + scanned.add("removeWebapp "+name); + } + protected Webapp loadWebapp(String name, File origin) + { + scanned.add("loadWebapp "+name); + scanned.add(origin.getAbsolutePath()); + return null; + } + + protected void redeploy() + { + } + + }; + provider.setScanInterval(0); + provider.setNodeName("nodeA"); + + + provider.setScanDir(_scan); + provider.start(); + provider.scan(); + + assertTrue(scanned.isEmpty()); + + // Add a war + File war = new File(_webapps,"foo-1.2.3.war"); + touch(war); + provider.scan(); + provider.scan(); + assertEquals("loadWebapp foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(war.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + + // Add a template + File template = new File(_templates,"foo=foo-1.2.3.war"); + touch(template); + provider.scan(); + provider.scan(); + assertEquals("loadTemplate foo=foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(template.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + // Add a node + File nodeA = new File(_nodes,"nodeA.war"); + touch(nodeA); + provider.scan(); + provider.scan(); + assertEquals("loadNode",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(nodeA.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + // Add another node + File nodeB = new File(_nodes,"nodeB.war"); + provider.scan(); + provider.scan(); + assertTrue(scanned.isEmpty()); + + // Add an instance + File instance = new File(_instances,"foo=instance.war"); + touch(instance); + provider.scan(); + provider.scan(); + assertEquals("loadInstance foo=instance",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(instance.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + + // Add a war dir + File warDir = new File(_webapps,"foo-1.2.3"); + warDir.mkdir(); + File warDirWI = new File(warDir,"WEB-INF"); + warDirWI.mkdir(); + touch(warDirWI,"web.xml"); + provider.scan(); + provider.scan(); + assertEquals("loadWebapp foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(warDir.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + // Add a template dir + File templateDir = new File(_templates,"foo=foo-1.2.3"); + templateDir.mkdir(); + File templateDirWI = new File(templateDir,"WEB-INF"); + templateDirWI.mkdir(); + touch(templateDirWI,"web.xml"); + provider.scan(); + provider.scan(); + assertEquals("loadTemplate foo=foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(templateDir.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + // Add a node dir + File nodeADir = new File(_nodes,"nodeA"); + nodeADir.mkdir(); + File nodeADirWI = new File(nodeADir,"WEB-INF"); + nodeADirWI.mkdir(); + touch(nodeADirWI,"web.xml"); + provider.scan(); + provider.scan(); + assertEquals("loadNode",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(nodeADir.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + // Add another node dir + File nodeBDir = new File(_nodes,"nodeB"); + nodeBDir.mkdir(); + File nodeBDirWI = new File(nodeBDir,"WEB-INF"); + nodeBDirWI.mkdir(); + touch(nodeBDirWI,"web.xml"); + provider.scan(); + provider.scan(); + assertTrue(scanned.isEmpty()); + + // Add an instance dir + File instanceDir = new File(_instances,"foo=instance"); + instanceDir.mkdir(); + File instanceDirWI = new File(instanceDir,"WEB-INF"); + instanceDirWI.mkdir(); + touch(instanceDirWI,"web.xml"); + provider.scan(); + provider.scan(); + assertEquals("loadInstance foo=instance",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(instanceDir.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + + // touch archives will be ignored. + Thread.sleep(1000); + touch(war); + touch(template); + touch(nodeA); + touch(nodeB); + touch(instance); + provider.scan(); + provider.scan(); + assertTrue(scanned.isEmpty()); + + // Touch directories + for (File d : new File[]{warDir,templateDir,nodeADir,nodeBDir,instanceDir}) + touch(d,"WEB-INF/web.xml"); + provider.scan(); + provider.scan(); + assertEquals(8,scanned.size()); + scanned.clear(); + + // Remove web dir + IO.delete(warDir); + provider.scan(); + provider.scan(); + assertEquals("removeWebapp foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals("loadWebapp foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(war.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + // Remove template dir + IO.delete(templateDir); + provider.scan(); + provider.scan(); + assertEquals("removeTemplate foo=foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals("loadTemplate foo=foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(template.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + // Remove nodeA dir + IO.delete(nodeADir); + provider.scan(); + provider.scan(); + assertEquals("removeNode",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals("loadNode",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(nodeA.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + // Remove nodeB dir + IO.delete(nodeBDir); + provider.scan(); + provider.scan(); + assertTrue(scanned.isEmpty()); + + + // Remove instance dir + IO.delete(instanceDir); + provider.scan(); + provider.scan(); + assertEquals("removeInstance foo=instance",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals("loadInstance foo=instance",scanned.poll(1,TimeUnit.SECONDS)); + assertEquals(instance.getAbsolutePath(),scanned.poll(1,TimeUnit.SECONDS)); + + // Remove web + IO.delete(war); + provider.scan(); + provider.scan(); + assertEquals("removeWebapp foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + + // Remove template + IO.delete(template); + provider.scan(); + provider.scan(); + assertEquals("removeTemplate foo=foo-1.2.3",scanned.poll(1,TimeUnit.SECONDS)); + + // Remove nodeA dir + IO.delete(nodeA); + provider.scan(); + provider.scan(); + assertEquals("removeNode",scanned.poll(1,TimeUnit.SECONDS)); + + // Remove nodeB dir + IO.delete(nodeB); + provider.scan(); + provider.scan(); + assertTrue(scanned.isEmpty()); + + // Remove instance dir + IO.delete(instance); + provider.scan(); + provider.scan(); + assertEquals("removeInstance foo=instance",scanned.poll(1,TimeUnit.SECONDS)); + + provider.scan(); + provider.scan(); + assertTrue(scanned.isEmpty()); + + } + + + private void touch(File base,String path) + { + try + { + File target = new File(new URI(base.toURI().toString()+path)); + target.getParentFile().mkdirs(); + touch(target); + } + catch (URISyntaxException e) + { + e.printStackTrace(); + } + } + + + private void touch(File file) + { + try + { + IO.delete(file); + FileOutputStream out = new FileOutputStream(file,false); + out.write("

Hello

".getBytes()); + out.close(); + } + catch(Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..9c74ff39523 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +instance myfoo=blue WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..9c74ff39523 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +instance myfoo=blue WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/lib-overlay/resources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/lib-overlay/resources.jar new file mode 100644 index 0000000000000000000000000000000000000000..a94e69bb0ea974a806898e43834bf336f9062ec1 GIT binary patch literal 921 zcmWIWW@Zs#-~d9m+EiNxB*4kQ!r%MB z$s^K|8W}9ppK1O`QxktG9xgV0$ulwSif5{?Gd~r5EMf#ZWMA~3Aa|fOAdGN`LIkQW zc!9D-sm1xFMaij-dLDN))(VOQ+zvj9q!k<`0p6@^ PApfudVJ1*g3LMG+U~j=h literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/overlay.xml new file mode 100644 index 00000000000..9d5eaea4563 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/overlay.xml @@ -0,0 +1,16 @@ + + + + + + /blue + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/web-overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/web-overlay.xml new file mode 100644 index 00000000000..8499944f90b --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/WEB-INF/web-overlay.xml @@ -0,0 +1,21 @@ + + + + Blue Test WebApp + + + overlay + instances/myfoo=blue/web.xml + + + instance + instances/myfoo=blue/web.xml + + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/lib/META-INF/MANIFEST.MF b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/lib/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..e7374eeb7dc --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/lib/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.6.0_20 (Sun Microsystems Inc.) + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/lib/resources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/lib/resources.jar new file mode 100644 index 0000000000000000000000000000000000000000..a94e69bb0ea974a806898e43834bf336f9062ec1 GIT binary patch literal 921 zcmWIWW@Zs#-~d9m+EiNxB*4kQ!r%MB z$s^K|8W}9ppK1O`QxktG9xgV0$ulwSif5{?Gd~r5EMf#ZWMA~3Aa|fOAdGN`LIkQW zc!9D-sm1xFMaij-dLDN))(VOQ+zvj9q!k<`0p6@^ PApfudVJ1*g3LMG+U~j=h literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/logo.png b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..21e0d3024a490381a6fd603b940c2ea19e627b01 GIT binary patch literal 2128 zcma)7c{Cg77Ee%HY!#}OQd_mhSUO5uJJFIB&1(^DT1y43h-NATK~#yFv39homZt5L zc1A2k&s8Sx*@N z0H{KJye>+SBo(Bhyz~W9oC^0K{-U=hppI_vm-M5A@wpri0D!=I0t7s+I4D&rV4;3z z6ed8j+8U;dSC#6dDqZZEU@YVo8XXyj1wd{`hGQd? zkTk)sz+(c&4)wX|zi!OR%IX7{%iR3MYs%)1y!LTpEvK`GQ0J}g|LZ9v_k~*G#aG4t z-XDe!=n^x5cGzD@GW=#GN3usz&pkb5q2h~<2_lCRQEMEVg!G^gDt>V6HQQk#!CP^i zPjtooV)|)Zmw+~fXSfLd_IwIcG_KQ7`qACT-58i%l;J6(EJZmjDJmV!lGD=<4eV>N@7xsHNG%v?yzw*0IQ3G0MiA;QMkC`!5 z9ECtM>ds}B#1##z*Xb(GdV4M-ADxm5#=T!%B3@D+9yy z0sat1Wgz2)Ip#CY(Rw9#aOh_lqGv;jOUbT$45OLa)f|wtWULc|lHe5XVhG1Og7+sg zPqTAI%%=sdp;L{I$}INPx`A*u8F2Q!batz6cD|*tz4bL40S?P;3N}6Fz#47ft@C`^OY?(Ij-Tfiw zW7E0noHgyOzb6fZv?k1JWj!_8D;7*_;M+Ak)d%iMn5DcY!b$U4$8Q*EeI&B9F;Q-# zfsnv+{i3tTc)9ToWO@CkO=Zbu+cpqVqvxSOT)-I;!;DS7htwp-9mcUb#Ly#jORdzT>cYu5e{9aQgUO#~lgjW(yxO6$A#;V`!8M&szSD%>3FMYVp+XVS>}rO8A13aCAbcb^8a^wF+sW6@ObHu6^KbZIBuMZ&N@g z?d?vd(&P|3qMY#O9XIXZAV{m93p{kD2`w7k zcX+`+_?uP-q1&%jj>}nDpM0}G1y%#BwJ-cKbBu}ZRJ49 zd>#&`6T>5MU39L``6G<3)n`JO;qD;IfJ~2rRqEb_*S7QYz`sfJbg`9&$TcUr_K@!wkIA!j7S&STue}OaVqsj=G8#*Z?O7&y*`j zz9yJeVBOJ_FiWpgDi3@Mvv^k z=_y9vmUXFo$qYYO8zGh?))GnJXqf!flgi5Lq_Bz7Qr-%g$Ws|y&ru`FA`q?U#)p@K zfmHXSa(Gva`mA)Fn%Xb-CQpBN;zV2Ws}f`@={BYs|G-PSOiwthTWm9b9!Y>9lYVJD ztnN^sUpO=~Bg$|!@;%5GCzpNf4Q+u&%vji2`Q-24GJ4HkD*P7y>`@i#kGeuNJLO6* zGG{XR(IyG~{mukxl6lUYB-DK16h34HYtxv@4O5-w5NMn1mimu7+a1CID{E`d>n6XS zZQ5tr#F}L0gIR&76~pDq!33aSGHxPb^>4^*c2WybIk>RWvI zcu}ozz%M6Ez39G*cI2AH6S;4I%d%k$)r(XLL`E45O;5UE-64PO8|T{{dZu B2IT+% literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..9c74ff39523 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +instance myfoo=blue WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..9c74ff39523 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +instance myfoo=blue WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/logo.png b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=blue/webapp/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..21e0d3024a490381a6fd603b940c2ea19e627b01 GIT binary patch literal 2128 zcma)7c{Cg77Ee%HY!#}OQd_mhSUO5uJJFIB&1(^DT1y43h-NATK~#yFv39homZt5L zc1A2k&s8Sx*@N z0H{KJye>+SBo(Bhyz~W9oC^0K{-U=hppI_vm-M5A@wpri0D!=I0t7s+I4D&rV4;3z z6ed8j+8U;dSC#6dDqZZEU@YVo8XXyj1wd{`hGQd? zkTk)sz+(c&4)wX|zi!OR%IX7{%iR3MYs%)1y!LTpEvK`GQ0J}g|LZ9v_k~*G#aG4t z-XDe!=n^x5cGzD@GW=#GN3usz&pkb5q2h~<2_lCRQEMEVg!G^gDt>V6HQQk#!CP^i zPjtooV)|)Zmw+~fXSfLd_IwIcG_KQ7`qACT-58i%l;J6(EJZmjDJmV!lGD=<4eV>N@7xsHNG%v?yzw*0IQ3G0MiA;QMkC`!5 z9ECtM>ds}B#1##z*Xb(GdV4M-ADxm5#=T!%B3@D+9yy z0sat1Wgz2)Ip#CY(Rw9#aOh_lqGv;jOUbT$45OLa)f|wtWULc|lHe5XVhG1Og7+sg zPqTAI%%=sdp;L{I$}INPx`A*u8F2Q!batz6cD|*tz4bL40S?P;3N}6Fz#47ft@C`^OY?(Ij-Tfiw zW7E0noHgyOzb6fZv?k1JWj!_8D;7*_;M+Ak)d%iMn5DcY!b$U4$8Q*EeI&B9F;Q-# zfsnv+{i3tTc)9ToWO@CkO=Zbu+cpqVqvxSOT)-I;!;DS7htwp-9mcUb#Ly#jORdzT>cYu5e{9aQgUO#~lgjW(yxO6$A#;V`!8M&szSD%>3FMYVp+XVS>}rO8A13aCAbcb^8a^wF+sW6@ObHu6^KbZIBuMZ&N@g z?d?vd(&P|3qMY#O9XIXZAV{m93p{kD2`w7k zcX+`+_?uP-q1&%jj>}nDpM0}G1y%#BwJ-cKbBu}ZRJ49 zd>#&`6T>5MU39L``6G<3)n`JO;qD;IfJ~2rRqEb_*S7QYz`sfJbg`9&$TcUr_K@!wkIA!j7S&STue}OaVqsj=G8#*Z?O7&y*`j zz9yJeVBOJ_FiWpgDi3@Mvv^k z=_y9vmUXFo$qYYO8zGh?))GnJXqf!flgi5Lq_Bz7Qr-%g$Ws|y&ru`FA`q?U#)p@K zfmHXSa(Gva`mA)Fn%Xb-CQpBN;zV2Ws}f`@={BYs|G-PSOiwthTWm9b9!Y>9lYVJD ztnN^sUpO=~Bg$|!@;%5GCzpNf4Q+u&%vji2`Q-24GJ4HkD*P7y>`@i#kGeuNJLO6* zGG{XR(IyG~{mukxl6lUYB-DK16h34HYtxv@4O5-w5NMn1mimu7+a1CID{E`d>n6XS zZQ5tr#F}L0gIR&76~pDq!33aSGHxPb^>4^*c2WybIk>RWvI zcu}ozz%M6Ez39G*cI2AH6S;4I%d%k$)r(XLL`E45O;5UE-64PO8|T{{dZu B2IT+% literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..4817b3f04de --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +instance myfoo=green WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..4817b3f04de --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +instance myfoo=green WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/lib-overlay/resources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/lib-overlay/resources.jar new file mode 100644 index 0000000000000000000000000000000000000000..bfce59a00ba557902d2b7f79105a59e54642e38a GIT binary patch literal 925 zcmWIWW@Zs#-~d9m+EiNxB*4kQ!r%MB z$s^K|8W}9ppK1O`QxktG9xgV0$ulwSif5{?Gd~r5EMf#ZWMA~3Aa|fOAdGN`LIkQW zc!9D-sm1xFMaij-dLO>P$oyj&8Jsy!mz?)=K8JR>FP}2u2@ + + + + + /green + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/web-overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/web-overlay.xml new file mode 100644 index 00000000000..ddda5385c62 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/WEB-INF/web-overlay.xml @@ -0,0 +1,21 @@ + + + + Green Test WebApp + + + overlay + instances/myfoo=green/web.xml + + + instance + instances/myfoo=green/web.xml + + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/lib/META-INF/MANIFEST.MF b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/lib/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..e7374eeb7dc --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/lib/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.6.0_20 (Sun Microsystems Inc.) + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/lib/resources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/lib/resources.jar new file mode 100644 index 0000000000000000000000000000000000000000..bfce59a00ba557902d2b7f79105a59e54642e38a GIT binary patch literal 925 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 Zis-IhA44|S9zJ^uP=2o=-y&-j^*>XfsSW@D literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..4817b3f04de --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +instance myfoo=green WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..4817b3f04de --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +instance myfoo=green WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/logo.png b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=green/webapp/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..67b04b96b80a36256e6365f3555fe0942da5c97f GIT binary patch literal 11230 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 Zis-IhA44|S9zJ^uP=2o=-y&-j^*>XfsSW@D literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..47d45478c5d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +instance myfoo=red WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..47d45478c5d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +instance myfoo=red WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/lib-overlay/resources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/lib-overlay/resources.jar new file mode 100644 index 0000000000000000000000000000000000000000..994a698f89908e6960d52c925a82c2255ac6b45a GIT binary patch literal 917 zcmWIWW@Zs#-~d9m+EiNxB*4kQ!r%MB z$s^K|8W}9ppK1O`QxktG9xgV0$ulwSif5{?Gd~r5EMf#ZWMA~3Aa|fOAdGN`LIkQW zc!9D-sm1xFMaij-dLHnHqCu%7z#CO7ax{Tb1p + + + + + /red + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/web-overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/web-overlay.xml new file mode 100644 index 00000000000..40927895b9c --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/WEB-INF/web-overlay.xml @@ -0,0 +1,21 @@ + + + + Red Test WebApp + + + overlay + instances/myfoo=red/web.xml + + + instance + instances/myfoo=red/web.xml + + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/lib/META-INF/MANIFEST.MF b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/lib/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..e7374eeb7dc --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/lib/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.6.0_20 (Sun Microsystems Inc.) + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/lib/resources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/lib/resources.jar new file mode 100644 index 0000000000000000000000000000000000000000..994a698f89908e6960d52c925a82c2255ac6b45a GIT binary patch literal 917 zcmWIWW@Zs#-~d9m+EiNxB*4kQ!r%MB z$s^K|8W}9ppK1O`QxktG9xgV0$ulwSif5{?Gd~r5EMf#ZWMA~3Aa|fOAdGN`LIkQW zc!9D-sm1xFMaij-dLHnHqCu%7z#CO7ax{Tb1p>P)003kN0ssI2j?}E!00001b5ch_0Itp) z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RV3j-Aq9;q*M{r~^~8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b5dcXZ`+kdvba+el4ojVGk>k&x8%7*jcjT4Rg} z(Wn@Oq6h`tA}b9jX~GiOBrZ|D{;}Hym))JYcP|L^erNvRG2h&o`Q7>Eo9{7KK}3*g z?2=NR0vTYLWPoLo0hUPySSA@@nPh-vk^zJ=x06<6x;^Gh* z3U6L9T0EC7jE)L6mLGYo;q#P+o3Y(=v@#fUB!<>5|R=Ub=+pYIz1nGr)CqxOvm&e{bGI zU7b9GqZ!~YzF=@OE66mW0sj1R1~;>UOd}d#S62o%vw}>rh?eQW0qo<$;AU2kX+#68 z(=oW26=WLG0ISsuZe|6UMl`^BJ%gKBL8cK6u!{?Wn^{4o5e=}xz~E+9kZD8%ER!sv zG!c4waQikcU&hUwIC~a%@1ngO6DB~fhl>mD+(B7>L|l z%$g%y~E%NfPZk_ZP_x3`o#kFhr-~)7bqqP-YUeM{F zR^#ihF<}DS-4Pm!$VkkbiO^7Zc|oNb697AIsx(4-^eFc2Lwh^!+!5JLB6N0Q_ih9P zNE|1m(ct7s?B0#fK0{|Gqq4U*qN9T2LubyAPDdk~?518@%J;FR2A3}*F3zDwIyz8Yjo<$sb#-Elao>K68#nOQTexxst5;**JhZe(5K}xv z;mP*U&&XiB%NZFqdC#4r=xE6n?!dBmF}1cjv~bt2r?4|SCxvq zz3GW3sIpR6uXH*pEv4nlY08xQ+V}OPB}?eV7pb;ZoV2hDaAqcBcv)H285h`SCnuUep9|yKT3WuG-JnWE z>FHEjN*x{i1Bbn*`uQ;)nVoHgv8;?-U58@^$B(DiU*{dFPDdprD5;$B!pBd-ZouaC_bLHZKL{np0V2oxTJ)Q)7rIGWMFc#G}{|b2@R#PGWIx)=!S+4 zE4s!qZX6XAS%8ArCD(xiG;W-L^M;of zB_~s2B4uY&Mh0bN(ZYo^ZJL0gPMu2SsY6w6)Pl|P0>ZE zq~HDSK6Is(CI0@jZk;WRAzp=^HOo?QudU^>Y54lm-o18SI%;mFRjY&zGBT1*pSF&1 zdAR_!S*0Sin$puLC55uHDJ_lW&!>O@QmGu;chu_sqg`R)kSKIZme7R@LIBRn60AbM z_#!El46dLcI)0q7Wf}~0{yZ&QC~T067Eyh@WmAofG;0>GLgeRXeOJ@z=*$^<@=1z_ zAa8F|{V7w(%Zs;f9v-HXace8Nxeb-5h>xd_KjsElgq4G->noMCc{AztY^B$Taelsl zN%Zofty?V@@!q|>Dt&Y`9Xe!hFW2d)ww6juY0DPcvV}@Z*;6#I6ci8_tT4kyh7>FmHz{!(%?KMP2!P!~BbV zYZp2?l#=-hd9wW-k%5Vcc==^aoXB>%UA=1h`JHzdl|4N0_~YVxB`EhUApzh>6__~D z@+C0B{QmpczaNp2yn&A2ev9MBQBz|ZV4-OZ%xr&ue@C~m#6%Pp!pVv4?llk6K4oNJ z$`tYa5tMru9LyDmYD+2v1|la16%{Bf=2n~^cMZV3}6%-I~a zWMbnY`0zva3UefIzqc3HuJKk*OM{me*AqFrl$wfHUSVqweSJ0nE-PbiU>2`GQyzZy znKbxuMr*gXwvaPZPL63WkT91ZH5K3gK2yrt0QllX#_V``S&9he z0@dsB)mIV#%xQsPN}xM;;Nc-MW^czyDnVfH|YJnTOQ7cX9P9dV2+<`|Dq0+cp6#zxq|bv}1-|fBB_= zmQz!iJEKzMd*thDsTGHXF<9>1!*70rW5@8t7lNmCAl<&rwSt*SjZw^MGy)#2(I796 zeY_q>`T2O{5doS?P>_JeLqnOWtJ0g!`hzCxt8e{esVo7r50onk&d^vp9cR4U%E{=PnHXkf;PLNaf^!9d53 z35%Drh(^fGrOHai@Y>ti4*XfOOqDNPqTpZw!8*agv}>0s%GF??rY0&Wp_mu}F|FpZ zVuf`NRZ$U}moqD(t&JzJ36gpHiKwfKwr+JOylvt{3JRjf9;1Q+>tLTc#p_x(g0yp| zun?JX<7m<(dh9X!`OoR0hiKwNkpr;^qcqd$)4Z`C%s}8BJ9r}CYyg~?$ly#&w9eSo zMQheb6Mf?9N^Wj6Zyu$lQdSmaWKddKe-@CPGBB$}tED+}M8>Q;()lmHv_3z2Jp~0Z zcyn{Pk|CISl0ASIEMRahSYY$n4GlDV_5+Ji_4l{jO3TUw2x>{n)Tz|hXLEjHW7&&` zsd&EnDovQc?#Z%cHjYWm^SGS~QBl~o&Ey>$eo9WZJVzxZAv=3m?~93#x96maj%J(K zm{z08O0EM{Zmtc0-P{LF6TknrXLmM_Y6s^c# z?B79f^e9^`f9D;0ExhptJO13yk7{acht1~a+v|i%Mfv$$nqF-!6&DX}uJAy$=x0B( zw|g0t{E(2L?S_vJBZRNHnf;zU{4g~&S>MRp+qq0G|4Wv!0r26&_JW+JOrgVv1(+s! zdT7rc`tgs4c4l2&>C`DkPrACOyquDghfuC0B(USX&FK+##x>^*xZCr2{j92ZCb_=kW#m<5)kVA_~X>jKz)5= zFi=Sed-*y$)6SjdcirwC9i5%@(MMEVOiw*UPd!D&#q`lfj-qQp*RIjaFH=kmO`a?g zU3Yg%NfCywneN@Awl>}t8J^1b-?t2fuzJqP%R^ZiI457B z!1(bXV*A2XD(u^boE-CAd?Ns03+m~CUXQvu(`{BgJ?QL&QVD|r3I$XuI5}bJR0IVf zBf~moIvviRM@b2^S~NBSfQJWCQV<`H4I3ElWHZ)rBAY0L{&e zV3PWJu3*ixXR&CJ_^bcy*jSDoLqGt_A3S==cowp%#i-S^X_LLgbNlq+hcs!DWZqnZ zfqwA|F@7rh4zW#}EDnle3t+vT_U$7dADdGU5+d?~t?Sn*J)J$p>(>itv#N@wPL((T zd{BDd*aG=C|pY?j*$6%Zs*eA8cb8TL2dovGvS=0L~kx zO!V=`l$^{p#c^?B?pUm@re~g!Kvu6>Wi`2eYyr%3SCT@(dBYUx^>px{0Mq7y1LAw$ z*vK#sGml2bv$70uzpM@qr~UhFuDON=%F7exoN(ldRHK#Zg%{Yj3l4r?V`Hhh+Li}; zYyrG@G26{zVVRmen+_eiPqj7}=-fFMit!T97!TDXvWeAssHgakTr#J)Z; zwg7Hyq&ahj@1{(1DJ+zDAnol`Q9&6Q6cS?HYVGe&1qF2eJX2d7d6p~(>BI^Atuk3oXlTWxq6iyh{_+h`O}|b{d%rzP-K9I3FfLQ6cwSR z#nCGU!opBcfZSY>R|CiZ4?ss*b;Xh;*tijiiKA}B|7QT3^{;o|#b5ry_+Fv2Gdw&H8;iATv0#Ct zmukrX4>!!lpsiDxSR~IOhZRXc?x8JWs(7w lNd{OZ8DN=YfMpU${{?9R0`h)Cw8j7c002ovPDHLkV1i3!hME8X literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..47d45478c5d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +instance myfoo=red WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..47d45478c5d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +instance myfoo=red WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/logo.png b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/myfoo=red/webapp/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a121e4a6c11cdfa3a831d0663c39d129ed6d7dfc GIT binary patch literal 4499 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 literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/instances/root=root/WEB-INF/overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/root=root/WEB-INF/overlay.xml new file mode 100644 index 00000000000..47ad8a422f4 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/instances/root=root/WEB-INF/overlay.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..170b5badf10 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +node WEB-INF lib diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..170b5badf10 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +node WEB-INF lib diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceC.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceC.txt new file mode 100644 index 00000000000..170b5badf10 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceC.txt @@ -0,0 +1 @@ +node WEB-INF lib diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceD.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceD.txt new file mode 100644 index 00000000000..170b5badf10 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/classes/resourceD.txt @@ -0,0 +1 @@ +node WEB-INF lib diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/lib-overlay/nodeResources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/lib-overlay/nodeResources.jar new file mode 100644 index 0000000000000000000000000000000000000000..61f42e6bba84d32596a39bb328f2b079b7348828 GIT binary patch literal 1119 zcmWIWW@Zs#-~htkHL11?NPv@pg~8V~#8KDN&rSc|DFy~+h5&DN4v-2asImZ@nni#r z;F^6M{XE@VgG2Ou-9G!CIql=Et9OytTUYDcne&^246YbIcv__A<*VcAd$DvC3+IfN zl1HQ^H8NPHKhyk?rY8PWJX~!0l4oMt70*;(XMQUBSi}f+$iC=5LGD0nKp5c==5SPB z@B(FvQj7CTi;`0v^-3yAPM`Mo3_Wqu=MfXwl-;#mGTcBloJ5=AL={tJs#fHv2cV!Z literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/web-overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/web-overlay.xml new file mode 100644 index 00000000000..27c9960ab99 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/WEB-INF/web-overlay.xml @@ -0,0 +1,19 @@ + + + + + overlay + nodes/nodeA/web.xml + + + node + nodes/nodeA/web.xml + + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/lib/META-INF/MANIFEST.MF b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/lib/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..e7374eeb7dc --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/lib/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.6.0_20 (Sun Microsystems Inc.) + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/lib/nodeResources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/lib/nodeResources.jar new file mode 100644 index 0000000000000000000000000000000000000000..61f42e6bba84d32596a39bb328f2b079b7348828 GIT binary patch literal 1119 zcmWIWW@Zs#-~htkHL11?NPv@pg~8V~#8KDN&rSc|DFy~+h5&DN4v-2asImZ@nni#r z;F^6M{XE@VgG2Ou-9G!CIql=Et9OytTUYDcne&^246YbIcv__A<*VcAd$DvC3+IfN zl1HQ^H8NPHKhyk?rY8PWJX~!0l4oMt70*;(XMQUBSi}f+$iC=5LGD0nKp5c==5SPB z@B(FvQj7CTi;`0v^-3yAPM`Mo3_Wqu=MfXwl-;#mGTcBloJ5=AL={tJs#fHv2cV!Z literal 0 HcmV?d00001 diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/META-INF/MANIFEST.MF b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..e7374eeb7dc --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.6.0_20 (Sun Microsystems Inc.) + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..170b5badf10 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +node WEB-INF lib diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..170b5badf10 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +node WEB-INF lib diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceC.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceC.txt new file mode 100644 index 00000000000..170b5badf10 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceC.txt @@ -0,0 +1 @@ +node WEB-INF lib diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceD.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceD.txt new file mode 100644 index 00000000000..170b5badf10 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeA/webapp/WEB-INF/classes/resourceD.txt @@ -0,0 +1 @@ +node WEB-INF lib diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeB/WEB-INF/web.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeB/WEB-INF/web.xml new file mode 100644 index 00000000000..d43dd8b52de --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/nodes/nodeB/WEB-INF/web.xml @@ -0,0 +1,19 @@ + + + + + overlay + nodes/nodeB/web.xml + + + node + nodes/nodeB/web.xml + + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..9e00184c94d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +template WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..9e00184c94d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +template WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceC.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceC.txt new file mode 100644 index 00000000000..9e00184c94d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceC.txt @@ -0,0 +1 @@ +template WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceD.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceD.txt new file mode 100644 index 00000000000..9e00184c94d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceD.txt @@ -0,0 +1 @@ +template WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceE.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceE.txt new file mode 100644 index 00000000000..9e00184c94d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceE.txt @@ -0,0 +1 @@ +template WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceF.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceF.txt new file mode 100644 index 00000000000..9e00184c94d --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/classes/resourceF.txt @@ -0,0 +1 @@ +template WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/jetty-web.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/jetty-web.xml new file mode 100644 index 00000000000..33526645e3c --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/jetty-web.xml @@ -0,0 +1,6 @@ + + + + + Executing jetty-web.xml for + \ No newline at end of file diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/lib-overlay/templateResources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/lib-overlay/templateResources.jar new file mode 100644 index 0000000000000000000000000000000000000000..4fb379cb2220dd66d34ba0b3464bb9de108ad426 GIT binary patch literal 1409 zcmWIWW@Zs#-~hslHL11?NPv@pg~8V~#8KDN&rSc|DFy~+h5&DN4v-2asImZ@nni#r z;F^6M{XE@VgG2Ou-9G!CIql=Et9OytTUYDcne&^246YbIcv__A<*VcAd$DvC3+IfN zl1HQ^H8NPHKhyk?rY8PWJX~!0l4oMt70*;(XMQUBSi}f+$iC=5LGD0nKp5eW#xPW0 z@B(FvQj7CTi;`0v^-3yAv^~%2p77N13_Wqu=MfXwB!^oM`1pb9Kx&CI$%$$vIaAFf z7pj@$N;Q+*sAiHoNhX~@OUuZqz>_GG7@0&EQ1b;W(Sz~@Du5?+P%a7ZM%9X(OhLH< z0YJG8t`#YdAe#V6&dA9VqQ#0{eqmZ& zzC+RqPN2kVwE#vPESSJ4l6b96NLs;35LqiImEn$@Ge}y&X)eH + + + + false + + true + 10000000 + 1000 + 64000000 + + + + bogus + application/bogon + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-default.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-default.xml new file mode 100644 index 00000000000..6a116536993 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-default.xml @@ -0,0 +1,482 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + + + + + + + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + aliases + false + + + acceptRanges + true + + + dirAllowed + true + + + welcomeServlets + false + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 10000000 + + + maxCachedFiles + 2048 + + + gzip + true + + + useFileMappedBuffer + true + + + resourceCache + org.eclipse.jetty.server.ResourceCache + + + 0 + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.apache.jasper.servlet.JspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + 30 + + + + + + + + + + + + + index.jsp + index.html + index.htm + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + Disable TRACE + / + TRACE + + + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-overlay.xml b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-overlay.xml new file mode 100644 index 00000000000..c03f435a740 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/WEB-INF/web-overlay.xml @@ -0,0 +1,40 @@ + + + + Templated Test WebApp + + + overlay + templates/myfoo/web.xml + + + template + templates/myfoo/web.xml + + + overlay.template + ${overlay.template} + + + overlay.template.name + ${overlay.template.name} + + + overlay.template.classifier + ${overlay.template.classifier} + + + overlay.instance.classifier + ${overlay.instance.classifier} + + + overlay.instance + ${overlay.instance} + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/index.html b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/index.html new file mode 100644 index 00000000000..afebff7ad8f --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/index.html @@ -0,0 +1,10 @@ + +

Template foo webapp

+ + +Should see index.jsp instead of this!!! + +

+Red, +Blue, +Green diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/index.jsp b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/index.jsp new file mode 100644 index 00000000000..569338d2448 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/index.jsp @@ -0,0 +1,54 @@ + +<%@page import="java.io.BufferedReader"%> +<%@page import="java.io.InputStreamReader"%> +<%@page import="java.util.Enumeration"%> +

<%=application.getServletContextName()%>

+ + +

+Red, +Blue, +Green +

+ +

Overlays

+webapp=<%=application.getInitParameter("webapp")%>
+template=<%=application.getInitParameter("template")%>
+node=<%=application.getInitParameter("node")%>
+instance=<%=application.getInitParameter("instance")%>
+ +

Init Parameters

+<% +Enumeration e=application.getInitParameterNames(); +while (e.hasMoreElements()) +{ + String name=e.nextElement().toString(); + String value=application.getInitParameter(name); + out.println(name+": "+value+"
"); +} +%> +

Attributes

+<% +e=application.getAttributeNames(); +while (e.hasMoreElements()) +{ + String name=e.nextElement().toString(); + String value=String.valueOf(application.getAttribute(name)); + out.println(name+": "+value+"
"); +} +%> +

Resources

+<% +ClassLoader loader = Thread.currentThread().getContextClassLoader(); +%> +resourceA.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceA.txt").openStream())).readLine()%>
+resourceB.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceB.txt").openStream())).readLine()%>
+resourceC.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceC.txt").openStream())).readLine()%>
+resourceD.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceD.txt").openStream())).readLine()%>
+resourceE.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceE.txt").openStream())).readLine()%>
+resourceF.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceF.txt").openStream())).readLine()%>
+resourceG.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceG.txt").openStream())).readLine()%>
+resourceH.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceH.txt").openStream())).readLine()%>
+resourceI.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceI.txt").openStream())).readLine()%>
+resourceJ.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceJ.txt").openStream())).readLine()%>
+resourceK.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceK.txt").openStream())).readLine()%>
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/lib/META-INF/MANIFEST.MF b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/lib/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..e7374eeb7dc --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/lib/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Created-By: 1.6.0_20 (Sun Microsystems Inc.) + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/lib/templateResources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/lib/templateResources.jar new file mode 100644 index 0000000000000000000000000000000000000000..4fb379cb2220dd66d34ba0b3464bb9de108ad426 GIT binary patch literal 1409 zcmWIWW@Zs#-~hslHL11?NPv@pg~8V~#8KDN&rSc|DFy~+h5&DN4v-2asImZ@nni#r z;F^6M{XE@VgG2Ou-9G!CIql=Et9OytTUYDcne&^246YbIcv__A<*VcAd$DvC3+IfN zl1HQ^H8NPHKhyk?rY8PWJX~!0l4oMt70*;(XMQUBSi}f+$iC=5LGD0nKp5eW#xPW0 z@B(FvQj7CTi;`0v^-3yAv^~%2p77N13_Wqu=MfXwB!^oM`1pb9Kx&CI$%$$vIaAFf z7pj@$N;Q+*sAiHoNhX~@OUuZqz>_GG7@0&EQ1b;W(Sz~@Du5?+P%a7ZM%9X(OhLH< z0YJG8t`#YdAe#V6&dA9VqQ#0{eqmZ& zzC+RqPN2kVwE#vPESSJ4l6b96NLs;35LqiImEn$@Ge}y&X)eH^(zW001_nvP#&v)MEeNr8;7y({sUH||D ztgS4aKzs~_FE=MRLmE(-KOo!*V*ykT$bJSFJlCz_Co!O0#D7m`ogcyt&y_U0d6=qvkTLig~}W5sBV? z;X&!yS)F#7Fg7&UDH~hz^Y!&*5bJLc`eR+1OQ>4-(9jw{IImYZ^6O-FYAR1^*PO1d zuHydoiWoqgY3JzNy0yKW9l1JXttXxP^VI=vKwVAEN@lt#vL+CfmX@X@%x#5$<+Qb( z52JcQ&5=kXO#I!_Ru9>=MhTYQ{ozBtp1wX0KnM)P=`ED8v5rwwNre7K^`9gP)d#OeN8?0_ zG~89zSx;%SQzj-RgxeM9hh^*m_ch(wn@tcPbh^27RRPU(Z6K}BqI(8GDqO%nJheuG zs=ZnSfwld^{QUgZzP`RYKmYnlZY^{H3xT|BXn+D$WOCTt8-aTn84B4}a9Fy66#o+n zMKU)x*S+bshlfm3Qj(5|NrpK*zM;VYFu!)~#TWhhp>G?2wd;5$pwAYtw0!?wm z1%#0;G%dwA?!XPq1dsoT-i)T@+o^;#eH>yk&m@?`gP=(k3IqZ{B$=)NOGgXJnS-p7@MLHM^ z#?jT4i#)|=v&g!$K`N?j_Cu4n10w{CuNbSUb@_FrThRLln1QTx z6u!K?e7-f|MAby5pq#PVI?0&2;k&`^Pty&jIBJ$n*)hqi4$s(F+LPs64Ogd|?|cg} z*p-kTGz5i0al{+R3Q}YD8}8D*d6MbGrBO|gFx0%UsR?a4f3Uj&HBU=V%LCd7+N zNE|xS3SPSQrc%?=c%zPwXm(hv%Fg$dDH_ThYbz(N(+iC@mV?0KTD%-b7dChRbqx(M zk?f%%CkR|f-qcQgY;4+3GoI!OHe*q9F<57fEwmpX8pmIz%P z{G9^;t5r9%Template foo webapp + + +Should see index.jsp instead of this!!! + +

+Red, +Blue, +Green diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/index.jsp b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/index.jsp new file mode 100644 index 00000000000..569338d2448 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/index.jsp @@ -0,0 +1,54 @@ + +<%@page import="java.io.BufferedReader"%> +<%@page import="java.io.InputStreamReader"%> +<%@page import="java.util.Enumeration"%> +

<%=application.getServletContextName()%>

+ + +

+Red, +Blue, +Green +

+ +

Overlays

+webapp=<%=application.getInitParameter("webapp")%>
+template=<%=application.getInitParameter("template")%>
+node=<%=application.getInitParameter("node")%>
+instance=<%=application.getInitParameter("instance")%>
+ +

Init Parameters

+<% +Enumeration e=application.getInitParameterNames(); +while (e.hasMoreElements()) +{ + String name=e.nextElement().toString(); + String value=application.getInitParameter(name); + out.println(name+": "+value+"
"); +} +%> +

Attributes

+<% +e=application.getAttributeNames(); +while (e.hasMoreElements()) +{ + String name=e.nextElement().toString(); + String value=String.valueOf(application.getAttribute(name)); + out.println(name+": "+value+"
"); +} +%> +

Resources

+<% +ClassLoader loader = Thread.currentThread().getContextClassLoader(); +%> +resourceA.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceA.txt").openStream())).readLine()%>
+resourceB.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceB.txt").openStream())).readLine()%>
+resourceC.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceC.txt").openStream())).readLine()%>
+resourceD.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceD.txt").openStream())).readLine()%>
+resourceE.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceE.txt").openStream())).readLine()%>
+resourceF.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceF.txt").openStream())).readLine()%>
+resourceG.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceG.txt").openStream())).readLine()%>
+resourceH.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceH.txt").openStream())).readLine()%>
+resourceI.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceI.txt").openStream())).readLine()%>
+resourceJ.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceJ.txt").openStream())).readLine()%>
+resourceK.txt=<%=new BufferedReader(new InputStreamReader(loader.getResource("resourceK.txt").openStream())).readLine()%>
diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/logo.png b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/myfoo=foo/webapp/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b633447fff53fc3da462aecd0899c2255d0f53b2 GIT binary patch literal 2001 zcmbVNc{JN=8vZ4%ec!@G3AI)%b!|;-Rk^WdEOilDQA-7-LMs%dxArP()Y_|hYpJxB ztCb0jEmZ9dMTJsJLW`od+V8J3bLNlvXU>^(zW001_nvP#&v)MEeNr8;7y({sUH||D ztgS4aKzs~_FE=MRLmE(-KOo!*V*ykT$bJSFJlCz_Co!O0#D7m`ogcyt&y_U0d6=qvkTLig~}W5sBV? z;X&!yS)F#7Fg7&UDH~hz^Y!&*5bJLc`eR+1OQ>4-(9jw{IImYZ^6O-FYAR1^*PO1d zuHydoiWoqgY3JzNy0yKW9l1JXttXxP^VI=vKwVAEN@lt#vL+CfmX@X@%x#5$<+Qb( z52JcQ&5=kXO#I!_Ru9>=MhTYQ{ozBtp1wX0KnM)P=`ED8v5rwwNre7K^`9gP)d#OeN8?0_ zG~89zSx;%SQzj-RgxeM9hh^*m_ch(wn@tcPbh^27RRPU(Z6K}BqI(8GDqO%nJheuG zs=ZnSfwld^{QUgZzP`RYKmYnlZY^{H3xT|BXn+D$WOCTt8-aTn84B4}a9Fy66#o+n zMKU)x*S+bshlfm3Qj(5|NrpK*zM;VYFu!)~#TWhhp>G?2wd;5$pwAYtw0!?wm z1%#0;G%dwA?!XPq1dsoT-i)T@+o^;#eH>yk&m@?`gP=(k3IqZ{B$=)NOGgXJnS-p7@MLHM^ z#?jT4i#)|=v&g!$K`N?j_Cu4n10w{CuNbSUb@_FrThRLln1QTx z6u!K?e7-f|MAby5pq#PVI?0&2;k&`^Pty&jIBJ$n*)hqi4$s(F+LPs64Ogd|?|cg} z*p-kTGz5i0al{+R3Q}YD8}8D*d6MbGrBO|gFx0%UsR?a4f3Uj&HBU=V%LCd7+N zNE|xS3SPSQrc%?=c%zPwXm(hv%Fg$dDH_ThYbz(N(+iC@mV?0KTD%-b7dChRbqx(M zk?f%%CkR|f-qcQgY;4+3GoI!OHe*q9F<57fEwmpX8pmIz%P z{G9^;t5r9% + + + + + / + + + + + index.html + + + max-age=3600,public + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/index.html b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/index.html new file mode 100644 index 00000000000..67ed39608fc --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/index.html @@ -0,0 +1,7 @@ + +

Cloudtide Deployer Demo

+ +

+Red, +Blue, +Green diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/webapp/index.html b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/webapp/index.html new file mode 100644 index 00000000000..67ed39608fc --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/templates/root/webapp/index.html @@ -0,0 +1,7 @@ + +

Cloudtide Deployer Demo

+ +

+Red, +Blue, +Green diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceA.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceA.txt new file mode 100644 index 00000000000..c8ca259d738 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceA.txt @@ -0,0 +1 @@ +webapp WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceB.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceB.txt new file mode 100644 index 00000000000..c8ca259d738 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceB.txt @@ -0,0 +1 @@ +webapp WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceC.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceC.txt new file mode 100644 index 00000000000..c8ca259d738 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceC.txt @@ -0,0 +1 @@ +webapp WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceD.txt b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceD.txt new file mode 100644 index 00000000000..c8ca259d738 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/classes/resourceD.txt @@ -0,0 +1 @@ +webapp WEB-INF classes diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/lib/webappResources.jar b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/WEB-INF/lib/webappResources.jar new file mode 100644 index 0000000000000000000000000000000000000000..4c450a43e304870b74178a7288129f64d35b625a GIT binary patch literal 901 zcmWIWW@Zs#-~d8_uvA+HB*4kQ!r%MB z$s^K|8W}9ppK1O`QxktG9xgV0$ulwSif5{?Gd~r5EMf#ZWMA~3Aa|fOAdGOx?@&}< z@B(FvQj7CTi;`1a^-3yAwEca(bTk4u%1bYO{Zbr!;-t?bCa`%k{kB_*0#ys6n8%D3 zD#+%!kzpPy9`oGEFpmw7c^)K~$H*kYfSL|qkqk-)r~n?Zpi~jyjj9znT0p4)0YIq> zt`#XwAe#V+KIDi11vdg512Rz}6Im-Lrf_Q&V?<~L#~ZR%P^942nueqm97V`lLE(>E a>oz2<;MfT8W@Q8UhYbibfs$ + + + Test WebApp + + + overlay + webapps/foo/WEB-INF/web.xml + + + webapp + webapps/foo-INF/web.xml + + + + + diff --git a/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/index.html b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/index.html new file mode 100644 index 00000000000..a98e28bfce9 --- /dev/null +++ b/jetty-overlay-deployer/src/test/resources/home/overlays/webapps/foo/index.html @@ -0,0 +1,2 @@ + +

foo webapp

diff --git a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java index c16cbba984a..301543cc39f 100644 --- a/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java +++ b/jetty-proxy/src/test/java/org/eclipse/jetty/proxy/ProxyServletTest.java @@ -68,6 +68,7 @@ import org.eclipse.jetty.toolchain.test.annotation.Slow; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.StdErrLog; +import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.hamcrest.Matchers; import org.junit.After; import org.junit.Assert; @@ -233,6 +234,17 @@ public class ProxyServletTest public void testProxyWithResponseContent() throws Exception { prepareProxy(new ProxyServlet()); + + HttpClient result = new HttpClient(); + result.setProxyConfiguration(new ProxyConfiguration("localhost", proxyConnector.getLocalPort())); + QueuedThreadPool threadPool = new QueuedThreadPool(); + threadPool.setName("foo"); + threadPool.setMaxThreads(2); + result.setExecutor(threadPool); + result.start(); + + ContentResponse[] responses = new ContentResponse[10]; + final byte[] content = new byte[1024]; Arrays.fill(content, (byte)'A'); prepareServer(new HttpServlet() @@ -246,14 +258,22 @@ public class ProxyServletTest } }); - // Request is for the target server - ContentResponse response = client.newRequest("localhost", serverConnector.getLocalPort()) - .timeout(5, TimeUnit.SECONDS) - .send(); + for ( int i = 0; i < 10; ++i ) + { + // Request is for the target server + responses[i] = result.newRequest("localhost", serverConnector.getLocalPort()) + .timeout(5, TimeUnit.SECONDS) + .send(); + } + + + for ( int i = 0; i < 10; ++i ) + { - Assert.assertEquals(200, response.getStatus()); - Assert.assertTrue(response.getHeaders().containsKey(PROXIED_HEADER)); - Assert.assertArrayEquals(content, response.getContent()); + Assert.assertEquals(200, responses[i].getStatus()); + Assert.assertTrue(responses[i].getHeaders().containsKey(PROXIED_HEADER)); + Assert.assertArrayEquals(content, responses[i].getContent()); + } } @Test diff --git a/pom.xml b/pom.xml index 11ebfc3f212..0396e000489 100644 --- a/pom.xml +++ b/pom.xml @@ -456,6 +456,7 @@ jetty-rhttp jetty-http-spi --> + jetty-overlay-deployer