View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2014 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 }