Skip to content

Instantly share code, notes, and snippets.

@spudtrooper
Created October 31, 2011 13:45
Show Gist options
  • Save spudtrooper/1327521 to your computer and use it in GitHub Desktop.
Save spudtrooper/1327521 to your computer and use it in GitHub Desktop.
Generates java source from a jar file (e.g. for use in javadoc)
#!/bin/sh
#
# Transforms a jar file into source and outputs source files to 'src'.
# Example:
#
# jar2java foo.jar ; --> source to 'src'
#
# After you can run javadoc on these files, e.g.
#
# javadoc -classpath foo.jar -d api `find src -name "*.java"`
#
process_class()
{
src=$1; shift
jar=$1; shift
cls=$1; shift
file=$(echo $cls | sed 's/\./\//g')
file="$src/$file.java"
if [[ -f $file ]]; then
echo "Skipping $file"
return
fi
# Remove fully-qualified name
simple_cls=$(echo $cls | sed 's/.*\.//g')
text=$(javap -classpath "$jar" $cls | sed -e "s/$cls/$simple_cls/g")
# Add variable names, this is pretty gross
while [[ $text =~ ',' ]]; do
var="v_$RANDOM"
text=$(echo $text | sed "s/,/ $var# /")
done
text=$(echo $text | sed 's/#/,/g')
# Add bodies to methods with no params
text=$(echo $text | sed 's/();/() {}/g')
# Add last parameter and bodies to methods
while [[ $text =~ ');' ]]; do
var="v_$RANDOM"
text=$(echo $text | sed "s/);/ $var) {}/")
done
# Save if to the file
mkdir -p $(dirname $file)
echo $file
echo $text > $file
}
process()
{
src=$1; shift
jar=$1; shift
classes=$(jar tvf $jar | awk '/\.class$/ {print $NF}' | \
sed -e 's/\//./g' -e 's/.class$//g')
for cls in $classes; do
process_class $src $jar $cls
done
}
src="src"
mkdir -p $src
echo "Writing to $src"
for f in "$@"; do
process $src $f
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment