1 package org.apache.maven.plugins.site.deploy;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Map;
23 import org.apache.commons.lang3.StringUtils;
24 import org.apache.maven.model.Build;
25 import org.apache.maven.model.Plugin;
26 import org.apache.maven.model.PluginManagement;
27 import org.apache.maven.model.Site;
28 import org.apache.maven.plugin.MojoExecutionException;
29 import org.apache.maven.plugins.annotations.Mojo;
30 import org.apache.maven.plugins.annotations.Parameter;
31 import org.apache.maven.plugins.annotations.ResolutionScope;
32 import org.apache.maven.project.MavenProject;
33 import org.codehaus.plexus.util.xml.Xpp3Dom;
34
35
36
37
38
39
40
41
42
43
44 @Mojo( name = "stage-deploy", requiresDependencyResolution = ResolutionScope.TEST )
45 public class SiteStageDeployMojo
46 extends AbstractStagingMojo
47 {
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 @Parameter( property = "stagingSiteURL" )
66 private String stagingSiteURL;
67
68
69
70
71
72
73
74
75
76
77
78
79
80 @Parameter( property = "stagingRepositoryId" )
81 private String stagingRepositoryId;
82
83 @Override
84 protected boolean isDeploy()
85 {
86 return true;
87 }
88
89
90
91
92
93 @Override
94 protected String determineTopDistributionManagementSiteUrl()
95 throws MojoExecutionException
96 {
97 if ( StringUtils.isNotEmpty( topSiteURL ) )
98 {
99 getLog().debug( "stage-deploy top distributionManagement.site.url configured with topSiteURL parameter: "
100 + topSiteURL );
101 return topSiteURL;
102 }
103
104 if ( StringUtils.isNotEmpty( stagingSiteURL ) )
105 {
106
107 MavenProject topProject = getTopMostParentWithSameStagingSiteURL();
108 String url = getSite( topProject ).getUrl();
109 getLog().debug( "stage-deploy top stagingSiteURL found in " + topProject.getId() + " with value: " + url );
110 return url;
111 }
112
113 return super.determineTopDistributionManagementSiteUrl();
114 }
115
116 @Override
117 protected Site determineDeploySite()
118 throws MojoExecutionException
119 {
120 Site top = new Site();
121
122 top.setId( stagingRepoId() );
123 getLog().info( "Using this server ID for stage deploy: " + top.getId() );
124
125 String stagingURL = determineStageDeploySiteURL();
126 getLog().info( "Using this base URL for stage deploy: " + stagingURL );
127
128 top.setUrl( stagingURL );
129
130 return top;
131 }
132
133
134
135
136
137
138
139
140
141
142
143
144 private MavenProject getTopMostParentWithSameStagingSiteURL()
145 {
146 MavenProject current = project;
147 MavenProject parent;
148
149
150 while (
151 ( parent = siteTool.getParentProject( current, reactorProjects, localRepository ) ) != null
152 && stagingSiteURL.equals( getStagingSiteURL( parent ) ) )
153 {
154 current = parent;
155 }
156
157
158 return current;
159 }
160
161
162
163
164
165
166
167
168 private String getStagingSiteURL( MavenProject project )
169 {
170 final String sitePluginKey = "org.apache.maven.plugins:maven-site-plugin";
171
172 if ( project == null )
173 {
174 return null;
175 }
176
177 final Build build = project.getBuild();
178 if ( build == null )
179 {
180 return null;
181 }
182
183 Map<String, Plugin> plugins = build.getPluginsAsMap();
184
185 Plugin sitePlugin = plugins.get( sitePluginKey );
186 if ( sitePlugin == null )
187 {
188 final PluginManagement buildPluginManagement = build.getPluginManagement();
189 if ( buildPluginManagement == null )
190 {
191 return null;
192 }
193
194 plugins = buildPluginManagement.getPluginsAsMap();
195 sitePlugin = plugins.get( sitePluginKey );
196 }
197
198 if ( sitePlugin == null )
199 {
200 return null;
201 }
202
203 final Xpp3Dom sitePluginConfiguration = (Xpp3Dom) sitePlugin.getConfiguration();
204 if ( sitePluginConfiguration == null )
205 {
206 return null;
207 }
208
209 final Xpp3Dom child = sitePluginConfiguration.getChild( "stagingSiteURL" );
210 if ( child == null )
211 {
212 return null;
213 }
214 else
215 {
216 return child.getValue();
217 }
218 }
219
220
221
222
223
224
225 private String determineStageDeploySiteURL()
226 throws MojoExecutionException
227 {
228 if ( stagingSiteURL != null )
229 {
230
231 getLog().debug( "stagingSiteURL specified by the user: " + stagingSiteURL );
232 return stagingSiteURL;
233 }
234
235
236 String defaultStagingSiteURL = appendSlash( getTopDistributionManagementSiteUrl() ) + DEFAULT_STAGING_DIRECTORY;
237 getLog().debug( "stagingSiteURL NOT specified, using the top level project: " + defaultStagingSiteURL );
238
239 return defaultStagingSiteURL;
240 }
241
242 private String stagingRepoId()
243 {
244 if ( stagingRepositoryId != null )
245 {
246 return stagingRepositoryId;
247 }
248
249 try
250 {
251 return getSite( project ).getId();
252 }
253 catch ( MojoExecutionException ex )
254 {
255 return "stagingSite";
256 }
257 }
258 }