X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Finspector%2Fjava%2Fstructure%2FFieldDescriptor.java;h=11959da6b6e0e25d3c5d0e2f83bba1396ee8f8af;hb=4aabbddd2f592ec80977a20cf2ad58cc3ede802b;hp=5b141e3156fcd6f5257cc213821e3c75be337029;hpb=8285a2e198a01177b14e528f8e12de2f7d5273e9;p=javainspect.git diff --git a/src/main/java/eu/svjatoslav/inspector/java/structure/FieldDescriptor.java b/src/main/java/eu/svjatoslav/inspector/java/structure/FieldDescriptor.java old mode 100644 new mode 100755 index 5b141e3..11959da --- a/src/main/java/eu/svjatoslav/inspector/java/structure/FieldDescriptor.java +++ b/src/main/java/eu/svjatoslav/inspector/java/structure/FieldDescriptor.java @@ -1,10 +1,10 @@ /* * JavaInspect - Utility to visualize java software - * Copyright (C) 2013, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu - * + * Copyright (C) 2013-2017, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu + * * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public License - * as published by the Free Software Foundation. + * modify it under the terms of version 3 of the GNU Lesser General Public License + * or later as published by the Free Software Foundation. */ package eu.svjatoslav.inspector.java.structure; @@ -15,137 +15,146 @@ import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; +/** + * This class corresponds to single field within a java class. + */ + public class FieldDescriptor implements GraphElement { - /** - * This class corresponds to single field within a java class. - */ - - public String name; - private ClassDescriptor type; - private ClassDescriptor parent; - List typeArguments = new ArrayList(); - - public FieldDescriptor(final Field field, final ClassDescriptor parent, - final ClassGraph dump) { - - this.parent = parent; + private final ClassDescriptor parentClassDescriptor; + private final List typeArguments = new ArrayList(); + private String name; + private ClassDescriptor type; + private boolean isInherited; + + public FieldDescriptor(final ClassDescriptor parent) { + parentClassDescriptor = parent; + } + + public void analyzeField(final Field field) { + + if (!field.getDeclaringClass().getName() + .equals(parentClassDescriptor.getFullyQualifiedName())) + isInherited = true; + + name = field.getName(); + type = parentClassDescriptor.getClassGraph().getOrCreateClassDescriptor( + field.getType()); + type.registerReference(); + + final Type fieldGenericType = field.getGenericType(); + if (fieldGenericType instanceof ParameterizedType) { + final ParameterizedType fieldParameterizedGenericType = (ParameterizedType) fieldGenericType; + for (final Type type : fieldParameterizedGenericType.getActualTypeArguments()) + if (type instanceof Class) { + final Class aClass = (Class) type; + final ClassDescriptor genericTypeDescriptor = parentClassDescriptor + .getClassGraph().getOrCreateClassDescriptor(aClass); + genericTypeDescriptor.registerReference(); + typeArguments.add(genericTypeDescriptor); + } + + } + } + + @Override + public String getDot() { + + if (!isVisible()) + return ""; + + final StringBuffer result = new StringBuffer(); + + // describe associated types + for (final ClassDescriptor classDescriptor : typeArguments) + if (classDescriptor.isVisible()) + if (classDescriptor.areReferencesShown()) + result.append(" " + getGraphId() + " -> " + + classDescriptor.getGraphId() + "[label=\"" + name + + "\", color=\"" + classDescriptor.getColor() + + "\", style=\"bold\"];\n"); + + if (type == null) return result.toString(); + if (!type.isVisible()) + return result.toString(); + + // main type + boolean showLink = type.areReferencesShown(); + + if (type == parentClassDescriptor) + showLink = false; + + if (parentClassDescriptor.isEnum) + showLink = false; + + if (showLink) + result.append(" " + getGraphId() + " -> " + type.getGraphId() + + "[label=\"" + name + "\"," + " color=\"" + + type.getColor() + "\", style=\"bold\"];\n"); + + return result.toString(); + } + + @Override + public String getEmbeddedDot() { + + if (!isVisible()) + return ""; + + final StringBuffer result = new StringBuffer(); + + result.append(" // " + name + "\n"); + if (parentClassDescriptor.isEnum && (type == parentClassDescriptor)) { + result.append(" "); + result.append(name + "\n"); + } else { + result.append(" "); + result.append(""); + result.append(describeType() + ""); + result.append(""); + result.append(name + "\n"); + } + return result.toString(); + } + + private String describeType() { + if (type == null) return "-null-"; + return type.getClassName(true); + } + + @Override + public String getGraphId() { + return parentClassDescriptor.getGraphId() + ":" + name; + } + + protected int getOutsideVisibleReferencesCount() { + + if (!isVisible()) + return 0; + + if (type != null) + if (type.isVisible()) + return 1; + + return 0; + } + + protected ClassDescriptor getType() { + return type; + } + + @Override + public boolean isVisible() { + if (isInherited) + return false; + + if (name.contains("$")) + return false; - if (!field.getDeclaringClass().getName() - .equals(parent.fullyQualifiedName)) - // if field is inherited, do not index it - return; - - // if (field.getType().isArray()) - // System.out.println("field name: " + field.getName()); + return !name.equals("serialVersionUID"); - parent.nameToFieldMap.put(field.getName(), this); - - name = field.getName(); - type = dump.addClass(field.getType()); - type.registerReference(); - - final Type genericType = field.getGenericType(); - if (genericType instanceof ParameterizedType) { - final ParameterizedType pt = (ParameterizedType) genericType; - for (final Type t : pt.getActualTypeArguments()) - if (t instanceof Class) { - final Class cl = (Class) t; - final ClassDescriptor genericTypeDescriptor = dump - .addClass(cl); - genericTypeDescriptor.registerReference(); - typeArguments.add(genericTypeDescriptor); - } - - } - } - - @Override - public String getDot() { - - if (!isVisible()) - return ""; - - final StringBuffer result = new StringBuffer(); - - // describe associated types - for (final ClassDescriptor classDescriptor : typeArguments) - if (classDescriptor.isVisible()) - if (classDescriptor.areReferencesShown()) - result.append(" " + getGraphId() + " -> " - + classDescriptor.getGraphId() + "[label=\"" + name - + "\", color=\"" + classDescriptor.getColor() - + "\", style=\"bold\"];\n"); - - if (!type.isVisible()) - return result.toString(); - - // main type - boolean showLink = type.areReferencesShown(); - - if (type == parent) - showLink = false; - - if (parent.isEnum) - showLink = false; - - if (showLink) - result.append(" " + getGraphId() + " -> " + type.getGraphId() - + "[label=\"" + name + "\"," + " color=\"" - + type.getColor() + "\", style=\"bold\"];\n"); - - return result.toString(); - } - - @Override - public String getEmbeddedDot() { - - if (!isVisible()) - return ""; - - final StringBuffer result = new StringBuffer(); - - result.append(" // " + name + "\n"); - if (parent.isEnum && (type == parent)) { - result.append(" "); - result.append(name + "\n"); - } else { - result.append(" "); - result.append(""); - result.append(type.getClassName(true) + ""); - result.append(""); - result.append(name + "\n"); - } - return result.toString(); - } - - @Override - public String getGraphId() { - return parent.getGraphId() + ":" + name; - } + } - public int getOutsideVisibleReferencesCount() { - - if (!isVisible()) - return 0; - - if (type != null) - if (type.isVisible()) - return 1; - - return 0; - } - - @Override - public boolean isVisible() { - if (name.contains("$")) - return false; - - if (name.equals("serialVersionUID")) - return false; - - return true; - } } \ No newline at end of file