@startuml
class data.Reader{
    +<init>():void
    +getClassFromJava(String):File
    +deleteClassFromJava(String):void
    +getCode(File):List<String>
}

class domain.ASMClass{
    -nestClasses:List<domain.MyClass>
    +<init>(org.objectweb.asm.tree.ClassNode,String):void
    +toClassUML():String
    +toRelationUML(List<String>):String
    +setDependent(List<String>):void
}

class domain.ASMField{
    +<init>(org.objectweb.asm.tree.FieldNode):void
    +toUML():String
}

class domain.ASMMethod{
    -instructions:org.objectweb.asm.tree.InsnList
    -methodInstructions:List<domain.MyMethodInsn>
    +<init>(org.objectweb.asm.tree.MethodNode):void
    +toUML():String
    +isGetter():boolean
    +isSetter():boolean
    +getInstructions():org.objectweb.asm.tree.InsnList
    +parseInstructions(org.objectweb.asm.tree.MethodNode):List<Ldomain.MyMethodInsn>
    +getMethodInstructions():List<Ldomain.MyMethodInsn>
}

class domain.ASMMethodInsn{
    -{final}methodInsnNode:org.objectweb.asm.tree.MethodInsnNode
    +<init>(org.objectweb.asm.tree.AbstractInsnNode):void
    +getOwner():String
    +getName():String
}

abstract class domain.Check{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
}

class domain.CheckAbstractInstance{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getConcreteClassesAbstractClass(domain.MyClass,List<Ldomain.MyClass>):List<Ldomain.MyClass>
    +getConcreteClassesInterface(domain.MyClass,List<Ldomain.MyClass>):List<Ldomain.MyClass>
    +isInterface(domain.MyClass):boolean
    +isAbstractClass(domain.MyClass):boolean
    +getName():String
}

class domain.CheckAccessModifier{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
}

class domain.CheckAdapterPattern{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getPossibleTargetsFromPossibleClients(List<Ldomain.MyClass>):List<Ldomain.MyClass>
    -getClassNode(String,List<Ldomain.MyClass>):domain.MyClass
    -getClassNames(List<Ldomain.MyClass>):List<String>
    +getPossibleAdaptersFromAdaptees(List<Ldomain.MyClass>):List<Ldomain.MyClass>
    -getFieldType(domain.MyField):String
    +getAdapters(List<Ldomain.MyClass>,List<Ldomain.MyClass>):List<Ldomain.MyClass>
    +getName():String
}

class domain.CheckCouplingCohesion{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
}

class domain.CheckDataClass{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
}

class domain.CheckDRY{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
}

class domain.CheckHollyWoodPrinciple{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
    +checkSuperClasses(domain.MyClass):boolean
    +checkHigherLevelClasses(domain.MyClass,List<Ldomain.MyClass>):boolean
    -getClassNames(List<Ldomain.MyClass>):List<String>
    -getClassNode(List<String>,List<Ldomain.MyClass>):List<Ldomain.MyClass>
}

class domain.CheckMethodChaining{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
}

class domain.CheckNamingConvention{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    -checkFieldNaming(domain.MyClass):String
    +getName():String
    -checkPackageNaming(domain.MyClass):String
    -checkClassNaming(domain.MyClass):String
    -checkMethodNaming(domain.MyClass):String
    -checkConstantsNaming(domain.MyClass):String
}

class domain.CheckObserverPattern{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
}

class domain.CheckTemplatePattern{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
}

class domain.CheckThreeLayer{
    +<init>():void
    +test(List<Ldomain.MyClass>):String
    +getName():String
}

class domain.ClassRelation{
    ~hasa:List<String,String>
    ~extend:List<String,String>
    ~implement:List<String,String>
    ~dependent:List<String,String>
    +<init>(List<Ldomain.MyClass>):void
}

abstract class domain.CohesionMetric{
    +<init>():void
}

