visualization/visualization-api/src/main/java/se/jguru/nazgul/tools/visualization/api/dot/AttributeRenderer.java
@Override
    @SuppressWarnings("PMD")
    protected String doRender(final RenderConfiguration config, final AbstractAttributes entity) {

        // Collect all non-null properties into a SortedMap using reflection.
        final SortedMap<String, String> dotAttributes = new TreeMap<>();

        for (Class<?> current = entity.getClass();
             current != null && current != Object.class;
             current = current.getSuperclass()) {

            for (Field currentField : current.getDeclaredFields()) {
                if (isConfigurationField(currentField)) {

                    String key = null;
                    Object value = null;

                    try {

                        // #1) Do we have a non-null value in the Field?
                        value = currentField.get(entity);
                        if (value == null) {
                            continue;
                        }

                        // #2) Do we have @DotProperty annotation on the Field?
                        final DotProperty dotPropertyAnnotation = currentField.getAnnotation(DotProperty.class);
                        if (dotPropertyAnnotation == null) {
                            continue;
                        }

                        // #3) Does this field need special treatment?
                        if (dotPropertyAnnotation.specialTreatment()) {

                            if ("labelSize".equals(currentField.getName())
                                    && PointOrRectangle.class.equals(currentField.getType())) {

                                final PointOrRectangle rect = (PointOrRectangle) value;
                                dotAttributes.put(quote("lwidth"),
                                        BigDecimal.valueOf(rect.getxOrWidth()).toPlainString());
                                dotAttributes.put(quote("lheight"),
                                        BigDecimal.valueOf(rect.getyOrHeight()).toPlainString());

                                // All Done for this Field.
                                continue;
                            }
                        }

                        // #4) Use the DotProperty "name" attribute, or fallback to the field name.
                        key = dotPropertyAnnotation.name();
                        if (key.isEmpty() || "##default".equalsIgnoreCase(key)) {
                            key = currentField.getName();
                        }

                        // #5) Transform the value if required, and add the key/value pair to the outbound Map.
                        dotAttributes.put(key, getDotConfigValueFor(value));

                    } catch (Exception e) {
                        throw new IllegalArgumentException("Could not add configuration for field ["
                                + currentField + "] --> [" + key + "] in class ["
                                + entity.getClass().getSimpleName() + "]", e);
                    }
                }
            }
        }

        // Check sanity
        if (dotAttributes.isEmpty()) {
            return "";
        }

        // Synthesize the required attribute List form.
        final StringBuilder builder = new StringBuilder(START_TOKEN);
        for (Map.Entry<String, String> current : dotAttributes.entrySet()) {
            builder.append(current.getKey() + SEPARATOR + "\"" + current.getValue() + "\"" + DELIMITER);
        }

        // Remove the last delimiter
        builder.delete(builder.length() - DELIMITER.length(), builder.length());

        // All Done.
        builder.append(END_TOKEN);
        return builder.toString();
    }
@Override
    @SuppressWarnings("PMD")
    protected String doRender(final RenderConfiguration config, final AbstractAttributes entity) {

        // Collect all non-null properties into a SortedMap using reflection.
        final SortedMap<String, String> dotAttributes = new TreeMap<>();

        for (Class<?> current = entity.getClass();
             current != null && current != Object.class;
             current = current.getSuperclass()) {

            for (Field currentField : current.getDeclaredFields()) {
                if (isConfigurationField(currentField)) {

                    String key = null;
                    Object value = null;

                    try {

                        // #1) Do we have a non-null value in the Field?
                        value = currentField.get(entity);
                        if (value == null) {
                            continue;
                        }

                        // #2) Do we have @DotProperty annotation on the Field?
                        final DotProperty dotPropertyAnnotation = currentField.getAnnotation(DotProperty.class);
                        if (dotPropertyAnnotation == null) {
                            continue;
                        }

                        // #3) Does this field need special treatment?
                        if (dotPropertyAnnotation.specialTreatment()) {

                            if ("labelSize".equals(currentField.getName())
                                    && PointOrRectangle.class.equals(currentField.getType())) {

                                final PointOrRectangle rect = (PointOrRectangle) value;
                                dotAttributes.put(quote("lwidth"),
                                        BigDecimal.valueOf(rect.getxOrWidth()).toPlainString());
                                dotAttributes.put(quote("lheight"),
                                        BigDecimal.valueOf(rect.getyOrHeight()).toPlainString());

                                // All Done for this Field.
                                continue;
                            }
                        }

                        // #4) Use the DotProperty "name" attribute, or fallback to the field name.
                        key = dotPropertyAnnotation.name();
                        if (key.isEmpty() || "##default".equalsIgnoreCase(key)) {
                            key = currentField.getName();
                        }

                        // #5) Transform the value if required, and add the key/value pair to the outbound Map.
                        dotAttributes.put(key, getDotConfigValueFor(value));

                    } catch (Exception e) {
                        throw new IllegalArgumentException("Could not add configuration for field ["
                                + currentField + "] --> [" + key + "] in class ["
                                + entity.getClass().getSimpleName() + "]", e);
                    }
                }
            }
        }

        // Check sanity
        if (dotAttributes.isEmpty()) {
            return "";
        }

        // Synthesize the required attribute List form.
        final StringBuilder builder = new StringBuilder(START_TOKEN);
        for (Map.Entry<String, String> current : dotAttributes.entrySet()) {
            builder.append(current.getKey() + SEPARATOR + "\"" + current.getValue() + "\"" + DELIMITER);
        }

        // Remove the last delimiter
        builder.delete(builder.length() - DELIMITER.length(), builder.length());

        // All Done.
        builder.append(END_TOKEN);
        return builder.toString();
    }
{@inheritDoc}