#!/bin/sh
#
# Copyright 2001-2003 BBNT Solutions, LLC
# under sponsorship of the Defense Advanced Research Projects Agency (DARPA).
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the Cougaar Open Source License as published by
# DARPA on the Cougaar Open Source Website (www.cougaar.org).
#
# THE COUGAAR SOFTWARE AND ANY DERIVATIVE SUPPLIED BY LICENSOR IS
# PROVIDED 'AS IS' WITHOUT WARRANTIES OF ANY KIND, WHETHER EXPRESS OR
# IMPLIED, INCLUDING (BUT NOT LIMITED TO) ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND WITHOUT
# ANY WARRANTIES AS TO NON-INFRINGEMENT. IN NO EVENT SHALL COPYRIGHT
# HOLDER BE LIABLE FOR ANY DIRECT, SPECIAL, INDIRECT OR CONSEQUENTIAL
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE OF DATA OR PROFITS,
# TORTIOUS CONDUCT, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THE COUGAAR SOFTWARE.
#
#
# transform jar to add "memory tracker" profiling code
#
# run with "--help" for usage notes.
#
usage () {
cat < ...
EOF
exit 1
fi
# parse file
RET=`perl -ne\
'print join(" ", split(/,/, $1)) if (/^\s*'${2}'\s*=\s*(.*)$/);'\
$DEPENDENCY_FILE`
eval "$1=\"$RET\""
}
get_classpath () {
# optionally just use the bootstrapper!
if [ ! -z $BOOTSTRAP ]; then
eval "$1=\"\""
fi
# get jar dependencies from "default.build"
get_dependency SEPLIB "${MODULE}\.deps"
get_dependency SEPSYS "${MODULE}\.jars"
if [ -z "$SEPLIB" ] && [ -z "$SEPSYS" ]; then
echo " zero dependencies: $DEPENDENCY_FILE"
fi
LIBDEP=""
for x in $SEPLIB; do
if [ -f $CIP/lib/$x.jar ]; then
if [ -z $LIBDEP ]; then
LIBDEP="$CIP/lib/$x.jar"
else
LIBDEP="$LIBDEP;$CIP/lib/$x.jar"
fi
else
echo " missing dependency: $CIP/lib/$x.jar"
fi
done
SYSDEP=""
if [ -f $CIP/lib/javaiopatch.jar ]; then
SYSDEP=$CIP/lib/javaiopatch.jar
fi
for x in $SEPSYS; do
if [ -f $CIP/sys/$x.jar ]; then
if [ -z $SYSDEP ]; then
SYSDEP="$CIP/sys/$x.jar"
else
SYSDEP="$SYSDEP;$CIP/sys/$x.jar"
fi
else
echo " missing dependency: $CIP/sys/$x.jar"
fi
done
RET="$DIR/$MODULE.jar"
if [ ! -z $LIBDEP ]; then
RET="$RET;$LIBDEP"
fi
if [ ! -z $SYSDEP ]; then
RET="$RET;$SYSDEP"
fi
eval "$1=\"$RET\""
}
TMP_RET=""
get_transform_command () {
LIB=$2
if [ -z $BOOTSTRAP ]; then
CP="$BCEL;$CIP/lib/profiler_transform.jar;$CIP/lib/profiler_impl.jar"
if [ ! -z $LIB ]; then
CP="$CP;$LIB"
fi
BOOTCL=
else
CP=$CIP/lib/bootstrap.jar
if [ ! -e $CP ]; then
echo "bootstrap jar not found: $CP"
exit 1
fi
BOOTCL="org.cougaar.bootstrap.Bootstrapper"
fi
# basic command excluding classname and args
RET="java -classpath $CP $BOOTCL"
TMP_RET=$RET
# eval "$1=\"$RET\""
}
transform_one () {
LIB=$1
FILE=$2
echo " instrumenting $FILE"
get_transform_command COMMAND $LIB
COMMAND="$TMP_RET"
cd $TMP/$MODULE || exit 1
OLD=old/classes/$FILE
NEW=new/old/classes/$FILE
if [ ! -f $OLD ]; then
echo " file not found: $OLD"
exit 1
fi
COMMAND="$COMMAND \
org.cougaar.profiler.transform.SelfProfiler \
$OPTIONS \
$OLD"
if [ ! -z $VERBOSE ]; then
echo "$COMMAND to $NEW"
fi
$COMMAND > $NEW || exit 1
if [ ! -f $NEW ]; then
echo "Transform $FILE failed, missing $NEW"
exit 1
fi
}
transform () {
LIB=$1
echo " instrumenting"
get_transform_command COMMAND $LIB
COMMAND="$TMP_RET"
cd $TMP/$MODULE || exit 1
COMMAND="$COMMAND \
org.cougaar.profiler.transform.ProfileAll \
old \
$OPTIONS"
if [ ! -z $VERBOSE ]; then
echo $COMMAND
fi
$COMMAND || exit 1
if [ ! -d new/old/classes ]; then
echo "Transform $MODULE failed, missing $TMP/new/old/classes"
exit 1
fi
}
transform_jdk () {
NAME=$1
ORIG_FILTERS="$FILTERS"
if [ "$FILTERS" = "" ]; then
FILTERS="java/${NAME}/*"
fi
restore_jars
prepare_jdk $NAME
transform ""
create_jars
}
transform_cougaar () {
restore_jars
prepare_cougaar
get_classpath LIB
transform $LIB
create_jars
}
# parse "[/foo/]${MODULE}[.jar]"
BASE=`echo $MODULE | perl -ne 'print $2 if (/^(.*\/)?([^\/]*)(\.jar)(\.(old|new))*$/)'`
if [ ! -z $BASE ]; then
MODULE=$BASE
fi
if [ $MODULE = profiler_config ] ||
[ $MODULE = profiler_impl ] ||
[ $MODULE = profiler_transform ] ||
[ $MODULE = bootstrap ] ||
[ $MODULE = bcel ]; then
echo "skipping $MODULE"
exit 0
fi
if [ $MODULE = javaiopatch ]; then
# compatibility for Cougaar IO patch
$MODULE="java.io"
fi
# parse "java.${NAME}"
NAME=`echo $MODULE | perl -ne 'print $1 if (/^java\.(.*)$/)'`
if [ ! -z $NAME ]; then
MODULE="java${NAME}patch"
fi
# specify module in profiled class
OPTIONS="--module=$MODULE $OPTIONS"
get_dir DIR $NAME
if [ -z $FORCE ] && [ -e $DIR/$MODULE.jar.new ]; then
echo "already transformed $MODULE"
echo " linking $MODULE.jar.new -> $MODULE.jar"
echo " to force transform, run: $0 -f $MODULE"
link_jars
exit 0
fi
echo "transforming $MODULE"
if [ -z $NAME ]; then
transform_cougaar
else
transform_jdk $NAME
fi