| /* |
| * 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.easyant.tasks; |
| |
| import java.io.File; |
| |
| import org.apache.easyant.core.EasyAntMagicNames; |
| import org.apache.easyant.core.ivy.IvyInstanceHelper; |
| import org.apache.easyant.core.report.EasyAntReport; |
| import org.apache.easyant.core.report.ImportedModuleReport; |
| import org.apache.easyant.core.services.PluginService; |
| import org.apache.ivy.ant.IvyAntSettings; |
| import org.apache.ivy.ant.IvyInstall; |
| import org.apache.ivy.core.module.descriptor.DependencyDescriptor; |
| import org.apache.ivy.core.module.id.ModuleRevisionId; |
| import org.apache.ivy.core.report.ResolveReport; |
| import org.apache.ivy.core.resolve.IvyNode; |
| import org.apache.tools.ant.BuildException; |
| |
| /** |
| * Provide go offline feature. It retrieves all easyant modules used by the project (plugins, buildtype) and all project |
| * dependencies. You can then define target resolver name where all artifacts will get installed. You can combine |
| * GoOffline task with ConfigureBuildScopeRepository, to have everything embedded in your project directory |
| * |
| */ |
| public class GoOffline extends AbstractEasyAntTask { |
| |
| private String projectResolverName; |
| private String easyantResolverName; |
| private File moduleIvy; |
| |
| @Override |
| public void execute() throws BuildException { |
| if (moduleIvy == null && getProject().getProperty(EasyAntMagicNames.EASYANT_FILE) != null) { |
| moduleIvy = new File(getProject().getProperty(EasyAntMagicNames.EASYANT_FILE)); |
| } |
| if (moduleIvy == null || !moduleIvy.exists()) { |
| throw new BuildException("Couldn't locate module ivy did you specified moduleivy attribute ?"); |
| } |
| |
| if (projectResolverName == null) { |
| throw new BuildException("projectResolverName is mandatory !"); |
| } |
| |
| if (easyantResolverName == null) { |
| throw new BuildException("easyantResolverName is mandatory !"); |
| } |
| |
| PluginService pluginService = getProject().getReference( |
| EasyAntMagicNames.PLUGIN_SERVICE_INSTANCE); |
| EasyAntReport easyAntReport; |
| try { |
| easyAntReport = pluginService.generateEasyAntReport(moduleIvy); |
| installBuildTypeAndPlugins(easyAntReport); |
| installProjectDependencies(easyAntReport); |
| } catch (Exception e) { |
| throw new BuildException("Can't retrieve project report", e); |
| } |
| |
| } |
| |
| /*** |
| * Install project dependencies |
| * |
| * @param easyAntReport |
| * {@link EasyAntReport} where project dependencies are described |
| */ |
| private void installProjectDependencies(EasyAntReport easyAntReport) { |
| for (DependencyDescriptor dependencyDescriptor : easyAntReport.getModuleDescriptor().getDependencies()) { |
| install(dependencyDescriptor.getDependencyRevisionId(), getProjectResolverName(), |
| IvyInstanceHelper.getProjectIvyInstanceName(getProject())); |
| } |
| } |
| |
| /** |
| * Install easyant plugins and buildtypes used by a project |
| * |
| * @param easyAntReport |
| * {@link EasyAntReport} where plugin / buildtypes is described |
| */ |
| private void installBuildTypeAndPlugins(EasyAntReport easyAntReport) { |
| for (ImportedModuleReport importedModule : easyAntReport.getImportedModuleReports()) { |
| install(ModuleRevisionId.parse(importedModule.getModuleMrid()), getEasyantResolverName(), |
| EasyAntMagicNames.EASYANT_IVY_INSTANCE); |
| if (importedModule.getEasyantReport() != null) { |
| // install module dependencies |
| ResolveReport resolveReport = importedModule.getEasyantReport().getResolveReport(); |
| for (Object o : resolveReport.getDependencies()) { |
| IvyNode dependency = (IvyNode) o; |
| install(dependency.getResolvedId(), getEasyantResolverName(), |
| EasyAntMagicNames.EASYANT_IVY_INSTANCE); |
| } |
| // install plugins declared inside current module |
| |
| installBuildTypeAndPlugins(importedModule.getEasyantReport()); |
| } |
| |
| } |
| } |
| |
| private void install(ModuleRevisionId moduleRevisionId, String targetResolver, String ivyInstanceRef) { |
| IvyInstall install = new IvyInstall(); |
| install.setSettingsRef(IvyInstanceHelper.buildIvyReference(getProject(), ivyInstanceRef)); |
| |
| // locate source resolver |
| IvyAntSettings ivyAntSettings = IvyInstanceHelper.getIvyAntSettings(getProject(), ivyInstanceRef); |
| String from = ivyAntSettings.getConfiguredIvyInstance(this).getSettings().getResolverName(moduleRevisionId); |
| install.setFrom(from); |
| |
| install.setTo(targetResolver); |
| install.setOrganisation(moduleRevisionId.getOrganisation()); |
| install.setModule(moduleRevisionId.getName()); |
| install.setRevision(moduleRevisionId.getRevision()); |
| install.setOverwrite(true); |
| install.setHaltonfailure(false); |
| install.setTransitive(true); |
| initTask(install).execute(); |
| |
| } |
| |
| public String getProjectResolverName() { |
| return projectResolverName; |
| } |
| |
| public void setProjectResolverName(String projectResolverName) { |
| this.projectResolverName = projectResolverName; |
| } |
| |
| public String getEasyantResolverName() { |
| return easyantResolverName; |
| } |
| |
| public void setEasyantResolverName(String easyantResolverName) { |
| this.easyantResolverName = easyantResolverName; |
| } |
| |
| public File getModuleIvy() { |
| return moduleIvy; |
| } |
| |
| public void setModuleIvy(File moduleIvy) { |
| this.moduleIvy = moduleIvy; |
| } |
| |
| } |