org.apache.pluto.maven.AssembleMojo Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pluto.maven;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.pluto.util.UtilityException;
import org.apache.pluto.util.assemble.Assembler;
import org.apache.pluto.util.assemble.AssemblerConfig;
import org.apache.pluto.util.assemble.AssemblerFactory;
/**
* The AssembleMojo is responsible for assembling a web application for deployment
* into the Pluto portlet container. Assembly, in this context, is the process of
* updating a web application's WEB-INF/web.xml with Pluto specific parameters for
* deployment in Pluto.
*
* This Mojo is able to operate on individual descriptors by specifying
* portletXml
, webXml
, and webXmlDestination
.
* If your project uses standard Maven 2 directory layouts, the defaults will
* provide proper values.
*
* Example Maven 2 pom.xml
usage:
*
* <project>
* ...
* <build>
* <plugins>
* <plugin>
* <groupId>org.apache.pluto</groupId>
* <artifactId>maven-pluto-plugin</artifactId>
* </plugin>
* </plugins>
* </build>
* ...
* </project>
*
*
* This Mojo can also operate on entire WAR or EAR archive files by specifying
* a list of archive path names in archives
.
*
* Example Maven 2 pom.xml
usage:
*
* <project>
* ...
* <build>
* <plugins>
* <plugin>
* <groupId>org.apache.pluto</groupId>
* <artifactId>maven-pluto-plugin</artifactId>
* <executions>
* <execution>
* <phase>package</phase>
* <goals>
* <goal>assemble</goal>
* </goals>
* <configuration>
* <assemblyOutputDirectory>${project.build.directory}/assembled-wars</assemblyOutputDirectory>
* <archives>
* <assembleArchive>
* ${project.build.directory}/wartoassemble.war
* </assembleArchive>
* <assembleArchive>
* ${project.build.directory}/anotherwartoassemble.war
* </assembleArchive>
* </archives>
* </configuration>
* </execution>
* </executions>
* </plugin>
* </plugins>
* </build>
* ...
* </project>
*
*
* @since Jul 30, 2005
* @see org.apache.pluto.util.assemble.Assembler
*
* @goal assemble
* @description prepares a web application as a portlet application
* @phase process-resources
*/
public class AssembleMojo extends AbstractPortletMojo {
// Private Member Variables ------------------------------------------------
/**
* The portlet application descriptor (WEB-INF/portlet.xml
).
* @parameter expression="${basedir}/src/main/webapp/WEB-INF/portlet.xml"
* @required
*/
private File portletXml;
/**
* The original webapp descriptor (WEB-INF/web.xml
).
* @parameter expression="${basedir}/src/main/webapp/WEB-INF/web.xml"
* @required
*/
private File webXml;
/**
* The file to which the updated webapp descriptor is written.
* @parameter expression="${project.build.directory}/pluto-resources/web.xml"
*/
private File webXmlDestination;
/**
* The name of the dispatch servlet class to use
* @parameter
*/
private String dispatchServletClass;
/**
* A list of archive files to assemble. Only EAR and WAR file
* types are supported.
*
* Each value in the list is the absolute pathname to the
* archive being assembled.
*
* This parameter is mutually exclusive with portletXml, webXml,
* and webXmlDestination parameters.
*
* @parameter alias="warFiles"
*/
private List archives;
/**
* @deprecated see archives parameter
* @parameter
*/
private List warFiles;
/**
* Destination directory the assembled files are written out to.
* @parameter alias="warFilesDestination" expression="${project.build.directory}/pluto-assembled-wars"
*/
private File assemblyOutputDirectory;
/**
* Destination directory the assembled files are written out to.
* @parameter
* @deprecated see assemblyOutputDirectory parameter
*/
private File warFilesDestination;
// AbstractPlutoMojo Impl --------------------------------------------------
protected void doExecute() throws MojoExecutionException {
// Log parameter values.
Log log = getLog();
if (log.isInfoEnabled()) {
if (archives == null || archives.isEmpty()) {
log.info("Reading web.xml from :" + webXml.getAbsolutePath());
log.info("Reading portlet.xml from: " + portletXml.getAbsolutePath());
log.info("Writing web.xml to: " + webXmlDestination.getAbsolutePath());
}
}
try {
// Assemble portlet app by updating web.xml.
if (archives == null || archives.isEmpty()) {
AssemblerConfig config = createAssemblerConfig();
Assembler assembler = AssemblerFactory.getFactory()
.createAssembler(config);
assembler.assemble(config);
} else {
for (Iterator i = archives.iterator(); i.hasNext();) {
File archive = new File(i.next().toString());
if (log.isInfoEnabled()) {
log.info("Assembling archive file " + archive.getAbsolutePath() +
" to directory " + assemblyOutputDirectory.getAbsolutePath());
}
AssemblerConfig config = createArchiveAssemblerConfig(archive, assemblyOutputDirectory);
Assembler assembler = AssemblerFactory.getFactory()
.createAssembler(config);
assembler.assemble(config);
}
}
} catch (UtilityException e) {
log.error("Assembly failed: " + e.getMessage(), e);
}
}
protected void doValidate() throws MojoExecutionException {
Log log = getLog();
// Support for the old 'warFiles' mojo parameter. Apparently
// the alias for the 'archives' parameter doesn't work properly.
if (! (warFiles == null || warFiles.isEmpty()) ) {
log.warn( "'warFiles' parameter is deprecated. Use 'archives' parameter instead." );
if ( archives == null ) {
archives = new ArrayList();
}
archives.addAll( warFiles );
}
// Warn if the old 'warFilesDestination' mojo parameter is used
if ( warFilesDestination != null ) {
log.warn( "'warFilesDestination' parameter is deprecated. Use 'assemblyOutputDirectory' instead." );
assemblyOutputDirectory = warFilesDestination;
}
// If a list of war files are supplied:
// 1) webXml, portletXml, and webXmlDestination parameters are ignored
// 2) verify the files in the List exist.
// 3) verify the destination is a directory, or create it if it doesn't exist.
// A list of files was supplied so we ignore other parameters.
if (archives != null && !archives.isEmpty()) {
if (webXml != null) {
log.debug("archives parameter and webXml parameter are mutually exclusive. Ignoring webXml parameter.");
}
if (portletXml != null) {
log.debug("archives parameter and portletXml parameter are mutually exclusive. Ignoring portletXml parameter.");
}
if (webXmlDestination != null) {
log.debug("archives parameter and webXmlDestination parameter are mutually exclusive. Ignoring webXmlDestination parameter.");
}
// verify each file can be found
for (Iterator i = archives.iterator(); i.hasNext();) {
File f = new File(i.next().toString());
if (!f.exists()) {
log.warn("File " + f.getAbsolutePath() + " does not exist.");
i.remove();
continue;
}
if (!f.canRead()) {
log.warn("File " + f.getAbsolutePath() + " exists but cannot be read.");
i.remove();
continue;
}
}
// check to see if the warFiles list is now empty
if (archives.isEmpty()) {
throw new MojoExecutionException("No war files could be installed due errors.");
}
// check to see if the dest dir exists or create it.
if (!assemblyOutputDirectory.exists()) {
if (log.isDebugEnabled()) {
log.debug("Creating destination directory for assembled war files: " + assemblyOutputDirectory.getAbsolutePath());
}
try {
if(!assemblyOutputDirectory.mkdirs()) {
throw new MojoExecutionException("Unable to create destination directory for assembled war files: " +
assemblyOutputDirectory.getAbsolutePath());
}
} catch (SecurityException e) {
throw new MojoExecutionException("Unable to create destination directory for assembled war files: " + e.getMessage(), e);
}
} else {
if (!assemblyOutputDirectory.isDirectory()) {
throw new MojoExecutionException("Specified destination for assembled war files " +
assemblyOutputDirectory.getAbsolutePath() + " is not a directory!");
}
if (!assemblyOutputDirectory.canRead()||!assemblyOutputDirectory.canWrite()) {
throw new MojoExecutionException("Unable to read or write to destination directory for assembed war files. " +
"Check permissions on the directory " + assemblyOutputDirectory.getAbsolutePath());
}
}
// A list of archive files was not provided, so use the other parameters instead.
} else {
if (webXml == null || !webXml.exists()) {
throw new MojoExecutionException("Web application descriptor must be a valid web.xml");
}
if (portletXml == null || !portletXml.exists()) {
throw new MojoExecutionException("Portlet descriptor must be a valid portlet.xml");
}
}
}
// Private Methods ---------------------------------------------------------
private AssemblerConfig createAssemblerConfig() {
AssemblerConfig config = new AssemblerConfig();
config.setPortletDescriptor(portletXml);
config.setWebappDescriptor(webXml);
config.setDestination(webXmlDestination);
config.setDispatchServletClass(dispatchServletClass);
return config;
}
private AssemblerConfig createArchiveAssemblerConfig(File archiveToAssemble, File destinationDirectory) {
AssemblerConfig config = new AssemblerConfig();
config.setDispatchServletClass(dispatchServletClass);
config.setSource(archiveToAssemble);
config.setDestination(destinationDirectory);
return config;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy