reduced fields and methods visibility
[javainspect.git] / src / main / java / eu / svjatoslav / inspector / java / structure / FieldDescriptor.java
1 /*
2  * JavaInspect - Utility to visualize java software
3  * Copyright (C) 2013-2015, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 3 of the GNU Lesser General Public License
7  * or later as published by the Free Software Foundation.
8  */
9
10 package eu.svjatoslav.inspector.java.structure;
11
12 import java.lang.reflect.Field;
13 import java.lang.reflect.ParameterizedType;
14 import java.lang.reflect.Type;
15 import java.util.ArrayList;
16 import java.util.List;
17
18 public class FieldDescriptor implements GraphElement {
19
20         /**
21          * This class corresponds to single field within a java class.
22          */
23
24         public String name;
25         private ClassDescriptor type;
26         private final ClassDescriptor parentClass;
27         List<ClassDescriptor> typeArguments = new ArrayList<ClassDescriptor>();
28
29         public boolean isInherited;
30
31         public FieldDescriptor(final ClassDescriptor parent) {
32                 parentClass = parent;
33         }
34
35         public void analyzeField(final Field field) {
36
37                 if (!field.getDeclaringClass().getName()
38                                 .equals(parentClass.getFullyQualifiedName()))
39                         isInherited = true;
40
41                 // if (field.getType().isArray())
42                 // System.out.println("field name: " + field.getName());
43
44                 name = field.getName();
45                 type = parentClass.getClassGraph().getOrCreateClassDescriptor(
46                                 field.getType());
47                 type.registerReference();
48
49                 final Type genericType = field.getGenericType();
50                 if (genericType instanceof ParameterizedType) {
51                         final ParameterizedType pt = (ParameterizedType) genericType;
52                         for (final Type t : pt.getActualTypeArguments())
53                                 if (t instanceof Class) {
54                                         final Class cl = (Class) t;
55                                         final ClassDescriptor genericTypeDescriptor = parentClass
56                                                         .getClassGraph().getOrCreateClassDescriptor(cl);
57                                         genericTypeDescriptor.registerReference();
58                                         typeArguments.add(genericTypeDescriptor);
59                                 }
60
61                 }
62         }
63
64         @Override
65         public String getDot() {
66
67                 if (!isVisible())
68                         return "";
69
70                 final StringBuffer result = new StringBuffer();
71
72                 // describe associated types
73                 for (final ClassDescriptor classDescriptor : typeArguments)
74                         if (classDescriptor.isVisible())
75                                 if (classDescriptor.areReferencesShown())
76                                         result.append("    " + getGraphId() + " -> "
77                                                         + classDescriptor.getGraphId() + "[label=\"" + name
78                                                         + "\", color=\"" + classDescriptor.getColor()
79                                                         + "\", style=\"bold\"];\n");
80
81                 if (!type.isVisible())
82                         return result.toString();
83
84                 // main type
85                 boolean showLink = type.areReferencesShown();
86
87                 if (type == parentClass)
88                         showLink = false;
89
90                 if (parentClass.isEnum)
91                         showLink = false;
92
93                 if (showLink)
94                         result.append("    " + getGraphId() + " -> " + type.getGraphId()
95                                         + "[label=\"" + name + "\"," + " color=\""
96                                         + type.getColor() + "\", style=\"bold\"];\n");
97
98                 return result.toString();
99         }
100
101         @Override
102         public String getEmbeddedDot() {
103
104                 if (!isVisible())
105                         return "";
106
107                 final StringBuffer result = new StringBuffer();
108
109                 result.append("        // " + name + "\n");
110                 if (parentClass.isEnum && (type == parentClass)) {
111                         result.append("        <TR><TD colspan=\"2\" PORT=\"" + name);
112                         result.append("\" ALIGN=\"left\"><FONT POINT-SIZE=\"11.0\">");
113                         result.append(name + "</FONT></TD></TR>\n");
114                 } else {
115                         result.append("        <TR><td ALIGN=\"right\">");
116                         result.append("<FONT POINT-SIZE=\"8.0\">");
117                         result.append(type.getClassName(true) + "</FONT>");
118                         result.append("</td><TD PORT=\"" + name);
119                         result.append("\" ALIGN=\"left\"><FONT POINT-SIZE=\"11.0\">");
120                         result.append(name + "</FONT></TD></TR>\n");
121                 }
122                 return result.toString();
123         }
124
125         @Override
126         public String getGraphId() {
127                 return parentClass.getGraphId() + ":" + name;
128         }
129
130         public int getOutsideVisibleReferencesCount() {
131
132                 if (!isVisible())
133                         return 0;
134
135                 if (type != null)
136                         if (type.isVisible())
137                                 return 1;
138
139                 return 0;
140         }
141
142         public ClassDescriptor getType() {
143                 return type;
144         }
145
146         @Override
147         public boolean isVisible() {
148                 if (isInherited)
149                         return false;
150
151                 if (name.contains("$"))
152                         return false;
153
154                 if (name.equals("serialVersionUID"))
155                         return false;
156
157                 return true;
158         }
159
160 }