protected ClassMapping createClassMapping()

in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java [475:556]


    protected ClassMapping createClassMapping(final Class<?> inClazz, final Map<Type, Type> resolvedTypes) {
        boolean copyDate = false;
        for (final Class<?> itf : inClazz.getInterfaces()) {
            if ("org.apache.openjpa.enhance.PersistenceCapable".equals(itf.getName())) {
                copyDate = true;
                break;
            }
        }
        final Class<?> clazz = findModelClass(inClazz);

        AccessMode accessMode = config.getAccessMode();

        Comparator<String> fieldComparator = accessMode.fieldComparator(inClazz);
        fieldComparator = fieldComparator == null ? config.getAttributeOrder() : fieldComparator;

        final Map<String, Getter> getters = fieldComparator == null ? newOrderedMap(Getter.class) : new TreeMap<>(fieldComparator);
        final Map<String, Setter> setters = fieldComparator == null ? newOrderedMap(Setter.class) : new TreeMap<>(fieldComparator);

        try {
            final Map<String, AccessMode.Reader> readers = accessMode.findReaders(clazz);
            final Map<String, AccessMode.Writer> writers = accessMode.findWriters(clazz);

            final Collection<String> virtualFields = new HashSet<String>();
            {
                final JohnzonVirtualObjects virtualObjects = clazz.getAnnotation(JohnzonVirtualObjects.class);
                if (virtualObjects != null) {
                    for (final JohnzonVirtualObject virtualObject : virtualObjects.value()) {
                        handleVirtualObject(virtualFields, virtualObject, getters, setters, readers, writers, copyDate, clazz);
                    }
                }

                final JohnzonVirtualObject virtualObject = clazz.getAnnotation(JohnzonVirtualObject.class);
                if (virtualObject != null) {
                    handleVirtualObject(virtualFields, virtualObject, getters, setters, readers, writers, copyDate, clazz);
                }
            }

            for (final Map.Entry<String, AccessMode.Reader> reader : readers.entrySet()) {
                final String key = reader.getKey();
                if (virtualFields.contains(key)) {
                    continue;
                }
                addGetterIfNeeded(getters, key, reader.getValue(), copyDate, resolvedTypes);
            }

            for (final Map.Entry<String, AccessMode.Writer> writer : writers.entrySet()) {
                final String key = writer.getKey();
                if (virtualFields.contains(key)) {
                    continue;
                }
                addSetterIfNeeded(setters, key, writer.getValue(), copyDate, clazz, resolvedTypes);
            }

            final Method anyGetter = accessMode.findAnyGetter(clazz);
            final Field anyField = accessMode.findAnyField(clazz);
            final ClassMapping mapping = new ClassMapping(
                    clazz, accessMode.findFactory(clazz), getters, setters,
                    accessMode.findAdapter(clazz),
                    accessMode.findReader(clazz),
                    accessMode.findWriter(clazz),
                    anyGetter != null ? new Getter(
                            new MethodAccessMode.MethodReader(anyGetter, anyGetter.getReturnType()),
                            false,false, false, false, true, null, null, -1, null) :
                            (anyField != null ? new Getter(new FieldAccessMode.FieldReader(anyField, anyField.getGenericType()),
                            false,false, false, false, true, null, null, -1, null) : null),
                    accessMode.findAnySetter(clazz),
                    anyField,
                    Map.class.isAssignableFrom(clazz) ? accessMode.findMapAdder(clazz) : null,
                    config.getSerializationPredicate() != null && config.getSerializationPredicate().test(clazz)
                            ? new Map.Entry[] { Map.entry(config.getDiscriminator(), config.getDiscriminatorMapper().apply(clazz)) } : null,
                    config.getDeserializationPredicate() != null && config.getDeserializationPredicate().test(clazz)
                            ? (jsonObject, type) -> config.getTypeLoader().apply(jsonObject.getString(config.getDiscriminator())) : null);

            accessMode.afterParsed(clazz);

            return mapping;
        } finally {
            if (Cleanable.class.isInstance(accessMode)) {
                ((Cleanable<Class<?>>) accessMode).clean(clazz);
            }
        }
    }