class domain.Compiler{
    ~javac:javax.tools.JavaCompiler
    ~reader:data.Reader
    ~textArea:javax.swing.JTextArea
    +<init>():void
    +setTextArea(javax.swing.JTextArea):void
    +read(File[]):List<Ldomain.MyClass>
    +readSingleClass(File):domain.MyClass
    +readSub(File[]):List<Ldomain.MyClass>
    +readClass(File[]):List<Ldomain.MyClass>
}

abstract class domain.CouplingMetric{
    +<init>():void
}

class domain.FentonAndMeltonMetric{
    +<init>():void
}

class domain.LCOM4{
    +<init>():void
}

abstract class domain.MyClass{
    ~className:String
    ~packageName:String
    ~extend:String
    ~implement:List<String>
    ~fields:List<domain.MyField>
    ~methods:List<domain.MyMethod>
    ~dependent:List<String>
    ~isAbstract:boolean
    ~isInterface:boolean
    ~path:String
    ~code:List<String>
    +<init>():void
    +setDependent(List<String>):void
    +getFields():List<Ldomain.MyField>
    +getMethods():List<Ldomain.MyMethod>
    +getExtend():String
    +getImplement():List<String>
    +getName():String
    +getDependent():List<String>
    +setCode(List<String>):void
    +getCodeByLine(int):String
}

abstract class domain.MyField{
    ~name:String
    ~desc:String
    ~isList:boolean
    ~listType:String
    ~isStatic:boolean
    ~isFinal:boolean
    ~access:int
    +<init>():void
    +getType():String
    +getName():String
    +getAccess():int
}

abstract class domain.MyMethod{
    ~name:String
    ~access:int
    ~desc:String
    ~parameters:List<String>
    ~returnType:String
    ~isStatic:boolean
    ~isFinal:boolean
    ~dependent:List<String>
    +<init>():void
    +getDependent():List<String>
    +getName():String
    +getAccess():int
    +getInstructions():org.objectweb.asm.tree.InsnList
    +isGetter():boolean
    +isSetter():boolean
    +getMethodInstructions():List<Ldomain.MyMethodInsn>
}

abstract class domain.MyMethodInsn{
    +<init>():void
    +getOwner():String
    +getName():String
}

interface domain.UML{
    +toUML():String
    +{static}inputFromSignature(String):List<String>
    +{static}returnFromSignature(String):String
    +{static}replace(String):String
    +{static}typeConvert(String):String
}

class domain.UMLGenerator{
    -myClasses:List<domain.MyClass>
    -myClassNames:List<String>
    +<init>(List<Ldomain.MyClass>):void
    +generateAllUMLCode():String
}

class presentation.Main{
    +<init>():void
    +{static}main(String[]):void
}

class presentation.MainView{
    ~myClasses:List<domain.MyClass>
    ~c:domain.Compiler
    ~checks:List<domain.Check>
    ~textArea:javax.swing.JTextArea
    +<init>():void
}

class presentation.UMLViewer{
    +<init>(String):void
}

