001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.geronimo.mavenplugins.geronimo.module;
021
022 import java.io.File;
023 import java.util.List;
024 import java.util.ArrayList;
025 import java.util.Iterator;
026
027 import javax.enterprise.deploy.spi.DeploymentManager;
028 import javax.enterprise.deploy.spi.Target;
029 import javax.enterprise.deploy.spi.TargetModuleID;
030 import javax.enterprise.deploy.spi.status.ProgressObject;
031 import javax.enterprise.deploy.spi.status.DeploymentStatus;
032
033 import org.apache.maven.artifact.Artifact;
034 import org.apache.maven.plugin.MojoExecutionException;
035
036 import org.apache.geronimo.mavenplugins.geronimo.ModuleConfig;
037
038 /**
039 * Deploy modules (and optionally starting them) to a Geronimo server.
040 *
041 * @goal deploy-module
042 *
043 * @version $Rev: 509110 $ $Date: 2007-02-19 01:48:46 -0500 (Mon, 19 Feb 2007) $
044 */
045 public class DeployModuleMojo
046 extends ModuleMojoSupport
047 {
048 /**
049 * A file which points to a specific module's jar | war | ear | rar archive.
050 * If this parameter is set, then it will be used instead of from the
051 * modules configuration.
052 *
053 * @parameter expression="${moduleArchive}"
054 * @optional
055 */
056 protected File moduleArchive = null;
057
058 /**
059 * The fully qualified path of the external plan file (geronimo-web.xml).
060 * The application module may already have included in the package a deployment plan or the
061 * application is so simple that may not require any deployment plan.
062 *
063 * @parameter expression="${modulePlan}"
064 * @optional
065 */
066 private File modulePlan = null;
067
068 /**
069 * Flag to indicate if modules should be started after they have been distributed to the server.
070 *
071 * @parameter default-value="true"
072 * @optional
073 */
074 private boolean startModules = false;
075
076 protected void doExecute() throws Exception {
077 List completed = new ArrayList();
078
079 if (moduleArchive != null || modulePlan != null) {
080 log.info("Using non-artifact based module archive: " + moduleArchive);
081 log.info("Using non-artifact based plan: " + modulePlan);
082
083 TargetModuleID[] ids = distribute(moduleArchive, modulePlan);
084 completed.add(ids);
085 }
086 else if (modules == null || modules.length == 0) {
087 throw new MojoExecutionException("At least one module configuration (or moduleArchive) must be specified");
088 }
089
090 if (modules != null && modules.length != 0) {
091 log.info("Using artifact based module archive(s)...");
092
093 for (int i=0; i<modules.length; i++) {
094 TargetModuleID[] ids = distribute(getModuleArchive(modules[i]), modules[i].getPlan());
095 completed.add(ids);
096 }
097 }
098
099 if (startModules) {
100 log.info("Starting modules...");
101
102 Iterator iter = completed.iterator();
103 while (iter.hasNext()) {
104 TargetModuleID[] moduleIds = (TargetModuleID[])iter.next();
105 for (int i=0; i < moduleIds.length; i++) {
106 String url = moduleIds[i].getWebURL();
107 log.info("Starting module: " + moduleIds[i].getModuleID() + (url == null ? "" : ("; URL: " + url)));
108 }
109
110 ProgressObject progress = getDeploymentManager().start(moduleIds);
111 DeploymentStatus status = waitFor(progress);
112
113 if (status.isFailed()) {
114 throw new MojoExecutionException("Failed to start modules: " + status.getMessage());
115 }
116
117 log.info("Started module(s):");
118 logModules(moduleIds, " ");
119 }
120 }
121 }
122
123 private File getModuleArchive(final ModuleConfig module) throws MojoExecutionException {
124 Artifact artifact = getArtifact(module);
125
126 File file = artifact.getFile();
127 if (file == null) {
128 throw new MojoExecutionException("Module artifact does not have an attached file: " + module);
129 }
130
131 String type = artifact.getType();
132 log.debug("Artifact file is: " + file + " (" + type + ")");
133
134 if ((!"war".equals(type)) &&
135 (!"ear".equals(type)) &&
136 (!"rar".equals(type)) &&
137 (!"jar".equals(type)))
138 {
139 throw new MojoExecutionException("Module does not look like a JavaEE archive: " + module);
140 }
141
142 return file;
143 }
144
145 private TargetModuleID[] distribute(final File file, final File plan) throws Exception {
146 log.info("Distributing module artifact: " + file + " with plan " + plan);
147
148 DeploymentManager manager = getDeploymentManager();
149 Target[] targets = manager.getTargets();
150 ProgressObject progress = manager.distribute(targets, file, plan);
151 DeploymentStatus status = waitFor(progress);
152
153 if (status.isFailed()) {
154 //
155 // FIXME: There must be a better way to handle this.
156 //
157 if (status.getMessage().indexOf("already exists") < 0 ) {
158 throw new MojoExecutionException("Distribution failed: " + status.getMessage());
159 }
160 log.info("Module already exists");
161 }
162
163
164 return (progress != null) ? progress.getResultTargetModuleIDs() : null;
165 }
166
167 protected String getFullClassName() {
168 return this.getClass().getName();
169 }
170 }