original mboot no longer required

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@163500 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Brett Leslie Porter 2005-03-09 03:35:33 +00:00
parent 1fe8c76a3d
commit 92fe671087
16 changed files with 0 additions and 2830 deletions

View File

@ -1,4 +0,0 @@
*~
target
.classpath
.project

View File

@ -1,13 +0,0 @@
How to use mboot
----------------
o ./build
o cd target
o export MBOOT_HOME=<whatever>; export PATH=$PATH:$MBOOT_HOME (optional)
o ./mboot-install.sh
o mboot
mboot will build Maven projects that are relatively simple. It will build
a JAR and package any resources into the JAR. Good enough for Maven itself
and the plugins but appears to be useful for other things.

View File

@ -1,5 +0,0 @@
o obey jar overrides
o transitive deps
o move all code for gathering pieces of the model to java, the mix of grabbing
some stuff with java and some from bash is crappy. It works, but it's still
crappy. Use the generated xpp3 reader.

View File

@ -1,33 +0,0 @@
#!/bin/sh
rm -rf target > /dev/null 2>&1
. src/bash/maven.functions
downloadMBootDependencies
createMBootClasspath
compile ".:$MBOOT_CP" target/classes src/main
isCommandSuccessful $? "Failed compiling Maven bootstrapper classes!"
DIST=target/mboot
mkdir -p $DIST
cp -r target/classes $DIST
cp src/bash/* $DIST > /dev/null 2>&1
(
cd target/mboot
tar czf ../mboot.tar.gz *
)
cat src/sea/sea-header target/mboot.tar.gz > target/mboot-install.sh
chmod +x target/mboot-install.sh
rm -f bootstrap.repo > /dev/null 2>&1

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>maven</groupId>
<artifactId>maven-component</artifactId>
<version>2.0-SNAPSHOT</version>
</parent>
<name>Maven MBoot</name>
<groupId>maven</groupId>
<artifactId>maven-mboot</artifactId>
<version>2.0-SNAPSHOT</version>
<description>Tool used to bootstrap m2.</description>
<shortDescription>Tool used to bootstrap m2.</shortDescription>
</project>

View File

@ -1,8 +0,0 @@
junit/jars/junit-3.8.1.jar
surefire/jars/surefire-booter-1.1.jar
surefire/jars/surefire-1.1.jar
modello/jars/modello-1.0-SNAPSHOT.jar
xpp3/jars/xpp3-1.1.3.3.jar
xstream/jars/xstream-1.0-SNAPSHOT.jar
qdox/jars/qdox-1.2.jar
maven/jars/maven-plugin-2.0-SNAPSHOT.jar

View File

@ -1,517 +0,0 @@
#!/bin/sh
# -----------------------------------------------------------------------------
# Maven functions
#
# @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
# @author <a href="mailto:emmanuel@venisse.net">Emmanuel Venisse</a>
# -----------------------------------------------------------------------------
POM=pom.xml
downloadMBootDependencies()
{
findAndSetMavenRepoLocal
for i in `cat ${MBOOT_HOME}/deps`
do
echo $i | grep SNAPSHOT > /dev/null 2>&1
snapshot=$?
if [ "$snapshot" = "0" ] || [ ! -f $repoLocal/$i ]
then
mkdir -p `dirname $repoLocal/$i` > /dev/null 2>&1
wget -q -O $repoLocal/$i http://www.ibiblio.org/maven/$i
fi
done
}
createMBootClasspath()
{
findAndSetMavenRepoLocal
if [ "$cygwin" = "true" ]
then
MBOOT_CP=`cygpath -pu "$MBOOT_CP"`
fi
for i in `cat ${MBOOT_HOME}/deps`
do
MBOOT_CP=${MBOOT_CP}:$repoLocal/$i
done
}
findAndSetMavenRepoLocal()
{
if [ -f $HOME/maven.properties ]
then
repoLocal=`cat $HOME/maven.properties | egrep "^maven.repo.local" | sed 's/^.*= *//'`
else
repoLocal=$HOME/.maven/repository
fi
if [ "$cygwin" = "true" ]
then
repoLocal=`cygpath -pu "$repoLocal"`
fi
}
isCommandSuccessful()
{
# $1 == $?
# $2 == Error message on failure
ret=$1
if [ $ret != 0 ]; then
echo $2
exit $ret
fi
}
runJava()
{
# $1 == classpath
# $2 == Main class
# $3 == Main args
if $cygwin; then
CP=`cygpath -pw "$1"`
else
CP=$1
fi
"${JAVACMD}" -classpath "$CP" $2 "$3"
}
runTests()
{
# $1 == classpath
# $2 == home args
# $3 == repo local
# $4 == dependencies file
# $5 == includes file
# $6 == excludes file
if $cygwin; then
CP=`cygpath -pw "$1"`
else
CP=$1
fi
if $cygwin; then
repo=`cygpath -pw "$3"`
else
repo=$3
fi
if [ -f $5 ]
then
"${JAVACMD}" -classpath "$CP" org.codehaus.surefire.SurefireBooter "$2" "$repo" $4 $5 $6
fi
}
compile()
{
# $1 == classpath
# $2 == destination for compiled classes
# $3 == source directory
# $4 == generated source directory
if [ -d $3 ] || [ -d $4 ]
then
if [ ! -d $2 ]
then
mkdir -p $2
fi
if [ ! -z $3 ] && [ -d $3 ]
then
sources=`find $3 -name '*.java'`
fi
if [ ! -z $4 ] && [ -d $4 ]
then
generatedSources=`find $4 -name '*.java'`
fi
if $cygwin; then
CP=`cygpath -pw "$1"`
else
CP=$1
fi
"${JAVAC}" -classpath "$CP" -d $2 ${sources} ${generatedSources}
fi
}
buildJar()
{
# $1 == directory to JAR
# $2 == JAR path relative to the cwd
(
dir=`pwd`
cd $1
if $cygwin; then
JARFILE=`cygpath -pw ${dir}/$2`
else
JARFILE=${dir}/$2
fi
${JAVA_HOME}/bin/jar -cf $JARFILE *
)
}
buildMavenProject()
{
# 1. Parse the model
# 2. Download any required dependencies
# 3. Compile the sources
# 4. Move required resources into location
# 5. Create JAR.
# $1 == directory where project lives
# $2 == jar name
# $3 == flag to install
# $4 == flag to install pom
# $5 == flag to leave mboot files
(
home=`pwd`
cd $1
# If the user only want to install the POM skip the rest
if [ "$3" = "0" ] && [ "$4" = "1" ]
then
installPom
return
fi
# Look for source directory in pom.xml
sourceDirectory=`grep sourceDirectory ${POM} | sed -e 's/^*//;s/<sourceDirectory>//;s/<\/sourceDirectory>//;s/\${basedir}\///'`
[ -z $sourceDirectory ] && sourceDirectory=src/main/java
buildDir=target
buildDest=target/classes
# Look for unit test source directory in pom.xml
unitTestSourceDirectory=`grep unitTestSourceDirectory ${POM} | sed -e 's/^*//;s/<unitTestSourceDirectory>//;s/<\/unitTestSourceDirectory>//;s/\${basedir}\///'`
[ -z $unitTestSourceDirectory ] && unitTestSourceDirectory=src/test/java
buildTestDest=target/test-classes
##[ -d $buildDir ] && rm -rf $buildDir
echo "Building project in `pwd`"
if $cygwin = true; then
home=`cygpath -pw $home`
fi
runJava ${MBOOT_HOME}/classes Bootstrapper ${home}
isCommandSuccessful $? "Failed running project parser!"
bootstrapClasspath=`cat bootstrap.classpath`
if $cygwin = true; then
bootstrapClasspath=`cygpath -pu "$bootstrapClasspath"`
fi
projectDependencyClassPath=$bootstrapClasspath:.
generatedSourceDirectory=target/generated-sources
compile "$projectDependencyClassPath" $buildDest $sourceDirectory $generatedSourceDirectory
isCommandSuccessful $? "Failed compiling classes!"
echo "Building tests in `pwd`"
repoLocal=`cat bootstrap.repo`
if $cygwin = true; then
repoLocal=`cygpath -pu "$repoLocal"`
fi
createMBootClasspath
if [ ! -z $unitTestSourceDirectory ] && [ -d $unitTestSourceDirectory ]
then
compile "$buildDest:$projectDependencyClassPath:${MBOOT_CP}" $buildTestDest $unitTestSourceDirectory
isCommandSuccessful $? "Failed compiling test classes!"
fi
copyResources bootstrap.resources target/classes
copyResources bootstrap.tests.resources target/test-classes
echo "Running tests in `pwd`"
# We only need the booter jar in the classpath, it will load everything else.
runTests ".:${MBOOT_HOME}/classes:$repoLocal/surefire/jars/surefire-booter-1.1.jar" "$1" "$repoLocal" bootstrap.libs bootstrap.tests.includes bootstrap.tests.excludes
isCommandSuccessful $? "Failed running project tests!"
if [ "$2" = "default" ]
then
jarName=`getJarName ${POM}`
else
jarName=$2
fi
echo "Building jars (${jarName}) in `pwd`/target"
buildJar $buildDest target/${jarName}
if [ "$3" = "1" ]
then
findAndSetMavenRepoLocal
groupId=`getGroupId`
echo "Installing ${jarName} in ${repoLocal}/${groupId}/jars"
mkdir -p ${repoLocal}/${groupId}/jars > /dev/null 2>&1
cp target/${jarName} ${repoLocal}/${groupId}/jars
installPom
fi
if [ "$5" = "0" ]
then
rm -f bootstrap.classpath > /dev/null 2>&1
rm -f bootstrap.libs > /dev/null 2>&1
rm -f bootstrap.deps > /dev/null 2>&1
rm -f bootstrap.resources > /dev/null 2>&1
rm -f bootstrap.repo > /dev/null 2>&1
rm -f bootstrap.tests.includes > /dev/null 2>&1
rm -f bootstrap.tests.excludes > /dev/null 2>&1
rm -f bootstrap.tests.resources > /dev/null 2>&1
fi
)
}
installPom()
{
findAndSetMavenRepoLocal
groupId=`getGroupId`
pomName=`getPomName ${POM}`
dir=${repoLocal}/${groupId}/poms
echo "Installing POM in ${dir}/${pomName}"
mkdir -p ${dir}
cp ${POM} ${dir}/${pomName}
}
getJarName()
{
# $1 == pom.xml
version=`cat $1 | tr '\n' ' ' | sed 's#<versions>.*</versions>##' | sed 's#<dependencies>.*</dependencies>##' | grep '<version>' | sed -e 's#^.*<version>##;s#</version>.*$##'`
if [ -z $version ]
then
version=`grep currentVersion $1 | sed -e 's/^ *//;s/<currentVersion>//;s/<\/currentVersion>//'`
fi
artifactId=`cat $1 | tr '\n' ' ' | sed 's#<dependencies>.*</dependencies>##' | grep '<artifactId>' | sed -e 's#^.*<artifactId>##;s#</artifactId>.*$##'`
if [ -z $artifactId ]
then
artifactId=`cat $1 | tr '\n' ' ' | sed 's#<versions>.*</versions>##' | sed 's#<developers>.*</developers>##' | sed 's#<dependencies>.*</dependencies>##' | grep '<id>' | sed -e 's#^.*<id>##;s#</id>.*$##'`
fi
jarName="${artifactId}-${version}.jar"
echo $jarName
}
# returns the name under which the pom should be installed
getPomName()
{
version=`cat $1 | tr '\n' ' ' | sed 's#<versions>.*</versions>##' | sed 's#<dependencies>.*</dependencies>##' | grep '<version>' | sed -e 's#^.*<version>##;s#</version>.*$##'`
if [ -z $version ]
then
version=`grep currentVersion $1 | sed -e 's/^ *//;s/<currentVersion>//;s/<\/currentVersion>//'`
fi
artifactId=`cat $1 | tr '\n' ' ' | sed 's#<dependencies>.*</dependencies>##' | grep '<artifactId>' | sed -e 's#^.*<artifactId>##;s#</artifactId>.*$##'`
if [ -z $artifactId ]
then
artifactId=`cat $1 | tr '\n' ' ' | sed 's#<versions>.*</versions>##' | sed 's#<developers>.*</developers>##' | sed 's#<dependencies>.*</dependencies>##' | grep '<id>' | sed -e 's#^.*<id>##;s#</id>.*$##'`
fi
pomName="${artifactId}-${version}.pom"
echo $pomName
}
getGroupId()
{
groupId=`cat ${POM} | tr '\n' ' ' | sed 's#<dependencies>.*</dependencies>##' | grep '<groupId>' | sed -e 's#^.*<groupId>##;s#</groupId>.*$##'`
echo $groupId
}
copyResources()
{
# $1 == resourcesfile
# $2 == target directory
if [ -f $1 ]
then
resources=`cat $1`
for i in $resources
do
directory=`echo $i | awk 'BEGIN { FS = "@" } { print $1 }' | awk 'BEGIN { FS = "," } { print $1 }'`
targetPath=`echo $i | awk 'BEGIN { FS = "@" } { print $1 }' | awk 'BEGIN { FS = "," } { print $2 }'`
includes=`echo $i | awk 'BEGIN { FS = "@" } { print $2 }' | awk 'BEGIN { FS = "," } { for ( j = 1; j <= NF; j++ ) { printf( "%s ", $j ) } }'`
for include in $includes
do
if [ ! -d "$directory" ]
then
continue
fi
files=`eval "find $directory -name $include"`
for file in $files
do
# Replace the "/" with "@" to prevent shell expansion of *.properties
# to *.properties in the CWD.
tmpDirectory=`echo $directory | sed "s/\//@/g"`
tmpFile=`echo $file | sed "s/\//@/g"`
# Now grab the path excluding the original directory so we can translate that
# path into the target directory.
path=`echo $tmpFile | sed "s/$tmpDirectory//;s/\@/\//g;s/^\///"`
targetDirectory=$2
[ ! -z $MBOOT_DEBUG ] && echo "path = $path"
[ ! -z $path ] && translatedPath=`dirname $path`
[ ! -z $MBOOT_DEBUG ] && echo "translatedPath = $translatedPath"
if [ ! -z $targetPath ]
then
[ ! -z $MBOOT_DEBUG ] && echo "targetPath = $targetPath"
targetDirectory="${targetDirectory}/${targetPath}/${translatedPath}"
else
targetDirectory="${targetDirectory}/${translatedPath}"
fi
[ ! -z $MBOOT_DEBUG ] && echo "targetDirectory = $targetDirectory"
[ ! -d $targetDirectory ] && mkdir -p $targetDirectory
cp $file $targetDirectory > /dev/null 2>&1
done
done
done
find $2 -name 'CVS*' -exec rm -rf {} > /dev/null 2>&1 \;
fi
}
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
case "`uname`" in
CYGWIN*) cygwin=true ;;
Darwin*) darwin=true
if [ -z "$JAVA_HOME" ] ; then
JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
fi
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# You will need to specify JAVA_HOME if compiling with 1.2 or later.
if [ -n "$JAVA_HOME" ] ; then
if [ -f "$JAVA_HOME/lib/tools.jar" ] ; then
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar
fi
if [ -f "$JAVA_HOME/lib/classes.zip" ] ; then
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/classes.zip
fi
else
echo "Warning: JAVA_HOME environment variable not set."
echo " If build fails because sun.* classes could not be found"
echo " you will need to set the JAVA_HOME environment variable"
echo " to the installation directory of java."
fi
# IBM's JDK on AIX uses strange locations for the executables:
# JAVA_HOME/jre/sh for java and rmid
# JAVA_HOME/sh for javac and rmic
if [ -z "$JAVAC" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/sh/javac" ] ; then
JAVAC=${JAVA_HOME}/sh/javac;
else
JAVAC=${JAVA_HOME}/bin/javac;
fi
else
JAVAC=javac
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
else
JAVACMD=java
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly."
echo " We cannot execute $JAVACMD"
exit 1
fi
# For Cygwin, switch to Windows format before running java
if $cygwin; then
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
fi
export CLASSPATH

View File

@ -1,71 +0,0 @@
#!/bin/sh
VERSION=1.0
POM=pom.xml
usage ()
{
echo "usage: `basename $0` [--dir=<directory>] [--jar=<name>] [--install] [--pom-install] [-v] [--leave-boot-files] [--version] [--help]" >&2
echo "" >&2
echo " (ex: `basename $0` --dir=../builds/plexus --jar=plexus.jar)" >&2
exit 1
}
dir="."
jar="default"
leaveBootFiles="0"
install="0"
pomInstall="0"
while [ $# -gt 0 ]; do
case $1 in
--help)
usage
;;
--version)
echo "mboot: version $VERSION"
exit 0
;;
-v)
verbose=-v
;;
--dir*)
if echo $1 | grep -q '=' ; then
dir=`echo $1 | sed 's/^--dir=//'`
else
dir=$2
shift
fi
;;
--jar*)
if echo $1 | grep -q '=' ; then
jar=`echo $1 | sed 's/^--jar=//'`
else
jar=$2
shift
fi
;;
--leave-boot-files)
leaveBootFiles=1;
;;
--install)
install=1;
;;
--pom-install)
pomInstall=1;
;;
esac
shift
done
export MBOOT_HOME=`dirname $0`
. ${MBOOT_HOME}/maven.functions
[ ! -d $dir ] && echo "Specified directory doesn't exist!" && exit 1
[ ! -f $dir/${POM} ] && echo "No ${POM} in specified directory!" && exit 1
buildMavenProject $dir $jar $install $pomInstall $leaveBootFiles