domain.ASMClass-->"*"domain.MyClass
domain.ASMClass--|>domain.MyClass
domain.ASMClass..>domain.ASMField
domain.ASMClass..>domain.ASMMethod
domain.ASMClass..>domain.Compiler
domain.ASMClass..>domain.MyField
domain.ASMClass..>domain.MyMethod
domain.ASMClass..>domain.MyClass
domain.ASMField--|>domain.MyField
domain.ASMField..|>domain.UML
domain.ASMMethod-->"*"domain.MyMethodInsn
domain.ASMMethod--|>domain.MyMethod
domain.ASMMethod..|>domain.UML
domain.ASMMethod..>domain.ASMMethodInsn
domain.ASMMethod..>domain.MyMethodInsn
domain.ASMMethodInsn--|>domain.MyMethodInsn
domain.Check..>domain.MyClass
domain.CheckAbstractInstance--|>domain.Check
domain.CheckAbstractInstance..>domain.MyClass
domain.CheckAccessModifier--|>domain.Check
domain.CheckAccessModifier..>domain.MyClass
domain.CheckAccessModifier..>domain.MyField
domain.CheckAccessModifier..>domain.MyMethod
domain.CheckAccessModifier..>domain.ASMMethod
domain.CheckAdapterPattern--|>domain.Check
domain.CheckAdapterPattern..>domain.MyClass
domain.CheckAdapterPattern..>domain.MyField
domain.CheckAdapterPattern..>domain.MyMethod
domain.CheckAdapterPattern..>domain.MyMethodInsn
domain.CheckCouplingCohesion--|>domain.Check
domain.CheckCouplingCohesion..>domain.MyClass
domain.CheckDataClass--|>domain.Check
domain.CheckDataClass..>domain.MyClass
domain.CheckDataClass..>domain.MyMethod
domain.CheckDRY--|>domain.Check
domain.CheckDRY..>domain.MyClass
domain.CheckHollyWoodPrinciple--|>domain.Check
domain.CheckHollyWoodPrinciple..>domain.MyClass
domain.CheckHollyWoodPrinciple..>domain.MyMethod
domain.CheckHollyWoodPrinciple..>domain.MyMethodInsn
domain.CheckMethodChaining--|>domain.Check
domain.CheckMethodChaining..>domain.MyClass
domain.CheckMethodChaining..>domain.MyMethod
domain.CheckMethodChaining..>domain.ASMMethod
domain.CheckNamingConvention--|>domain.Check
domain.CheckNamingConvention..>domain.MyClass
domain.CheckObserverPattern--|>domain.Check
domain.CheckObserverPattern..>domain.MyClass
domain.CheckTemplatePattern--|>domain.Check
domain.CheckTemplatePattern..>domain.MyClass
domain.CheckThreeLayer--|>domain.Check
domain.CheckThreeLayer..>domain.MyClass
domain.ClassRelation..>domain.MyClass
domain.Compiler-->"*"data.Reader
domain.Compiler..>data.Reader
domain.Compiler..>domain.MyClass
domain.Compiler..>domain.ASMClass
domain.FentonAndMeltonMetric--|>domain.CouplingMetric
domain.LCOM4--|>domain.CohesionMetric
domain.MyClass-->"*"domain.MyField
domain.MyClass-->"*"domain.MyMethod
domain.MyClass..>domain.MyField
domain.MyClass..>domain.MyMethod
domain.MyField..|>domain.UML
domain.MyMethod..|>domain.UML
domain.MyMethod..>domain.MyMethodInsn
domain.UMLGenerator-->"*"domain.MyClass
domain.UMLGenerator..>domain.MyClass
domain.UMLGenerator..>domain.ASMClass
presentation.Main..>presentation.MainView
presentation.MainView-->"*"domain.MyClass
presentation.MainView-->"*"domain.Compiler
presentation.MainView-->"*"domain.Check
presentation.MainView..>domain.CheckAccessModifier
presentation.MainView..>domain.CheckMethodChaining
presentation.MainView..>domain.CheckObserverPattern
presentation.MainView..>domain.CheckDataClass
presentation.MainView..>domain.CheckAbstractInstance
presentation.MainView..>domain.CheckHollyWoodPrinciple
presentation.MainView..>domain.CheckAdapterPattern
presentation.MainView..>domain.CheckCouplingCohesion
presentation.MainView..>domain.CheckThreeLayer
presentation.MainView..>domain.CheckNamingConvention
presentation.MainView..>domain.CheckTemplatePattern
presentation.MainView..>domain.CheckDRY
presentation.MainView..>domain.Compiler
presentation.MainView..>domain.Check
presentation.MainView..>domain.Check
presentation.MainView..>domain.MyClass
presentation.MainView..>domain.UMLGenerator
presentation.MainView..>presentation.UMLViewer
presentation.MainView..>domain.UMLGenerator
presentation.MainView..>domain.Compiler
presentation.MainView..>domain.Compiler
presentation.MainView..>domain.Compiler
@enduml
