blob: 517966198e184c360f11e1f9d9c4dd905ce9572e [file] [log] [blame]
/*
* 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.ivy.ant.IvyTask;
import org.apache.easyant.core.ivy.EasyAntRepositoryCacheManager;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.plugins.resolver.ChainResolver;
import org.apache.ivy.plugins.resolver.DependencyResolver;
import org.apache.ivy.plugins.resolver.FileSystemResolver;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
/**
* This task is used to configure a build scoped repository This can be particularly usefull if we are working in a
* multi-module project with interdependencies.
*
*/
public class ConfigureBuildScopedRepository extends IvyTask {
private String name;
private String target;
private boolean dictator = false;
private boolean generateWrapperResoler = true;
private String ivyPattern = "/[organisation]/[module]/[revision]/[module].ivy";
private String artifactPattern = "/[organisation]/[module]/[revision]/[artifact](-[classifier]).[ext]";
@Override
public void doExecute() throws BuildException {
String targetDirectory = getTarget();
// be sure that we have an absolute path
File targetDir = new File(targetDirectory);
targetDirectory = targetDir.getAbsolutePath();
String buildScopeRepositoryName = getName();
final String DEFAULT_BUILD_SCOPED_REPOSITORY_DIR = targetDirectory + "/repository/" + buildScopeRepositoryName;
final String DEFAULT_CACHE_BUILD_SCOPED_REPO = targetDirectory + "/cache/" + buildScopeRepositoryName;
getProject().log("Registering build scoped repository in " + DEFAULT_BUILD_SCOPED_REPOSITORY_DIR,
Project.MSG_DEBUG);
final String CACHENAME = "build-scoped-cache-" + buildScopeRepositoryName;
log("Registering build scope repository : " + getName() + " in " + DEFAULT_BUILD_SCOPED_REPOSITORY_DIR,
Project.MSG_DEBUG);
// Get the project ivy instance
IvySettings settings = getSettings();
// Create a cache for build scoped repository
File cacheDir = new File(DEFAULT_CACHE_BUILD_SCOPED_REPO);
EasyAntRepositoryCacheManager rcm = new EasyAntRepositoryCacheManager(CACHENAME, settings, cacheDir);
rcm.setUseOrigin(true); // no need to copy temporary build artifacts
// into temporary cache.
// Register the repository cache
settings.addConfigured(rcm);
// Create the build scoped repository
FileSystemResolver buildRepository = new FileSystemResolver();
buildRepository.addArtifactPattern(DEFAULT_BUILD_SCOPED_REPOSITORY_DIR + getArtifactPattern());
buildRepository.addIvyPattern(DEFAULT_BUILD_SCOPED_REPOSITORY_DIR + getIvyPattern());
// bind to the repocache
buildRepository.setCache(CACHENAME);
buildRepository.setName(buildScopeRepositoryName);
if (isDictator()) {
settings.setDictatorResolver(buildRepository);
} else if (isGenerateWrapperResoler()) {
// Search the default resolver after the build-scoped repo
DependencyResolver dr = settings.getDefaultResolver();
if (dr == null) {
throw new BuildException("Unable to find a default resolver");
}
// replace the default resolver with a chain resolver, which first
// searches
// in the build repository, then in the old default.
ChainResolver resolver = new ChainResolver();
resolver.setName(dr.getName()); // same name as old default
resolver.setReturnFirst(true);
resolver.add(buildRepository);
resolver.add(dr);
dr.setName("delegate." + dr.getName()); // give old default a new name
settings.addResolver(dr);
settings.addResolver(resolver);
}
settings.addResolver(buildRepository);
log(getName() + " registration succeeded", Project.MSG_DEBUG);
}
/**
* Build default repository name
*
* @return repository name
*/
private String buildDefaultRepositoryName() {
return "build." + IvyInstanceHelper.getProjectIvyInstanceName(getProject());
}
/**
* Get the target directory where both build scoped repository and cache will be instanciated
*
* @return a target directory
*/
public String getTarget() {
if (target == null) {
target = getProject().getProperty(EasyAntMagicNames.META_TARGET);
if (target == null) {
target = getProject().getProperty(EasyAntMagicNames.TARGET);
}
if (target == null) {
target = getProject().getBaseDir() + "/target";
}
}
return target;
}
/**
* Specify if this repository should be used in place of any specified resolver in {@link IvySettings}
*
* @return true if acts as dictator resolver
*/
public boolean isDictator() {
return dictator;
}
/**
* Specify if this repository should be used in place of any specified resolver in {@link IvySettings}
*
* @param dictator
* true if acts as dictator resolver
*/
public void setDictator(boolean dictator) {
this.dictator = dictator;
}
public String getIvyPattern() {
return ivyPattern;
}
public void setIvyPattern(String ivyPattern) {
this.ivyPattern = ivyPattern;
}
public String getArtifactPattern() {
return artifactPattern;
}
public void setArtifactPattern(String artifactPattern) {
this.artifactPattern = artifactPattern;
}
/**
* Get repository name. By default equals to "build." + ivyInstanceName
*
* @return repository name
*/
public String getName() {
if (name == null) {
name = buildDefaultRepositoryName();
}
return name;
}
/**
* Set repository name
*
* @param name
* repository name
*/
public void setName(String name) {
this.name = name;
}
/**
*
* Set the target directory where both build scoped repository and cache will be instanciated
*
* @param target
* a target directory
*/
public void setTarget(String target) {
this.target = target;
}
/**
* Specify if we need to generate wrapper resolver. This is not evaluated when using as dictator. When false,
* repository will be generated but not plugged in current {@link ChainResolver}
*
* @return true if we need to generate wrapper resolver
*/
public boolean isGenerateWrapperResoler() {
return generateWrapperResoler;
}
/**
* Specify if we need to generate wrapper resolver. This is not evaluated when using as dictator. When false,
* repository will be generated but not plugged in current {@link ChainResolver}
*
* @param generateWrapperResoler
* true if we need to generate wrapper resolver
*/
public void setGenerateWrapperResoler(boolean generateWrapperResoler) {
this.generateWrapperResoler = generateWrapperResoler;
}
}