View File

@ -1,83 +0,0 @@
#!/bin/sh
VERSION=1.0
usage ()
{
echo "usage: `basename $0` --model=<model> --version=<version> --mode=java|xsd|xpp3 --dir=<dir> --package-with-version" >&2
echo "" >&2
echo " (ex: `basename $0` --model=model.mdo --version=4.0.0 --mode=java --dir=target/src)" >&2
exit 1
}
dir="target/src/java"
model="model.mdo"
model_version=""
mode="java"
package_with_version=false
while [ $# -gt 0 ]; do
case $1 in
--help)
usage
;;
-v)
verbose=-v
;;
--dir*)
if echo $1 | grep -q '=' ; then
dir=`echo $1 | sed 's/^--dir=//'`
else
dir=$2
shift
fi
;;
--version*)
if echo $1 | grep -q '=' ; then
model_version=`echo $1 | sed 's/^--version=//'`
else
model_version=$2
shift
fi
;;
--model*)
if echo $1 | grep -q '=' ; then
model=`echo $1 | sed 's/^--model=//'`
else
model=$2
shift
fi
;;
--mode*)
if echo $1 | grep -q '=' ; then
mode=`echo $1 | sed 's/^--mode=//'`
else
mode=$2
shift
fi
;;
--package-with-version)
package_with_version=true
;;
esac
shift
done
export MBOOT_HOME=`dirname $0`
. ${MBOOT_HOME}/maven.functions
[ ! -f $model ] && echo "Specified model doesn't exist!" && exit 1
[ ! -d $dir ] && mkdir -p $dir
findAndSetMavenRepoLocal
CP=$repoLocal/modello/jars/modello-1.0-SNAPSHOT.jar:$repoLocal/xstream/jars/xstream-1.0-SNAPSHOT.jar:$repoLocal/xpp3/jars/xpp3-1.1.3.3.jar
if $cygwin; then
CP=`cygpath -pw "$CP"`
fi
java -classpath "$CP" org.codehaus.modello.Modello $model $mode "$dir" "$model_version" "$package_with_version"

