1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.site.run;
20
21 import java.io.File;
22 import java.io.FileOutputStream;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.net.InetSocketAddress;
26 import java.util.HashMap;
27 import java.util.List;
28 import java.util.Locale;
29 import java.util.Map;
30
31 import org.apache.maven.doxia.siterenderer.DocumentRenderer;
32 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
33 import org.apache.maven.doxia.tools.SiteTool;
34 import org.apache.maven.plugin.MojoExecutionException;
35 import org.apache.maven.plugin.MojoFailureException;
36 import org.apache.maven.plugins.annotations.Mojo;
37 import org.apache.maven.plugins.annotations.Parameter;
38 import org.apache.maven.plugins.annotations.ResolutionScope;
39 import org.apache.maven.plugins.site.render.AbstractSiteRenderingMojo;
40 import org.apache.maven.reporting.exec.MavenReportExecution;
41 import org.codehaus.plexus.util.IOUtil;
42 import org.eclipse.jetty.server.Server;
43 import org.eclipse.jetty.webapp.WebAppContext;
44
45 import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
46
47
48
49
50
51
52
53
54 @Mojo(name = "run", requiresDependencyResolution = ResolutionScope.TEST, requiresReports = true)
55 public class SiteRunMojo extends AbstractSiteRenderingMojo {
56
57
58
59 @Parameter(defaultValue = "${project.build.directory}/site-webapp")
60 private File tempWebappDirectory;
61
62
63
64
65 @Parameter(property = "host", defaultValue = "localhost")
66 private String host;
67
68
69
70
71 @Parameter(property = "port", defaultValue = "8080")
72 private int port;
73
74
75
76
77 public void execute() throws MojoExecutionException, MojoFailureException {
78 checkInputEncoding();
79
80 Server server = new Server(InetSocketAddress.createUnresolved(host, port));
81 server.setStopAtShutdown(true);
82
83 WebAppContext webapp = createWebApplication();
84 webapp.setServer(server);
85
86 server.setHandler(webapp);
87
88 try {
89 server.start();
90 } catch (Exception e) {
91 throw new MojoExecutionException("Error executing Jetty", e);
92 }
93
94 getLog().info(buffer().a("Started Jetty on ").strong(server.getURI()).toString());
95
96
97 try {
98 server.getThreadPool().join();
99 } catch (InterruptedException e) {
100 getLog().warn("Jetty was interrupted", e);
101 }
102 }
103
104 private WebAppContext createWebApplication() throws MojoExecutionException {
105 File webXml = new File(tempWebappDirectory, "WEB-INF/web.xml");
106 webXml.getParentFile().mkdirs();
107
108 try (InputStream inStream = getClass().getResourceAsStream("/run/web.xml");
109 FileOutputStream outStream = new FileOutputStream(webXml)) {
110 IOUtil.copy(inStream, outStream);
111 } catch (IOException e) {
112 throw new MojoExecutionException("Unable to construct temporary webapp for running site", e);
113 }
114
115 WebAppContext webapp = new WebAppContext();
116 webapp.setContextPath("/");
117 webapp.setResourceBase(tempWebappDirectory.getAbsolutePath());
118 webapp.setAttribute(DoxiaFilter.OUTPUT_DIRECTORY_KEY, tempWebappDirectory);
119 webapp.setAttribute(DoxiaFilter.SITE_RENDERER_KEY, siteRenderer);
120 webapp.getInitParams().put("org.mortbay.jetty.servlet.Default.useFileMappedBuffer", "false");
121
122
123 project.getReporting().setOutputDirectory(tempWebappDirectory.getAbsolutePath());
124 for (MavenReportExecution mavenReportExecution : getReports()) {
125 mavenReportExecution.getMavenReport().setReportOutputDirectory(tempWebappDirectory);
126 }
127
128 List<MavenReportExecution> reports =
129 getReports();
130
131 List<Locale> localesList = getLocales();
132 webapp.setAttribute(DoxiaFilter.LOCALES_LIST_KEY, localesList);
133
134 try {
135 Map<String, DoxiaBean> i18nDoxiaContexts = new HashMap<>();
136
137 for (Locale locale : localesList) {
138 SiteRenderingContext i18nContext = createSiteRenderingContext(locale);
139 i18nContext.setInputEncoding(getInputEncoding());
140 i18nContext.setOutputEncoding(getOutputEncoding());
141
142 SiteRenderingContext i18nGeneratedSiteContext = createSiteRenderingContext(locale);
143 i18nGeneratedSiteContext.setInputEncoding(getInputEncoding());
144 i18nGeneratedSiteContext.setOutputEncoding(getOutputEncoding());
145 i18nGeneratedSiteContext.getSiteDirectories().clear();
146
147 Map<String, DocumentRenderer> i18nDocuments = locateDocuments(i18nContext, reports, locale);
148 if (!locale.equals(SiteTool.DEFAULT_LOCALE)) {
149 i18nGeneratedSiteContext.addSiteDirectory(new File(generatedSiteDirectory, locale.toString()));
150 } else {
151 i18nGeneratedSiteContext.addSiteDirectory(generatedSiteDirectory);
152 }
153 DoxiaBean doxiaBean = new DoxiaBean(i18nContext, i18nDocuments, i18nGeneratedSiteContext);
154
155 if (!locale.equals(SiteTool.DEFAULT_LOCALE)) {
156 i18nDoxiaContexts.put(locale.toString(), doxiaBean);
157 } else {
158 i18nDoxiaContexts.put("default", doxiaBean);
159 }
160
161 if (!locale.equals(SiteTool.DEFAULT_LOCALE)) {
162 siteRenderer.copyResources(i18nContext, new File(tempWebappDirectory, locale.toString()));
163 } else {
164 siteRenderer.copyResources(i18nContext, tempWebappDirectory);
165 }
166 }
167
168 webapp.setAttribute(DoxiaFilter.I18N_DOXIA_CONTEXTS_KEY, i18nDoxiaContexts);
169 } catch (Exception e) {
170 throw new MojoExecutionException("Unable to set up webapp", e);
171 }
172 return webapp;
173 }
174
175 public void setTempWebappDirectory(File tempWebappDirectory) {
176 this.tempWebappDirectory = tempWebappDirectory;
177 }
178
179 public void setPort(int port) {
180 this.port = port;
181 }
182 }