Created
October 31, 2011 13:45
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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