View File

@ -1,75 +0,0 @@
#!/bin/sh
VERSION=1.0
usage ()
{
echo "usage: `basename $0` --mode=descriptor|xdoc --source=<source directory> --destination=<destination directory> --pom=<project file>" >&2
echo "" >&2
echo " (ex: `basename $0` --mode=descriptor --source=src/main/java --destination=target --pom=project.xml)" >&2
exit 1
}
dir="target/src/java"
mode="descriptor"
while [ $# -gt 0 ]; do
case $1 in
--help)
usage
;;
-v)
verbose=-v
;;
--destination*)
if echo $1 | grep -q '=' ; then
destination=`echo $1 | sed 's/^--destination=//'`
else
destination=$2
shift
fi
;;
--source*)
if echo $1 | grep -q '=' ; then
source=`echo $1 | sed 's/^--source=//'`
else
source=$2
shift
fi
;;
--mode*)
if echo $1 | grep -q '=' ; then
mode=`echo $1 | sed 's/^--mode=//'`
else
mode=$2
shift
fi
;;
--pom*)
if echo $1 | grep -q '=' ; then
pom=`echo $1 | sed 's/^--pom=//'`
else
pom=$2
shift
fi
;;
esac
shift
done
export MBOOT_HOME=`dirname $0`
. ${MBOOT_HOME}/maven.functions
[ ! -d $destination ] && mkdir -p $destination
findAndSetMavenRepoLocal
CP=$repoLocal/modello/jars/modello-1.0-SNAPSHOT.jar:$repoLocal/maven/jars/maven-plugin-2.0-SNAPSHOT.jar:$repoLocal/qdox/jars/qdox-1.2.jar:$repoLocal/xstream/jars/xstream-1.0-SNAPSHOT.jar:$repoLocal/xpp3/jars/xpp3-1.1.3.3.jar
if $cygwin; then
CP=`cygpath -pw "$CP"`
fi
java -classpath "$CP" org.apache.maven.plugin.generator.Main $mode "$source" "$destination" "$pom"

View File

@ -1,234 +0,0 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
public class ArtifactDownloader
{
public static final String SNAPSHOT_SIGNATURE = "-SNAPSHOT";
private File mavenRepoLocal;
private List remoteRepos;
private boolean useTimestamp = true;
private boolean ignoreErrors = true;
private String proxyHost;
private String proxyPort;
private String proxyUserName;
private String proxyPassword;
public ArtifactDownloader( Properties properties ) throws Exception
{
setRemoteRepo( properties.getProperty( "maven.repo.remote" ) );
String mavenRepoLocalProperty = properties.getProperty( "maven.repo.local" );
if ( mavenRepoLocalProperty == null )
{
mavenRepoLocalProperty = System.getProperty( "user.home" ) + "/.maven/repository";
}
mavenRepoLocal = new File( mavenRepoLocalProperty );
if ( !mavenRepoLocal.exists() )
{
if ( !mavenRepoLocal.mkdirs() )
{
System.err.println( "Cannot create the specified maven.repo.local: " + mavenRepoLocal );
System.exit( 1 );
}
}
if ( !mavenRepoLocal.canWrite() )
{
System.err.println( "Can't write to " + mavenRepoLocal.getAbsolutePath() );
System.exit( 1 );
}
writeFile( "bootstrap.repo", mavenRepoLocal.getPath() );
System.out.println( "Using the following for your maven.repo.local: " + mavenRepoLocal );
}
private void writeFile( String name, String contents )
throws Exception
{
Writer writer = new FileWriter( name );
writer.write( contents );
writer.close();
}
public File getMavenRepoLocal()
{
return mavenRepoLocal;
}
public void downloadDependencies( List files )
throws Exception
{
for ( Iterator j = files.iterator(); j.hasNext(); )
{
try
{
String file = (String) j.next();
File destinationFile = new File( mavenRepoLocal, file );
// The directory structure for this project may
// not exists so create it if missing.
File directory = destinationFile.getParentFile();
if ( directory.exists() == false )
{
directory.mkdirs();
}
if ( destinationFile.exists() && file.indexOf( SNAPSHOT_SIGNATURE ) < 0 )
{
continue;
}
log( "Downloading dependency: " + file );
getRemoteArtifact( file, destinationFile );
if ( !destinationFile.exists() )
{
throw new Exception( "Failed to download " + file );
}
}
catch ( Exception e )
{
throw new Exception( e );
}
}
}
private void setRemoteRepo( String repos )
{
remoteRepos = new ArrayList();
if ( repos == null )
{
remoteRepos.add( "http://www.ibiblio.org/maven/" );
return;
}
StringTokenizer st = new StringTokenizer( repos, "," );
while ( st.hasMoreTokens() )
{
remoteRepos.add( st.nextToken().trim() );
}
}
private List getRemoteRepo()
{
return remoteRepos;
}
private boolean getRemoteArtifact( String file, File destinationFile )
{
boolean fileFound = false;
for ( Iterator i = getRemoteRepo().iterator(); i.hasNext(); )
{
String remoteRepo = (String) i.next();
// The username and password parameters are not being
// used here. Those are the "" parameters you see below.
String url = remoteRepo + "/" + file;
if ( !url.startsWith( "file" ) )
{
url = replace( url, "//", "/" );
if ( url.startsWith( "https" ) )
{
url = replace( url, "https:/", "https://" );
}
else
{
url = replace( url, "http:/", "http://" );
}
}
// Attempt to retrieve the artifact and set the checksum if retrieval
// of the checksum file was successful.
try
{
HttpUtils.getFile( url,
destinationFile,
ignoreErrors,
useTimestamp,
proxyHost,
proxyPort,
proxyUserName,
proxyPassword,
true );
// Artifact was found, continue checking additional remote repos (if any)
// in case there is a newer version (i.e. snapshots) in another repo
fileFound = true;
}
catch ( FileNotFoundException e )
{
// Ignore
}
catch ( Exception e )
{
// If there are additional remote repos, then ignore exception
// as artifact may be found in another remote repo. If there
// are no more remote repos to check and the artifact wasn't found in
// a previous remote repo, then artifactFound is false indicating
// that the artifact could not be found in any of the remote repos
//
// arguably, we need to give the user better control (another command-
// line switch perhaps) of what to do in this case? Maven already has
// a command-line switch to work in offline mode, but what about when
// one of two or more remote repos is unavailable? There may be multiple
// remote repos for redundancy, in which case you probably want the build
// to continue. There may however be multiple remote repos because some
// artifacts are on one, and some are on another. In this case, you may
// want the build to break.
//
// print a warning, in any case, so user catches on to mistyped
// hostnames, or other snafus
log( "Error retrieving artifact from [" + url + "]: " );
}
}
return fileFound;
}
private String replace( String text, String repl, String with )
{
StringBuffer buf = new StringBuffer( text.length() );
int start = 0, end = 0;
while ( ( end = text.indexOf( repl, start ) ) != -1 )
{
buf.append( text.substring( start, end ) ).append( with );
start = end + repl.length();
}
buf.append( text.substring( start ) );
return buf.toString();
}
private void log( String message )
{
System.out.println( message );
}
}

View File

@ -1,386 +0,0 @@
/*
* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed 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.
* ====================================================================
*/
import java.io.ByteArrayOutputStream;
// import org.apache.commons.logging.Log;
// import org.apache.commons.logging.LogFactory;
/**
* Encode/Decode Base-64.
*
* @author John Casey
*/
public final class Base64
{
// private static final Log LOG = LogFactory.getLog( Base64.class );
private static final String CRLF = System.getProperty( "line.separator" );
private static final int LINE_END = 64;
public static String encode( byte[] data )
{
return Base64.encode( data, true );
}
public static String encode( byte[] data, boolean useLineDelimiter )
{
if ( data == null )
{
return null;
}
else if ( data.length == 0 )
{
return "";
}
int padding = 3 - ( data.length % 3 );
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "padding = " + padding + "characters." );
// }
StringBuffer buffer = new StringBuffer();
for ( int i = 0; i < data.length; i += 3 )
{
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "iteration base offset = " + i );
// }
int neutral = ( data[i] < 0 ? data[i] + 256 : data[i] );
int block = ( neutral & 0xff );
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "after first byte, block = " + Integer.toBinaryString( block ) );
// }
boolean inLastSegment = false;
block <<= 8;
if ( i + 1 < data.length )
{
neutral = ( data[i + 1] < 0 ? data[i + 1] + 256 : data[i + 1] );
block |= ( neutral & 0xff );
}
else
{
inLastSegment = true;
}
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "after second byte, block = " + Integer.toBinaryString( block ) + "; inLastSegment = "
// + inLastSegment );
// }
block <<= 8;
if ( i + 2 < data.length )
{
neutral = ( data[i + 2] < 0 ? data[i + 2] + 256 : data[i + 2] );
block |= ( neutral & 0xff );
}
else
{
inLastSegment = true;
}
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "after third byte, block = " + Integer.toBinaryString( block ) + "; inLastSegment = "
// + inLastSegment );
// }
char[] encoded = new char[4];
int encIdx = 0;
encoded[0] = toBase64Char( ( block >>> 18 ) & 0x3f );
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "first character = " + encoded[0] );
// }
encoded[1] = toBase64Char( ( block >>> 12 ) & 0x3f );
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "second character = " + encoded[1] );
// }
if ( inLastSegment && padding > 1 )
{
encoded[2] = '=';
}
else
{
encoded[2] = toBase64Char( ( block >>> 6 ) & 0x3f );
}
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "third character = " + encoded[2] );
// }
if ( inLastSegment && padding > 0 )
{
encoded[3] = '=';
}
else
{
encoded[3] = toBase64Char( block & 0x3f );
}
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "fourth character = " + encoded[3] );
// }
buffer.append( encoded );
}
if ( useLineDelimiter )
{
return canonicalize( buffer.toString() );
}
else
{
return buffer.toString();
}
}
public static byte[] decode( String src )
{
return Base64.decode( src, true );
}
public static byte[] decode( String src, boolean useLineDelimiter )
{
if ( src == null )
{
return null;
}
else if ( src.length() < 1 )
{
return new byte[0];
}
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "pre-canonicalization = \n" + src );
// }
String data = src;
if ( useLineDelimiter )
{
data = deCanonicalize( src );
}
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "post-canonicalization = \n" + data );
// }
ByteArrayOutputStream baos = new ByteArrayOutputStream();
char[] input = data.toCharArray();
int index = 0;
for ( int i = 0; i < input.length; i += 4 )
{
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "iteration base offset = " + i );
// }
int block = ( toBase64Int( input[i] ) & 0x3f );
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "block after first char [" + input[i] + "] = " + Integer.toBinaryString( block ) );
// }
block <<= 6;
block |= ( toBase64Int( input[i + 1] ) & 0x3f );
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "block after second char [" + input[i + 1] + "] = " + Integer.toBinaryString( block ) );
// }
boolean inPadding = false;
boolean twoCharPadding = false;
block <<= 6;
if ( input[i + 2] != '=' )
{
block |= ( toBase64Int( input[i + 2] ) & 0x3f );
}
else
{
twoCharPadding = true;
inPadding = true;
}
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "block after third char [" + input[i + 2] + "] = " + Integer.toBinaryString( block ) );
// }
block <<= 6;
if ( input[i + 3] != '=' )
{
block |= ( toBase64Int( input[i + 3] ) & 0x3f );
}
else
{
inPadding = true;
}
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "block after fourth char [" + input[i + 3] + "] = " + Integer.toBinaryString( block ) );
// }
baos.write( ( block >>> 16 ) & 0xff );
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "byte[" + ( index++ ) + "] = " + ( ( block >>> 16 ) & 0xff ) );
// }
if ( !inPadding || !twoCharPadding )
{
baos.write( ( block >>> 8 ) & 0xff );
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "byte[" + ( index++ ) + "] = " + ( ( block >>> 8 ) & 0xff ) );
// }
}
if ( !inPadding )
{
baos.write( block & 0xff );
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "byte[" + ( index++ ) + "] = " + ( block & 0xff ) );
// }
}
}
byte[] result = baos.toByteArray();
// if ( LOG.isDebugEnabled() )
// {
// LOG.debug( "byte array is " + result.length + " bytes long." );
// }
return result;
}
private static char toBase64Char( int input )
{
if ( input > -1 && input < 26 )
{
return ( char ) ( 'A' + input );
}
else if ( input > 25 && input < 52 )
{
return ( char ) ( 'a' + input - 26 );
}
else if ( input > 51 && input < 62 )
{
return ( char ) ( '0' + input - 52 );
}
else if ( input == 62 )
{
return '+';
}
else if ( input == 63 )
{
return '/';
}
else
{
return '?';
}
}
private static int toBase64Int( char input )
{
if ( input >= 'A' && input <= 'Z' )
{
return input - 'A';
}
else if ( input >= 'a' && input <= 'z' )
{
return input + 26 - 'a';
}
else if ( input >= '0' && input <= '9' )
{
return input + 52 - '0';
}
else if ( input == '+' )
{
return 62;
}
else if ( input == '/' )
{
return 63;
}
else
{
return 0;
}
}
private static String deCanonicalize( String data )
{
if ( data == null )
{
return null;
}
StringBuffer buffer = new StringBuffer( data.length() );
for ( int i = 0; i < data.length(); i++ )
{
char c = data.charAt( i );
if ( c != '\r' && c != '\n' )
{
buffer.append( c );
}
}
return buffer.toString();
}
private static String canonicalize( String data )
{
StringBuffer buffer = new StringBuffer( ( int ) ( data.length() * 1.1 ) );
int col = 0;
for ( int i = 0; i < data.length(); i++ )
{
if ( col == LINE_END )
{
buffer.append( CRLF );
col = 0;
}
buffer.append( data.charAt( i ) );
col++;
}
buffer.append( CRLF );
return buffer.toString();
}
}

