1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.release.plugin.mojos;
18
19 import java.io.File;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.io.OutputStream;
23 import java.nio.file.Files;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.zip.ZipEntry;
27 import java.util.zip.ZipOutputStream;
28
29 import org.apache.commons.io.IOUtils;
30 import org.apache.commons.lang3.StringUtils;
31 import org.apache.maven.plugin.AbstractMojo;
32 import org.apache.maven.plugin.MojoExecutionException;
33 import org.apache.maven.plugin.MojoFailureException;
34 import org.apache.maven.plugins.annotations.LifecyclePhase;
35 import org.apache.maven.plugins.annotations.Mojo;
36 import org.apache.maven.plugins.annotations.Parameter;
37
38 /**
39 * Takes the built <code>./target/site</code> directory and compresses it to
40 * <code>./target/commons-release-plugin/site.zip</code>.
41 *
42 * @since 1.0
43 * @deprecated - as we no longer wish to compress the site, we are going to put this functionality in the
44 * {@link CommonsDistributionStagingMojo}.
45 */
46 @Deprecated
47 @Mojo(name = "compress-site",
48 defaultPhase = LifecyclePhase.POST_SITE,
49 threadSafe = true,
50 aggregator = true)
51 public class CommonsSiteCompressionMojo extends AbstractMojo {
52
53 /**
54 * The working directory for the plugin which, assuming the maven uses the default
55 * <code>${project.build.directory}</code>, this becomes <code>target/commons-release-plugin</code>.
56 */
57 @Parameter(defaultValue = "${project.build.directory}/commons-release-plugin",
58 property = "commons.outputDirectory")
59 private File workingDirectory;
60
61 /**
62 * The site output directory.
63 */
64 @Parameter(defaultValue = "${project.build.directory}/site", property = "commons.siteOutputDirectory")
65 private File siteDirectory;
66
67 /**
68 * The url of the subversion repository to which we wish the artifacts to be staged. Typically
69 * this would need to be of the form:
70 * <code>scm:svn:https://dist.apache.org/repos/dist/dev/commons/foo</code>. Note. that the prefix to the
71 * substring <code>https</code> is a requirement.
72 */
73 @Parameter(defaultValue = "", property = "commons.distSvnStagingUrl")
74 private String distSvnStagingUrl;
75
76 /**
77 * A parameter to generally avoid running unless it is specifically turned on by the consuming module.
78 */
79 @Parameter(defaultValue = "false", property = "commons.release.isDistModule")
80 private Boolean isDistModule;
81
82 /**
83 * The list of files to compress into the site.zip file.
84 */
85 private List<File> filesToCompress;
86
87 /**
88 * Constructs a new instance.
89 */
90 public CommonsSiteCompressionMojo() {
91 // empty
92 }
93
94 /**
95 * Given the <code>directoryToZip</code> we add the <code>file</code> to the ZIP archive represented by
96 * <code>zos</code>.
97 *
98 * @param directoryToZip a {@link File} representing the directory from which the file exists that we are
99 * compressing. Generally this is <code>target/site</code>.
100 * @param file a {@link File} to add to the {@link ZipOutputStream} <code>zos</code>.
101 * @param zos the {@link ZipOutputStream} to which to add our <code>file</code>.
102 * @throws IOException if adding the <code>file</code> doesn't work out properly.
103 */
104 private void addToZip(final File directoryToZip, final File file, final ZipOutputStream zos) throws IOException {
105 try (InputStream fis = Files.newInputStream(file.toPath())) {
106 // we want the zipEntry's path to be a relative path that is relative
107 // to the directory being zipped, so chop off the rest of the path
108 final String zipFilePath = file.getCanonicalPath().substring(
109 directoryToZip.getCanonicalPath().length() + 1,
110 file.getCanonicalPath().length());
111 final ZipEntry zipEntry = new ZipEntry(zipFilePath);
112 zos.putNextEntry(zipEntry);
113 IOUtils.copy(fis, zos);
114 }
115 }
116
117 @Override
118 public void execute() throws MojoExecutionException, MojoFailureException {
119 if (!isDistModule) {
120 getLog().info("This module is marked as a non distribution "
121 + "or assembly module, and the plugin will not run.");
122 return;
123 }
124 if (StringUtils.isEmpty(distSvnStagingUrl)) {
125 getLog().warn("commons.distSvnStagingUrl is not set, the commons-release-plugin will not run.");
126 return;
127 }
128 if (!siteDirectory.exists()) {
129 getLog().error("\"mvn site\" was not run before this goal, or a siteDirectory did not exist.");
130 throw new MojoFailureException(
131 "\"mvn site\" was not run before this goal, or a siteDirectory did not exist."
132 );
133 }
134 if (!workingDirectory.exists()) {
135 getLog().info("Current project contains no distributions. Not executing.");
136 return;
137 }
138 try {
139 filesToCompress = new ArrayList<>();
140 getAllSiteFiles(siteDirectory, filesToCompress);
141 writeZipFile(workingDirectory, siteDirectory, filesToCompress);
142 } catch (final IOException e) {
143 getLog().error("Failed to create ./target/commons-release-plugin/site.zip: " + e.getMessage(), e);
144 throw new MojoExecutionException(
145 "Failed to create ./target/commons-release-plugin/site.zip: " + e.getMessage(),
146 e
147 );
148 }
149 }
150
151 /**
152 * By default this method iterates across the <code>target/site</code> directory and adds all the files
153 * to the {@link CommonsSiteCompressionMojo#filesToCompress} {@link List}.
154 *
155 * @param siteDirectory the {@link File} that represents the <code>target/site</code> directory.
156 * @param filesToCompress the {@link List} to which to add all the files.
157 */
158 private void getAllSiteFiles(final File siteDirectory, final List<File> filesToCompress) {
159 final File[] files = siteDirectory.listFiles();
160 for (final File file : files) {
161 filesToCompress.add(file);
162 if (file.isDirectory()) {
163 getAllSiteFiles(file, filesToCompress);
164 }
165 }
166 }
167
168 /**
169 * A helper method for writing all the files in our <code>fileList</code> to a <code>site.zip</code> file
170 * in the <code>workingDirectory</code>.
171 *
172 * @param outputDirectory is a {@link File} representing the place to put the site.zip file.
173 * @param directoryToZip is a {@link File} representing the directory of the site (normally
174 * <code>target/site</code>).
175 * @param fileList the list of files to be zipped up, generally generated by
176 * {@link CommonsSiteCompressionMojo#getAllSiteFiles(File, List)}.
177 * @throws IOException when the copying of the files goes incorrectly.
178 */
179 private void writeZipFile(final File outputDirectory, final File directoryToZip, final List<File> fileList)
180 throws IOException {
181 try (OutputStream fos = Files.newOutputStream(new File(outputDirectory.getAbsolutePath() + "/site.zip")
182 .toPath());
183 ZipOutputStream zos = new ZipOutputStream(fos)) {
184 for (final File file : fileList) {
185 if (!file.isDirectory()) { // we only ZIP files, not directories
186 addToZip(directoryToZip, file, zos);
187 }
188 }
189 }
190 }
191 }