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.car; 021 022 import java.io.File; 023 import java.util.HashMap; 024 import java.util.HashSet; 025 import java.util.List; 026 import java.util.Set; 027 028 import org.apache.geronimo.kernel.Kernel; 029 import org.apache.geronimo.kernel.basic.BasicKernel; 030 import org.apache.geronimo.kernel.repository.Artifact; 031 import org.apache.geronimo.system.configuration.RepositoryConfigurationStore; 032 import org.apache.geronimo.system.plugin.DownloadResults; 033 import org.apache.geronimo.system.plugin.PluginInstallerGBean; 034 import org.apache.geronimo.system.plugin.SourceRepository; 035 import org.apache.geronimo.system.plugin.model.ArtifactType; 036 import org.apache.geronimo.system.plugin.model.PluginArtifactType; 037 import org.apache.geronimo.system.plugin.model.PluginListType; 038 import org.apache.geronimo.system.plugin.model.PluginType; 039 import org.apache.geronimo.system.plugin.model.AttributesType; 040 import org.apache.geronimo.system.resolver.AliasedArtifactResolver; 041 import org.apache.maven.artifact.repository.ArtifactRepository; 042 import org.codehaus.mojo.pluginsupport.dependency.DependencyTree; 043 044 /** 045 * Installs Geronimo module CAR files into a target repository to support assembly. 046 * 047 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $ 048 * @goal install-modules 049 */ 050 public class InstallModulesMojo 051 extends AbstractCarMojo 052 { 053 /** 054 * The location of the server repository. 055 * 056 * @parameter expression="${project.build.directory}/assembly" 057 * @required 058 */ 059 private File targetServerDirectory = null; 060 061 /** 062 * The location of the target repository. 063 * 064 * @parameter expression="repository" 065 * @required 066 */ 067 private String targetRepositoryPath = null; 068 069 /** 070 * The location of the target config files. 071 * 072 * @parameter expression="var/config" 073 * @required 074 */ 075 private String targetConfigPath = null; 076 077 /** 078 * ServerInstance specific in plugin configuration, to specify where config.xml and properties updates go. 079 * @parameter 080 */ 081 private List<ServerInstance> servers; 082 083 /** 084 * Configuration to be installed specified as groupId/artifactId/version/type 085 * if none specified, plugin will install all dependencies of type "car" 086 * 087 * @parameter 088 * @optional 089 */ 090 private String artifact = null; 091 092 /** 093 * Location of the source repository for the dependencies 094 * 095 * @parameter expression="${localRepository}" 096 * @required 097 */ 098 private ArtifactRepository sourceRepository = null; 099 100 /** 101 * The location where the properties mapping will be generated. 102 * 103 * @parameter expression="${project.build.directory}/explicit-versions.properties" 104 * @required 105 */ 106 private File explicitResolutionProperties = null; 107 108 /** 109 * The Geronimo repository artifact resolver. 110 * <p/> 111 * <p/> 112 * Using a custom name here to prevent problems that happen when Plexus 113 * injects the Maven resolver into the base-class. 114 * </p> 115 */ 116 private AliasedArtifactResolver geronimoArtifactResolver; 117 118 private RepositoryConfigurationStore sourceStore; 119 120 121 /** 122 * @parameter expression="${project.build.directory}/classes/var/config/overrides" 123 * @required 124 */ 125 private File overridesDir; 126 127 /** 128 * @parameter 129 */ 130 private List<Override> overrides; 131 132 /** 133 * Set of artifacts which have already been installed, so we can skip any processing. 134 */ 135 private Set installedArtifacts = new HashSet(); 136 137 protected void doExecute() throws Exception { 138 getDependencies(project); 139 Maven2RepositoryAdapter.ArtifactLookup lookup = new ArtifactLookupImpl(new HashMap<Artifact, org.apache.maven.artifact.Artifact>()); 140 SourceRepository sourceRepo = new Maven2RepositoryAdapter(dependencies, lookup); 141 PluginListType pluginList = new PluginListType(); 142 String localRepo = sourceRepository.getUrl(); 143 if ("file".equals(sourceRepository.getProtocol())) { 144 File localRepoDir = new File(sourceRepository.getBasedir()); 145 localRepo = localRepoDir.toURI().toString(); 146 } 147 pluginList.getDefaultRepository().add(localRepo); 148 for (org.apache.maven.model.Repository repository: (List<org.apache.maven.model.Repository>)project.getRepositories()) { 149 pluginList.getDefaultRepository().add(repository.getUrl()); 150 } 151 152 if (artifact != null) { 153 pluginList.getPlugin().add(toPluginType(Artifact.create(artifact))); 154 } else { 155 addDependencies(pluginList); 156 } 157 DownloadResults downloadPoller = new DownloadResults(); 158 String targetServerPath = targetServerDirectory.getAbsolutePath(); 159 160 Kernel kernel = new BasicKernel("Assembly"); 161 try { 162 PluginInstallerGBean installer = new PluginInstallerGBean(targetRepositoryPath, targetServerPath, servers, kernel, getClass().getClassLoader()); 163 installer.install(pluginList, sourceRepo, true, null, null, downloadPoller); 164 if (overrides != null) { 165 for (Override override: this.overrides) { 166 AttributesType attributes = override.getOverrides(overridesDir); 167 installer.mergeOverrides(override.getServer(), attributes); 168 } 169 } 170 } finally { 171 kernel.shutdown(); 172 } 173 log.info("Installed plugins: "); 174 for (Artifact artifact: downloadPoller.getInstalledConfigIDs()) { 175 log.info(" " + artifact); 176 } 177 log.info("Installed dependencies: "); 178 for (Artifact artifact: downloadPoller.getDependenciesInstalled()) { 179 log.info(" " + artifact); 180 } 181 if (downloadPoller.isFailed()) { 182 throw downloadPoller.getFailure(); 183 } 184 } 185 186 187 private PluginType toPluginType(Artifact artifact) { 188 PluginType plugin = new PluginType(); 189 PluginArtifactType instance = new PluginArtifactType(); 190 ArtifactType artifactType = PluginInstallerGBean.toArtifactType(artifact); 191 instance.setModuleId(artifactType); 192 plugin.getPluginArtifact().add(instance); 193 return plugin; 194 } 195 196 /** 197 * Retrieves all artifact dependencies. 198 * 199 * @param pluginList PluginListType to add dependencies to as PluginType instances. 200 */ 201 protected void addDependencies(PluginListType pluginList) { 202 203 org.apache.maven.artifact.Artifact artifact = project.getArtifact(); 204 if (artifact != null && ("car".equals(artifact.getType()) || "jar".equals(artifact.getType())) && artifact.getFile() != null) { 205 pluginList.getPlugin().add(toPluginType(mavenToGeronimoArtifact(artifact))); 206 } 207 208 List<org.apache.maven.model.Dependency> projectArtifacts = project.getModel().getDependencies(); 209 if (projectArtifacts != null) { 210 for (org.apache.maven.model.Dependency dependency: projectArtifacts) { 211 if (dependency.getScope() == null || "compile".equals(dependency.getScope())) { 212 pluginList.getPlugin().add(toPluginType(mavenToGeronimoArtifact(dependency))); 213 } 214 } 215 } 216 217 } 218 219 }