View File

@ -1,915 +0,0 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Bootstrapper
{
private ArtifactDownloader downloader;
private BootstrapPomParser bootstrapPomParser;
private int pomVersion;
private List dependencies;
private UnitTests unitTests;
private Properties properties;
public static void main( String[] args )
throws Exception
{
Bootstrapper bootstrapper = new Bootstrapper();
bootstrapper.execute( args );
}
public void execute( String[] args )
throws Exception
{
properties = loadProperties( new File( System.getProperty( "user.home" ), "maven.properties" ) );
downloader = new ArtifactDownloader( properties );
bootstrapPomParser = new BootstrapPomParser();
if( ! bootstrapPomParser.parse( new File( "pom.xml" ) ) )
{
System.err.println( "Could not parse pom.xml" );
System.exit( 1 );
}
dependencies = bootstrapPomParser.getDependencies();
downloadDependencies();
writeClasspath();
writeUnitTest();
if ( bootstrapPomParser.getResources().size() == 0 )
{
writeFile( "bootstrap.resources", "src/main/resources@'*'" );
}
else
{
writeResources( bootstrapPomParser.getResources(), "bootstrap.resources" );
}
writeFile( "bootstrap.repo", downloader.getMavenRepoLocal().getPath() );
}
private void downloadDependencies()
throws Exception
{
List list = new ArrayList();
for ( Iterator i = dependencies.iterator(); i.hasNext(); )
{
Dependency d = (Dependency) i.next();
list.add( getArtifactPath( d, "/" ) );
}
downloader.downloadDependencies( list );
}
private void writeClasspath()
throws Exception
{
StringBuffer classPath = new StringBuffer();
StringBuffer libs = new StringBuffer();
StringBuffer deps = new StringBuffer();
String repoLocal = replace( downloader.getMavenRepoLocal().getPath(), "\\", "/" );
String classpathSeparator;
if ( repoLocal.indexOf( ":" ) != -1 ) //Windows
{
classpathSeparator = ";";
}
else
{
classpathSeparator = ":";
}
for ( Iterator i = dependencies.iterator(); i.hasNext(); )
{
Dependency d = (Dependency) i.next();
classPath.append( repoLocal + "/" + getArtifactPath( d, "/" ) + classpathSeparator );
libs.append( repoLocal + "/" + getArtifactPath( d, "/" ) + "\n" );
deps.append( getArtifactPath( d, "/" ) + "\n" );
}
writeFile( "bootstrap.classpath", classPath.toString() );
writeFile( "bootstrap.libs", libs.toString() );
writeFile( "bootstrap.deps", deps.toString() );
}
private void writeUnitTest()
throws Exception
{
int size;
unitTests = bootstrapPomParser.getUnitTests();
if ( unitTests != null )
{
StringBuffer tests = new StringBuffer();
tests.append( "target/test-classes" );
tests.append( "@" );
size = unitTests.getIncludes().size();
// If there are no unitTestIncludes specified then we want it all.
if ( size == 0 )
{
tests.append( "'*Test.java'" );
}
for ( int j = 0; j < size; j++ )
{
String include = (String) unitTests.getIncludes().get( j );
tests.append( include );
if ( j != size - 1 )
{
tests.append( "," );
}
}
tests.append( "\n" );
writeFile( "bootstrap.tests.includes", tests.toString() );
tests = new StringBuffer();
tests.append( "target/test-classes" );
tests.append( "@" );
size = unitTests.getExcludes().size();
if ( size == 0 )
{
tests.append( "*Abstract*.java'" );
}
for ( int j = 0; j < size; j++ )
{
String exclude = (String) unitTests.getExcludes().get( j );
tests.append( exclude );
if ( j != size - 1 )
{
tests.append( "," );
}
}
tests.append( "\n" );
writeFile( "bootstrap.tests.excludes", tests.toString() );
writeResources( unitTests.getResources(), "bootstrap.tests.resources" );
}
else
{
writeFile( "bootstrap.tests.includes", "target/test-classes@**/*Test.java" );
writeFile( "bootstrap.tests.excludes", "target/test-classes@**/*Abstract*.java" );
writeFile( "bootstrap.tests.resources", "src/test/resources@'*'" );
}
}
private void writeResources( List resources, String file )
throws Exception
{
StringBuffer res = new StringBuffer();
int size;
for ( Iterator i = resources.iterator(); i.hasNext(); )
{
Resource r = (Resource) i.next();
// Not sure why r would be null. Happening in drools-core.
if ( r == null )
{
continue;
}
res.append( r.getDirectory() );
if ( r.getTargetPath() != null )
{
res.append( "," ).append( r.getTargetPath() );
}
res.append( "@" );
size = r.getIncludes().size();
// If there are no unitTestIncludes specified then we want it all.
if ( size == 0 )
{
res.append( "'*'" );
}
for ( int j = 0; j < size; j++ )
{
String include = (String) r.getIncludes().get( j );
if ( include.startsWith( "**/" ) )
{
include = include.substring( 3 );
}
res.append( "'" ).append( include ).append( "'" );
if ( j != size - 1 )
{
res.append( "," );
}
}
res.append( "\n" );
}
writeFile( file, res.toString() );
}
private void writeFile( String name, String contents )
throws Exception
{
Writer writer = new FileWriter( name );
writer.write( contents );
writer.flush();
writer.close();
}
private String getArtifactPath( Dependency d, String pathSeparator )
{
return d.getArtifactDirectory() + pathSeparator + "jars" + pathSeparator + d.getArtifact();
}
private Properties loadProperties( File file )
{
try
{
return loadProperties( new FileInputStream( file ) );
}
catch ( Exception e )
{
// ignore
}
return new Properties();
}
private static Properties loadProperties( InputStream is )
{
Properties properties = new Properties();
try
{
if ( is != null )
{
properties.load( is );
}
}
catch ( IOException e )
{
// ignore
}
finally
{
try
{
if ( is != null )
{
is.close();
}
}
catch ( IOException e )
{
// ignore
}
}
return properties;
}
private String interpolate( String text, Map namespace )
{
Iterator keys = namespace.keySet().iterator();
while ( keys.hasNext() )
{
String key = keys.next().toString();
Object obj = namespace.get( key );
String value = obj.toString();
text = replace( text, "${" + key + "}", value );
if ( key.indexOf( " " ) == -1 )
{
text = replace( text, "$" + key, value );
}
}
return text;
}
private String replace( String text, String repl, String with )
{
return replace( text, repl, with, -1 );
}
private String replace( String text, String repl, String with, int max )
{
if ( text == null || repl == null || with == null || repl.length() == 0 )
{
return text;
}
StringBuffer buf = new StringBuffer( text.length() );
int start = 0, end = 0;
while ( ( end = text.indexOf( repl, start ) ) != -1 )
{
buf.append( text.substring( start, end ) ).append( with );
start = end + repl.length();
if ( --max == 0 )
{
break;
}
}
buf.append( text.substring( start ) );
return buf.toString();
}
class BootstrapPomParser
extends DefaultHandler
{
private String parentGroupId;
private String parentArtifactId;
private String parentVersion;
private List dependencies = new ArrayList();
private UnitTests unitTests;
private List resources = new ArrayList();
private Dependency currentDependency;
private Resource currentResource;
private SAXParserFactory saxFactory;
private boolean insideParent = false;
private boolean insideDependency = false;
private boolean insideUnitTest = false;
private boolean insideResource = false;
private StringBuffer bodyText = new StringBuffer();
private File file;
public List getDependencies()
{
return dependencies;
}
public UnitTests getUnitTests()
{
return unitTests;
}
public List getResources()
{
return resources;
}
public boolean parse( File file )
{
this.file = file;
try
{
saxFactory = SAXParserFactory.newInstance();
SAXParser parser = saxFactory.newSAXParser();
InputSource is = new InputSource( new FileInputStream( file ) );
parser.parse( is, this );
return true;
}
catch ( Exception e )
{
e.printStackTrace();
return false;
}
}
public void startElement( String uri, String localName, String rawName, Attributes attributes )
{
if ( rawName.equals( "parent" ) )
{
insideParent = true;
}
else if ( rawName.equals( "unitTest" ) )
{
unitTests = new UnitTests();
insideUnitTest = true;
}
else if ( rawName.equals( "dependency" ) )
{
currentDependency = new Dependency();
insideDependency = true;
}
else if ( rawName.equals( "resource" ) )
{
currentResource = new Resource();
insideResource = true;
}
}
public void characters( char buffer[], int start, int length )
{
bodyText.append( buffer, start, length );
}
private String getBodyText()
{
return bodyText.toString().trim();
}
public void endElement( String uri, String localName, String rawName )
throws SAXException
{
// support both v3 <extend> and v4 <parent>
if ( rawName.equals( "extend" ) || rawName.equals( "parent" ) )
{
File f;
if( rawName.equals( "extend" ) )
{
String extend = interpolate( getBodyText(), properties );
f = new File( file.getParentFile(), extend );
}
else
{
if ( parentArtifactId == null || parentArtifactId.trim().length() == 0 )
throw new SAXException( "Missing required element in <parent>: artifactId." );
if ( parentGroupId == null || parentGroupId.trim().length() == 0 )
throw new SAXException( "Missing required element in <parent>: groupId." );
if ( parentVersion == null || parentVersion.trim().length() == 0 )
throw new SAXException( "Missing required element in <parent>: version." );
f = new File( downloader.getMavenRepoLocal(), parentGroupId + "/poms/" + parentArtifactId + "-" + parentVersion + ".pom" );
}
BootstrapPomParser p = new BootstrapPomParser();
if ( ! p.parse( f ) )
throw new SAXException( "Could not parse parent pom.xml" );
dependencies.addAll( p.getDependencies() );
unitTests = p.getUnitTests();
resources.addAll( p.getResources() );
insideParent = false;
}
else if ( rawName.equals( "unitTest" ) )
{
insideUnitTest = false;
}
else if ( rawName.equals( "dependency" ) )
{
dependencies.add( currentDependency );
insideDependency = false;
}
else if ( rawName.equals( "resource" ) )
{
if ( insideUnitTest )
{
unitTests.addResource( currentResource );
}
else
{
resources.add( currentResource );
}
insideResource = false;
}
else if ( insideParent )
{
if ( rawName.equals( "groupId" ) )
{
parentGroupId = getBodyText();
}
else if ( rawName.equals( "artifactId" ) )
{
parentArtifactId = getBodyText();
}
else if ( rawName.equals( "version" ) )
{
parentVersion = getBodyText();
}
}
else if ( insideDependency )
{
if ( rawName.equals( "id" ) )
{
currentDependency.setId( getBodyText() );
}
else if ( rawName.equals( "version" ) )
{
currentDependency.setVersion( getBodyText() );
}
else if ( rawName.equals( "jar" ) )
{
currentDependency.setJar( getBodyText() );
}
else if ( rawName.equals( "type" ) )
{
currentDependency.setType( getBodyText() );
}
else if ( rawName.equals( "groupId" ) )
{
currentDependency.setGroupId( getBodyText() );
}
else if ( rawName.equals( "artifactId" ) )
{
currentDependency.setArtifactId( getBodyText() );
}
}
else if ( insideResource )
{
if ( rawName.equals( "directory" ) )
{
currentResource.setDirectory( getBodyText() );
}
else if ( rawName.equals( "targetPath" ) )
{
currentResource.setTargetPath( getBodyText() );
}
else if ( rawName.equals( "include" ) )
{
currentResource.addInclude( getBodyText() );
}
else if ( rawName.equals( "exclude" ) )
{
currentResource.addExclude( getBodyText() );
}
}
else if ( !insideResource && insideUnitTest )
{
if ( rawName.equals( "include" ) )
{
unitTests.addInclude( getBodyText() );
}
else if ( rawName.equals( "exclude" ) )
{
unitTests.addExclude( getBodyText() );
}
}
bodyText = new StringBuffer();
}
public void warning( SAXParseException spe )
{
printParseError( "Warning", spe );
}
public void error( SAXParseException spe )
{
printParseError( "Error", spe );
}
public void fatalError( SAXParseException spe )
{
printParseError( "Fatal Error", spe );
}
private final void printParseError( String type, SAXParseException spe )
{
System.err.println( type + " [line " + spe.getLineNumber() +
", row " + spe.getColumnNumber() + "]: " +
spe.getMessage() );
}
}
public static class Dependency
{
private String id;
private String version;
private String url;
private String jar;
private String artifactId;
private String groupId;
private String type = "jar";
public Dependency()
{
}
public void setId( String id )
{
this.id = id;
}
public String getId()
{
if ( isValid( getGroupId() )
&& isValid( getArtifactId() ) )
{
return getGroupId() + ":" + getArtifactId();
}
return id;
}
public void setGroupId( String groupId )
{
this.groupId = groupId;
}
public String getGroupId()
{
return groupId;
}
public String getArtifactDirectory()
{
if ( isValid( getGroupId() ) )
{
return getGroupId();
}
return getId();
}
public String getArtifactId()
{
return artifactId;
}
public void setArtifactId( String artifactId )
{
this.artifactId = artifactId;
}
public String getArtifact()
{
// If the jar name has been explicty set then use that. This
// is when the <jar/> element is explicity used in the POM.
if ( jar != null )
{
return jar;
}
if ( isValid( getArtifactId() ) )
{
return getArtifactId() + "-" + getVersion() + "." + getType();
}
else
{
return getId() + "-" + getVersion() + "." + getType();
}
}
public void setVersion( String version )
{
this.version = version;
}
public String getVersion()
{
return version;
}
public void setJar( String jar )
{
// This is a check we need because of the jelly interpolation
// process. If we don't check an empty string will be set and
// screw up getArtifact() above.
if ( jar.trim().length() == 0 )
{
return;
}
this.jar = jar;
}
public String getJar()
{
return jar;
}
public void setUrl( String url )
{
this.url = url;
}
public String getUrl()
{
return url;
}
public String getType()
{
return type;
}
public void setType( String type )
{
this.type = type;
}
private boolean isValid( String value )
{
if ( value != null
&& value.trim().equals( "" ) == false )
{
return true;
}
return false;
}
}
public static class UnitTests
implements Serializable
{
private String directory;
private List unitTestIncludes = new ArrayList();
private List unitTestExcludes = new ArrayList();
private List unitTestResources = new ArrayList();
public void addInclude( String pattern )
{
unitTestIncludes.add( pattern );
}
public void addExclude( String pattern )
{
unitTestExcludes.add( pattern );
}
public void addResource( Resource resource )
{
unitTestResources.add( resource );
}
public List getIncludes()
{
return unitTestIncludes;
}
public List getExcludes()
{
return unitTestExcludes;
}
public List getResources()
{
return unitTestResources;
}
public void setDirectory( String directory )
{
this.directory = directory;
}
public String getDirectory()
{
return this.directory;
}
}
public static class Resource
implements Serializable
{
private String directory;
private String targetPath;
private List includes = new ArrayList();
private List excludes = new ArrayList();
private boolean filtering;
public void addInclude( String pattern )
{
this.includes.add( pattern );
}
public void addExclude( String pattern )
{
this.excludes.add( pattern );
}
public List getIncludes()
{
return this.includes;
}
public List getExcludes()
{
return this.excludes;
}
public void setDirectory( String directory )
{
this.directory = directory;
}
public String getDirectory()
{
return this.directory;
}
public void setTargetPath( String targetPath )
{
this.targetPath = targetPath;
}
public String getTargetPath()
{
return targetPath;
}
public boolean getFiltering()
{
return filtering;
}
public void setFiltering( boolean filtering )
{
this.filtering = filtering;
}
}
}

