Skip to content

Commit fdfff11

Browse files
author
CJ Miller
committed
Milestone 4 work.
1 parent b513bfe commit fdfff11

12 files changed

Lines changed: 133 additions & 26 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/bin/
22
/output.txt
3+
*.txt

src/edu/rosehulman/cjjb/JavaModelClassVisitor.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
public class JavaModelClassVisitor {
2020

2121
public Set<String> classes;
22-
public OutputStream out;
2322
public static final String boilerPlate = "digraph G { fontname = \"Bitstream Vera Sans\" fontsize = 8 node [ fontname = \"Bitstream Vera Sans\" fontsize = 8 shape = \"record\" ] edge [ fontname = \"Bitstream Vera Sans\" fontsize = 8 ]";
2423

2524
private JavaModel model;
@@ -29,16 +28,15 @@ public class JavaModelClassVisitor {
2928

3029

3130
public JavaModelClassVisitor(Set<String> classes, OutputStream out) {
32-
this(classes, out, null, null, 0);
31+
this(classes, null, null, 0);
3332
}
3433

35-
public JavaModelClassVisitor(OutputStream out, String classSearch, QualifiedMethod methodSearch, int depth) {
36-
this(null, out, classSearch, methodSearch, depth);
34+
public JavaModelClassVisitor(String classSearch, QualifiedMethod methodSearch, int depth) {
35+
this(null, classSearch, methodSearch, depth);
3736
}
3837

39-
public JavaModelClassVisitor(Set<String> classes, OutputStream out, String classSearch, QualifiedMethod methodSearch, int depth) {
38+
public JavaModelClassVisitor(Set<String> classes, String classSearch, QualifiedMethod methodSearch, int depth) {
4039
this.classes = classes;
41-
this.out = out;
4240

4341
this.model = new JavaModel(classes);
4442

src/edu/rosehulman/cjjb/Main.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,18 @@ public class Main {
2727
* "problem.JarWatcher", "problem.TextPrinterWatcher",
2828
* "problem.TxtWatcher", "problem.IWatcher"
2929
*/
30+
// "java.lang.Runtime",
31+
// "java.io.FilterInputStream",
32+
// "java.awt.Desktop",
33+
"java.util.Calendar"
34+
3035
};
3136

3237
public static final String[] PACKAGES = {
33-
//"edu.rosehulman.cjjb"//, "edu.rosehulman.asm"
34-
// "headfirst.factory.pizzaaf", "headfirst.factory.pizzafm"
38+
// "edu.rosehulman.cjjb", "edu.rosehulman.asm", "edu.rosehulman.cjjb.javaModel",
39+
// "edu.rosehulman.cjjb.javaModel.checks", "edu.rosehulman.cjjb.javaModel.modifier",
40+
// "edu.rosehulman.cjjb.javaModel.visitor"
41+
// "headfirst.factory.pizzaaf", "headfirst.factory.pizzafm"
3542
};
3643

3744
public static final String boilerPlate = "digraph G { fontname = \"Bitstream Vera Sans\" fontsize = 8 node [ fontname = \"Bitstream Vera Sans\" fontsize = 8 shape = \"record\" ] edge [ fontname = \"Bitstream Vera Sans\" fontsize = 8 ]";
@@ -50,7 +57,7 @@ public static void main(String[] args) throws IOException, ClassNotFoundExceptio
5057
QualifiedMethod qm = new QualifiedMethod(getMethodFromArgs(args), getDescFromArgs(args));
5158
// QualifiedMethod qm = new QualifiedMethod("shuffle", "(Ljava/util/List;)V");
5259
String clazz = getClassFromArgs(args);
53-
JavaModelClassVisitor visitor = new JavaModelClassVisitor(out, clazz, qm, 2);
60+
JavaModelClassVisitor visitor = new JavaModelClassVisitor(clazz, qm, 2);
5461

5562
visitor.buildSeqModel();
5663
ISequenceVisitor seqVisitor = new SDSequenceVisitor(clazz, qm, 2, out);
@@ -66,11 +73,11 @@ public static void main(String[] args) throws IOException, ClassNotFoundExceptio
6673

6774
visitor = new JavaModelClassVisitor(classesToVisit, out);
6875
visitor.buildUMLModel();
69-
IUMLVisitor umlVisitor = new UMLDotVisitor(out);
76+
IUMLVisitor umlVisitor = new UMLDotVisitor(out, visitor.getModel());
7077
visitor.getModel().accept(umlVisitor);
7178
break;
7279
case "EXAMPLE":
73-
exampleCall(new FileOutputStream("output.txt"));
80+
exampleCall(new FileOutputStream("umlOutput.txt"), new FileOutputStream("seqOutput.txt"));
7481
break;
7582
default:
7683
System.out.println("Not a valid diagram type. Valid Types: SEQ|UML|EXAMPLE");
@@ -133,7 +140,7 @@ private static List<String> getClassesFromArgs(String[] args) {
133140
return toReturn;
134141
}
135142

136-
private static void exampleCall(OutputStream out ) throws IOException, ClassNotFoundException {
143+
private static void exampleCall(OutputStream umlOut, OutputStream seqOut) throws IOException, ClassNotFoundException {
137144
Set<String> classesToVisit = new HashSet<String>();
138145
classesToVisit.addAll(Arrays.asList(CLASSES));
139146

@@ -142,14 +149,14 @@ private static void exampleCall(OutputStream out ) throws IOException, ClassNotF
142149
}
143150

144151
QualifiedMethod qm = new QualifiedMethod("shuffle", "(Ljava/util/List;)V");
145-
JavaModelClassVisitor visitor = new JavaModelClassVisitor(classesToVisit, out, "java.util.Collections", qm, 2);
152+
JavaModelClassVisitor visitor = new JavaModelClassVisitor(classesToVisit, "java.util.Collections", qm, 2);
146153

147154
visitor.buildUMLModel();
148-
IUMLVisitor umlVisitor = new UMLDotVisitor(out);
155+
IUMLVisitor umlVisitor = new UMLDotVisitor(umlOut, visitor.getModel());
149156
visitor.getModel().accept(umlVisitor);
150157

151158
visitor.buildSeqModel();
152-
ISequenceVisitor seqVisitor = new SDSequenceVisitor("java.util.Collections", qm, 2, out);
159+
ISequenceVisitor seqVisitor = new SDSequenceVisitor("java.util.Collections", qm, 2, seqOut);
153160
visitor.getModel().accept(seqVisitor);
154161
}
155162

src/edu/rosehulman/cjjb/asm/ClassMethodVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public ClassMethodVisitor(int api, ClassVisitor decorated, String className, Jav
2222
@Override
2323
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
2424
//System.out.println("Method: " + className + " : " + name);
25-
25+
System.out.println(name + " " + desc);
2626
MethodVisitor toDecorate = super.visitMethod(access, name, desc, signature, exceptions);
2727
boolean isConstructor = false;
2828
if(name.contains("<init>")) {

src/edu/rosehulman/cjjb/asm/ClassSequnceMethodVisitor.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ public void visitMethodInsn(int opcode, String owner, String name, String desc,
2525
name = owner;
2626
}
2727
name = Utils.shortName(Utils.getCleanName(name));
28-
2928
seqStructure.addMethod(Utils.getCleanName(owner), new QualifiedMethod(name, desc));
3029
}
3130
}

src/edu/rosehulman/cjjb/asm/Utils.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,15 @@ public static String shortName(String name) {
148148

149149
return name;
150150
}
151+
152+
153+
public static String getAsmName(String c) {
154+
String toReturn = Type.getType("L" + c.replace(".", "/") + ";").getClassName();
155+
156+
if(toReturn.length() > 1) {
157+
toReturn = "L" + toReturn;
158+
}
159+
160+
return toReturn;
161+
}
151162
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package edu.rosehulman.cjjb.javaModel.checks;
2+
3+
import edu.rosehulman.cjjb.javaModel.AbstractJavaStructure;
4+
import edu.rosehulman.cjjb.javaModel.JavaModel;
5+
6+
public interface IModelStructureBooleanCheck {
7+
public boolean check(JavaModel model, AbstractJavaStructure structure);
8+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package edu.rosehulman.cjjb.javaModel.checks;
2+
3+
import java.util.List;
4+
5+
import com.sun.glass.ui.CommonDialogs.Type;
6+
import com.sun.xml.internal.ws.wsdl.writer.document.Types;
7+
8+
import edu.rosehulman.cjjb.asm.QualifiedMethod;
9+
import edu.rosehulman.cjjb.asm.Utils;
10+
import edu.rosehulman.cjjb.javaModel.AbstractJavaElement;
11+
import edu.rosehulman.cjjb.javaModel.AbstractJavaStructure;
12+
import edu.rosehulman.cjjb.javaModel.Interface;
13+
import edu.rosehulman.cjjb.javaModel.JavaModel;
14+
import edu.rosehulman.cjjb.javaModel.Method;
15+
import edu.rosehulman.cjjb.javaModel.modifier.AbstractModifier;
16+
import edu.rosehulman.cjjb.javaModel.modifier.IModifier;
17+
import edu.rosehulman.cjjb.javaModel.modifier.StaticModifier;
18+
19+
public class SingletonCheck implements IModelStructureBooleanCheck {
20+
21+
@Override
22+
public boolean check(JavaModel model, AbstractJavaStructure structure) {
23+
// Only classes can be singletons
24+
if(structure instanceof Interface)
25+
return false;
26+
27+
if(checkForStaticInstance(structure))
28+
return true;
29+
30+
if(checkForGetInstance(model, structure))
31+
return true;
32+
33+
return false;
34+
}
35+
36+
private boolean checkForStaticInstance(AbstractJavaStructure structure) {
37+
for(AbstractJavaElement element: structure.subElements) {
38+
if(element.name.equalsIgnoreCase("instance"))
39+
if(checkForModifier(element.modifiers, StaticModifier.class))
40+
return true;
41+
}
42+
return false;
43+
}
44+
45+
private boolean checkForModifier(List<IModifier> modifiers, Class<?> c) {
46+
for(IModifier mod: modifiers)
47+
if(c.isInstance(mod))
48+
return true;
49+
50+
return false;
51+
}
52+
53+
private boolean checkForGetInstance(JavaModel model, AbstractJavaStructure structure) {
54+
Method method = structure.getMethodByQualifiedName(new QualifiedMethod("getInstance", "()" + Utils.getAsmName(structure.name)), model);
55+
56+
if(method == null)
57+
method = structure.getMethodByQualifiedName(new QualifiedMethod("get" + Utils.shortName(structure.name), "()" + Utils.getAsmName(structure.name)), model);
58+
59+
if(method == null)
60+
return false;
61+
62+
if(method.arguments != null && method.arguments.size() != 0)
63+
return false;
64+
65+
if(!checkForModifier(method.modifiers, StaticModifier.class))
66+
return false;
67+
68+
if(method.type.equals(structure))
69+
return true;
70+
71+
return false;
72+
}
73+
74+
}

src/edu/rosehulman/cjjb/javaModel/visitor/SDSequenceVisitor.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ public SDSequenceVisitor(String className, QualifiedMethod method, int depth, Ou
2828

2929
@Override
3030
public void visit(JavaModel model) throws IOException {
31-
32-
out.write(String.format("%s:%s", "<variable name>", this.className).getBytes());
33-
3431
AbstractJavaStructure struct = model.getStructure(className);
3532
Method element = struct.getMethodByQualifiedName(this.method, model);
3633

@@ -44,7 +41,7 @@ public void visit(JavaModel model) throws IOException {
4441
List<String> sdCalls = new ArrayList<String>();
4542

4643

47-
//objects.add(className.replace(".", "\\.") + "[a]");
44+
objects.add(className.replace(".", "\\."));
4845

4946
addCalls(this.depth, objects, sdCalls, method);
5047

src/edu/rosehulman/cjjb/javaModel/visitor/UMLDotVisitor.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import edu.rosehulman.cjjb.javaModel.JavaModel;
1313
import edu.rosehulman.cjjb.javaModel.Method;
1414
import edu.rosehulman.cjjb.javaModel.Relation;
15+
import edu.rosehulman.cjjb.javaModel.checks.IModelStructureBooleanCheck;
16+
import edu.rosehulman.cjjb.javaModel.checks.SingletonCheck;
1517
import edu.rosehulman.cjjb.javaModel.modifier.IAccessModifier;
1618
import edu.rosehulman.cjjb.javaModel.modifier.PrivateModifier;
1719
import edu.rosehulman.cjjb.javaModel.modifier.ProtectedModifier;
@@ -20,11 +22,14 @@
2022

2123
public class UMLDotVisitor implements IUMLVisitor {
2224

23-
OutputStream out;
25+
private OutputStream out;
26+
private JavaModel model;
2427

2528
public static final String BOILER_PLATE = "digraph G { fontname = \"Bitstream Vera Sans\" fontsize = 8 node [ fontname = \"Bitstream Vera Sans\" fontsize = 8 shape = \"record\" ] edge [ fontname = \"Bitstream Vera Sans\" fontsize = 8 ]\n";
2629

27-
public UMLDotVisitor(OutputStream out) {
30+
31+
32+
public UMLDotVisitor(OutputStream out, JavaModel model) {
2833
this.out = out;
2934
}
3035

@@ -36,7 +41,14 @@ public void visitStart() throws IOException {
3641
@Override
3742
public void visit(Class clazz) throws IOException {
3843
out.write(String.format("\"%s\"", clazz.name).getBytes());
39-
out.write(String.format(" [ label = \"{%s|", clazz.name).getBytes());
44+
45+
IModelStructureBooleanCheck singleton = new SingletonCheck();
46+
String extraAfter = "";
47+
48+
if(singleton.check(model, clazz))
49+
extraAfter += "\\l\\<\\<Singleton\\>\\>";
50+
51+
out.write(String.format(" [ label = \"{%s%s|", clazz.name, extraAfter).getBytes());
4052
}
4153

4254
@Override

0 commit comments

Comments
 (0)