}
methodStack.add(method);
SequenceDiagramModel model = new SequenceDiagramModel();
model.setTitle(method.toString());
ImmutableActor srcActor = new ImmutableActor(method.getClassName()
.replace('.', '_'), CommonUtils.getClassNameSansPackage(method
.getClassName())
+ "." + method.getMethodName());
model.addActor(srcActor);
List<Instruction> code = classInfo.getMethodCode(method);
LineNumberTable lineNumberTable = classInfo.getLineNumberTable(method);
LineNumber[] lineNumbers = null;
if (lineNumberTable != null) {
lineNumbers = lineNumberTable.getLineNumberTable();
}
for (Instruction line : code) {
if (line instanceof InvokeInstruction) {
sLog.fine("InvokeInstruction - " + line.toString());
InvokeInstruction destInvokeInstruction = (InvokeInstruction) line;
final String invokedClassName = destInvokeInstruction
.getInvokedClass();
// Check if this is a class of interest.
if (filters != null) {
if (!checkPackageMatch(filters, invokedClassName)) {
sLog
.fine("Returning, since this class is not interesting.");
continue;
}
}
final ImmutableActor destActor = new ImmutableActor(
generateSequenceDiagramActorRef(destInvokeInstruction),
CommonUtils
.getClassNameSansPackage(destInvokeInstruction
.getInvokedClass())
+ "."
+ destInvokeInstruction.getInvokedMethod());
model.addMessage(new ImmutableMessage(srcActor, destActor,
generateSequenceDiagramMessage(destInvokeInstruction),
destInvokeInstruction.getInvokedMethodReturnType()));
// Experimentally, at this point, add a sequence diagram model
// for the destActor's invoked method.
if (followMethodCalls) {
sLog.fine(" method calls");
try {
MethodInfo destMethod = new MethodInfo(
invokedClassName, destInvokeInstruction
.getInvokedMethod(),
Utility.methodSignatureArgumentTypes(
destInvokeInstruction
.getInvokedMethodSignature(),
false),
Utility.methodSignatureReturnType(
destInvokeInstruction
.getInvokedMethodSignature(),
false), null);
if (!methodStack.contains(destMethod)) {
// methodStack.add(destMethod);
sLog.info("Following - "
+ destMethod.getClassName() + "."
+ destMethod.getMethodName());
SequenceDiagramContext ctx2 = new SequenceDiagramContext();
ctx2.setClassInfo(new ClassInfo(invokedClassName,
getClassLoader()));
ctx2.setFilters(ctx.getFilters());
ctx2.setFollowInvokedMethods(ctx
.getFollowInvokedMethods());
ctx2.setMethodInfo(destMethod);
ctx2.setShowInstructions(ctx.getShowInstructions());
ctx2.setShowSourceLines(ctx.getShowSourceLines());
ctx2.setSourceCodeManager(ctx
.getSourceCodeManager());
SequenceDiagramModel destActorInvocationModel = generateSequenceDiagramModel(
ctx2, methodStack);
if (destActorInvocationModel != null) {
model.merge(destActorInvocationModel);
}
}
} catch (NoSuchMethodException exc) {
sLog.warning(exc.getMessage());
}
} else {
sLog.fine("Not following method calls");
}
} else if (line instanceof PutfieldInstruction) {
if (showPutFieldInstructions) {
sLog.fine("PutfieldInstruction - " + line.toString());
PutfieldInstruction putFieldInstruction = (PutfieldInstruction) line;
final String invokedClassName = putFieldInstruction
.getInvokedClass();
// Check if this is a class of interest.
if (filters != null) {
if (!checkPackageMatch(filters, invokedClassName)) {
sLog
.fine("Returning, since this class is not interesting.");
continue;
}
}
final ImmutableActor destActor = srcActor;
model
.addMessage(new ImmutableMessage(
srcActor,
destActor,
generateSequenceDiagramMessage(putFieldInstruction)));
}
} else if (line instanceof GetfieldInstruction) {
if (showGetFieldInstructions) {
sLog.fine("GetfieldInstruction - " + line.toString());
GetfieldInstruction getFieldInstruction = (GetfieldInstruction) line;
final String invokedClassName = getFieldInstruction
.getInvokedClass();
// Check if this is a class of interest.
if (filters != null) {
if (!checkPackageMatch(filters, invokedClassName)) {
sLog
.fine("Returning, since this class is not interesting.");
continue;
}
}
final ImmutableActor destActor = srcActor;
model
.addMessage(new ImmutableMessage(
srcActor,
destActor,
generateSequenceDiagramMessage(getFieldInstruction)));