View File

@ -1,399 +0,0 @@
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed 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.
* ====================================================================
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.net.URLConnection;
/**
* Http utils for retrieving files.
*
* @author costin@dnt.ro
* @author gg@grtmail.com (Added Java 1.1 style HTTP basic auth)
* @author <a href="mailto:jason@zenplex.com">Jason van Zyl</a>
*
* @todo Need to add a timeout so we can flip to a backup repository.
* @todo Download everything in a single session.
* @todo Throw meaningful exception when authentication fails.
*/
public class HttpUtils
{
/**
* Use a proxy to bypass the firewall with or without authentication
*
* @param proxyHost Proxy Host (if proxy is required), or null
* @param proxyPort Proxy Port (if proxy is required), or null
* @param proxyUserName Proxy Username (if authentification is required),
* or null
* @param proxyPassword Proxy Password (if authentification is required),
* or null
* @throws SecurityException if an operation is not authorized by the
* SecurityManager
*/
public static void useProxyUser( final String proxyHost,
final String proxyPort,
final String proxyUserName,
final String proxyPassword )
{
if ( proxyHost != null && proxyPort != null )
{
System.getProperties().put( "proxySet", "true" );
System.getProperties().put( "proxyHost", proxyHost );
System.getProperties().put( "proxyPort", proxyPort );
if ( proxyUserName != null )
{
Authenticator.setDefault( new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication( proxyUserName,
proxyPassword == null ? new char[0] : proxyPassword.toCharArray() );
}
} );
}
}
}
/**
* Retrieve a remote file. Throws an Exception on errors unless the
* ifnoreErrors flag is set to True
*
* @param url the of the file to retrieve
* @param destinationFile where to store it
* @param ignoreErrors whether to ignore errors during I/O or throw an
* exception when they happen
* @param useTimestamp whether to check the modified timestamp on the
* <code>destinationFile</code> against the remote <code>source</code>
* @param proxyHost Proxy Host (if proxy is required), or null
* @param proxyPort Proxy Port (if proxy is required), or null
* @param proxyUserName Proxy Username (if authentification is required),
* or null.
* @param proxyPassword Proxy Password (if authentification is required),
* or null.
* @param useChecksum Flag to indicate the use of the checksum for the retrieved
* artifact if it is available.
* @throws IOException If an I/O exception occurs.
*/
public static void getFile( String url,
File destinationFile,
boolean ignoreErrors,
boolean useTimestamp,
String proxyHost,
String proxyPort,
String proxyUserName,
String proxyPassword,
boolean useChecksum )
throws IOException
{
// Get the requested file.
getFile( url,
destinationFile,
ignoreErrors,
useTimestamp,
proxyHost,
proxyPort,
proxyUserName,
proxyPassword );
// Get the checksum if requested.
if ( useChecksum )
{
File checksumFile = new File( destinationFile + ".md5" );
try
{
getFile( url + ".md5",
checksumFile,
ignoreErrors,
useTimestamp,
proxyHost,
proxyPort,
proxyUserName,
proxyPassword );
}
catch ( Exception e )
{
// do nothing we will check later in the process
// for the checksums.
}
}
}
/**
* Retrieve a remote file. Throws an Exception on errors unless the
* ifnoreErrors flag is set to True
*
* @param url the of the file to retrieve
* @param destinationFile where to store it
* @param ignoreErrors whether to ignore errors during I/O or throw an
* exception when they happen
* @param useTimestamp whether to check the modified timestamp on the
* <code>destinationFile</code> against the remote <code>source</code>
* @param proxyHost Proxy Host (if proxy is required), or null
* @param proxyPort Proxy Port (if proxy is required), or null
* @param proxyUserName Proxy Username (if authentification is required),
* or null
* @param proxyPassword Proxy Password (if authentification is required),
* or null
* @throws IOException If an I/O exception occurs.
*/
public static void getFile( String url,
File destinationFile,
boolean ignoreErrors,
boolean useTimestamp,
String proxyHost,
String proxyPort,
String proxyUserName,
String proxyPassword )
throws IOException
{
//set the timestamp to the file date.
long timestamp = -1;
if ( useTimestamp && destinationFile.exists() )
{
timestamp = destinationFile.lastModified();
}
try
{
getFile( url,
destinationFile,
timestamp,
proxyHost,
proxyPort,
proxyUserName,
proxyPassword );
}
catch ( IOException ex )
{
if ( !ignoreErrors )
{
throw ex;
}
}
}
/**
* Retrieve a remote file.
*
* @param url the URL of the file to retrieve
* @param destinationFile where to store it
* @param timestamp if provided, the remote URL is only retrieved if it was
* modified more recently than timestamp. Otherwise, negative value indicates that
* the remote URL should be retrieved unconditionally.
* @param proxyHost Proxy Host (if proxy is required), or null
* @param proxyPort Proxy Port (if proxy is required), or null
* @param proxyUserName Proxy Username (if authentification is required),
* or null
* @param proxyPassword Proxy Password (if authentification is required),
* or null
* @throws IOException If an I/O exception occurs.
*/
public static void getFile( String url,
File destinationFile,
long timestamp,
String proxyHost,
String proxyPort,
String proxyUserName,
String proxyPassword )
throws IOException
{
String[] s = parseUrl( url );
String username = s[0];
String password = s[1];
String parsedUrl = s[2];
URL source = new URL( parsedUrl );
//set proxy connection
useProxyUser( proxyHost, proxyPort, proxyUserName, proxyPassword );
//set up the URL connection
URLConnection connection = source.openConnection();
//modify the headers
if ( timestamp >= 0 )
{
connection.setIfModifiedSince( timestamp );
}
// prepare Java 1.1 style credentials
if ( username != null || password != null )
{
String up = username + ":" + password;
String encoding = Base64.encode(up.getBytes(), false);
connection.setRequestProperty( "Authorization", "Basic " + encoding );
}
//connect to the remote site (may take some time)
connection.connect();
//next test for a 304 result (HTTP only)
if ( connection instanceof HttpURLConnection )
{
HttpURLConnection httpConnection = (HttpURLConnection) connection;
// although HTTPUrlConnection javadocs says FileNotFoundException should be
// thrown on a 404 error, that certainly does not appear to be the case, so
// test for 404 ourselves, and throw FileNotFoundException as needed
if ( httpConnection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND)
{
throw new FileNotFoundException(url.toString() + " (HTTP Error: "
+ httpConnection.getResponseCode() + " " + httpConnection.getResponseMessage() + ")");
}
if ( httpConnection.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED )
{
return;
}
// test for 401 result (HTTP only)
if ( httpConnection.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED )
{
throw new IOException( "Not authorized." );
}
// test for 407 result (HTTP only)
if ( httpConnection.getResponseCode() == HttpURLConnection.HTTP_PROXY_AUTH )
{
throw new IOException( "Not authorized by proxy." );
}
}
// REVISIT: at this point even non HTTP connections may support the
// if-modified-since behaviour - we just check the date of the
// content and skip the write if it is not newer.
// Some protocols (FTP) dont include dates, of course.
InputStream is = null;
IOException isException = null;
for ( int i = 0; i < 3; i++ )
{
try
{
is = connection.getInputStream();
break;
}
catch ( IOException ex )
{
isException = ex;
}
}
if ( is == null )
{
throw isException;
}
if ( connection.getLastModified() <= timestamp &&
connection.getLastModified() != 0 )
{
return;
}
FileOutputStream fos = new FileOutputStream( destinationFile );
byte[] buffer = new byte[100 * 1024];
int length;
while ( ( length = is.read( buffer ) ) >= 0 )
{
fos.write( buffer, 0, length );
System.out.print( "." );
}
System.out.println();
fos.close();
is.close();
// if (and only if) the use file time option is set, then the
// saved file now has its timestamp set to that of the downloaded
// file
if ( timestamp >= 0 )
{
long remoteTimestamp = connection.getLastModified();
if ( remoteTimestamp != 0 )
{
touchFile( destinationFile, remoteTimestamp );
}
}
}
/**
* Parse an url which might contain a username and password. If the
* given url doesn't contain a username and password then return the
* origin url unchanged.
*
* @param url The url to parse.
* @return The username, password and url.
* @throws RuntimeException if the url is (very) invalid
*/
static String[] parseUrl( String url )
{
String[] parsedUrl = new String[3];
parsedUrl[0] = null;
parsedUrl[1] = null;
parsedUrl[2] = url;
// We want to be able to deal with Basic Auth where the username
// and password are part of the URL. An example of the URL string
// we would like to be able to parse is like the following:
//
// http://username:password@repository.mycompany.com
int i = url.indexOf( "@" );
if ( i > 0 )
{
String protocol = url.substring( 0, url.indexOf("://") ) + "://";
String s = url.substring( protocol.length(), i );
int j = s.indexOf( ":" );
parsedUrl[0] = s.substring( 0, j );
parsedUrl[1] = s.substring( j + 1 );
parsedUrl[2] = protocol + url.substring( i + 1 );
}
return parsedUrl;
}
/**
* set the timestamp of a named file to a specified time.
*
* @param file the file to touch
* @param timemillis in milliseconds since the start of the era
* @return true if it succeeded. False means that this is a java1.1 system
* and that file times can not be set
* @throws RuntimeException Thrown in unrecoverable error. Likely this
* comes from file access failures.
*/
private static boolean touchFile( File file, long timemillis )
{
long modifiedTime;
if ( timemillis < 0 )
{
modifiedTime = System.currentTimeMillis();
}
else
{
modifiedTime = timemillis;
}
file.setLastModified( modifiedTime );
return true;
}
}

View File

@ -1,45 +0,0 @@
#!/bin/sh
echo "-----------------------------------------------------------------------"
echo Maven MBoot
echo "-----------------------------------------------------------------------"
if [ -z $MBOOT_HOME ]; then
echo
echo "Where would you like to install mboot? [ ~/mboot ] "
echo
read MBOOT_HOME
[ -z $MBOOT_HOME ] && MBOOT_HOME=$HOME/mboot
export MBOOT_HOME
fi
DIR=$MBOOT_HOME
echo "Installing mboot in $DIR ..."
export DIR
[ -d $DIR ] && rm -rf $DIR
mkdir $DIR
SKIP=`awk '/^__ARCHIVE_FOLLOWS__/ { print NR + 1; exit 0; }' $0`
# Take the TGZ portion of this file and pipe it to tar.
tail -n +$SKIP $0 | tar xz -C $DIR
. ${MBOOT_HOME}/maven.functions
echo "-----------------------------------------------------------------------"
echo "Installing MBoot dependencies ... "
echo "-----------------------------------------------------------------------"
downloadMBootDependencies
exit 0
__ARCHIVE_FOLLOWS__

View File

@ -1,26 +0,0 @@
-----
Maven MBoot
-----
Jason van Zyl
-----
Maven MBoot
Maven MBoot is the tool that is used to bootstrap m2. It is a mix of
some Java code and some bash glue which allows most m2 projects to be
built without m2 itself. The use of MBoot is limited to environments that
have access to a bash shell so any Linux system will do or Cygwin under
Windows. No attempt will be made to port MBoot to Windows so don't
bother asking. For consistency and reliability reasons that platform
for bootstrapping m2 will be a Linux machine. We have supported Cygwin
for some convenience but that's as far as we will go.
What can MBoot do?
MBoot can build m2 projects, but it also has some other capabilities that
are required by the m2 bootstrap process. MBoot also is a wrapper for
Modello and our plugin artifact generating tools. Modello is used to
generate the model sources, xpp3 reader, xpp3 writer, an XSD and the
documentation for m2's data model. We also generate the plugin
descriptors for the core m2 plugins as well as generating adapters
for m2 plugins that allow m2 plugins to run in maven 1.x.