1 //
2 // ========================================================================
3 // Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
8 //
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
11 //
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
14 //
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
17 //
18
19
20 package org.eclipse.jetty.maven.plugin;
21
22 import java.io.File;
23 import java.io.IOException;
24
25 import org.apache.maven.plugin.MojoExecutionException;
26 import org.apache.maven.plugin.MojoFailureException;
27 import org.eclipse.jetty.annotations.AnnotationConfiguration;
28 import org.eclipse.jetty.util.IO;
29 import org.eclipse.jetty.util.resource.Resource;
30 import org.eclipse.jetty.util.thread.QueuedThreadPool;
31
32 /**
33 * JettyEffectiveWebXml
34 *
35 * @goal effective-web-xml
36 * @requiresDependencyResolution test
37 * @execute phase="test-compile"
38 * @description Runs jetty on the unassembled webapp to generate the effective web.xml
39 */
40 public class JettyEffectiveWebXml extends JettyRunMojo
41 {
42 /**
43 * The target directory
44 *
45 * @parameter expression="${project.build.directory}"
46 * @required
47 * @readonly
48 */
49 protected File target;
50
51 /**
52 * The target directory
53 *
54 * @parameter
55 */
56 protected File effectiveWebXml;
57
58
59 protected boolean deleteOnExit = true;
60
61
62 /**
63 * @see org.apache.maven.plugin.Mojo#execute()
64 */
65 public void execute() throws MojoExecutionException, MojoFailureException
66 {
67 super.execute();
68 }
69
70
71 @Override
72 public void startJetty() throws MojoExecutionException
73 {
74 //Only do enough setup to be able to produce a quickstart-web.xml file to
75 //pass onto the forked process to run
76
77 //if the user didn't nominate a file to generate into, pick the name and
78 //make sure that it is deleted on exit
79 if (effectiveWebXml == null)
80 {
81 deleteOnExit = true;
82 effectiveWebXml = new File(target, "effective-web.xml");
83 effectiveWebXml.deleteOnExit();
84 }
85
86 Resource descriptor = Resource.newResource(effectiveWebXml);
87
88 QueuedThreadPool tpool = null;
89
90 try
91 {
92 printSystemProperties();
93
94 //apply any config from a jetty.xml file first to our "fake" server instance
95 //TODO probably not necessary
96 applyJettyXml ();
97
98
99 server.configureHandlers();
100
101 //ensure config of the webapp based on settings in plugin
102 configureWebApplication();
103
104
105 //set the webapp up to do very little other than generate the quickstart-web.xml
106 webApp.setCopyWebDir(false);
107 webApp.setCopyWebInf(false);
108 webApp.setGenerateQuickStart(true);
109
110 if (!effectiveWebXml.getParentFile().exists())
111 effectiveWebXml.getParentFile().mkdirs();
112 if (!effectiveWebXml.exists())
113 effectiveWebXml.createNewFile();
114
115 webApp.setQuickStartWebDescriptor(descriptor);
116
117 server.addWebApplication(webApp);
118
119 //if our server has a thread pool associated we can do any annotation scanning multithreaded,
120 //otherwise scanning will be single threaded
121 tpool = server.getBean(QueuedThreadPool.class);
122 if (tpool != null)
123 tpool.start();
124 else
125 webApp.setAttribute(AnnotationConfiguration.MULTI_THREADED, Boolean.FALSE.toString());
126
127 webApp.start(); //just enough to generate the quickstart
128
129 }
130 catch (Exception e)
131 {
132 throw new MojoExecutionException("Effective web.xml generation failed", e);
133 }
134 finally
135 {
136 try {webApp.stop();}catch (Exception x) {};
137
138 try {if (tpool != null) tpool.stop();} catch (Exception x) {};
139 }
140
141
142 if (deleteOnExit)
143 {
144 try
145 {
146 //just show the result in the log
147 getLog().info(IO.toString(descriptor.getInputStream()));
148 }
149 catch (IOException e)
150 {
151 throw new MojoExecutionException("Unable to output effective web.xml", e);
152 }
153
154 }
155
156 }
157 }