All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.factoryfx.dom.rest.DynamicDataDictionary Maven / Gradle / Ivy

package io.github.factoryfx.dom.rest;

import io.github.factoryfx.factory.FactoryBase;
import io.github.factoryfx.factory.attribute.Attribute;
import io.github.factoryfx.factory.attribute.dependency.FactoryAttribute;
import io.github.factoryfx.factory.attribute.dependency.FactoryBaseAttribute;
import io.github.factoryfx.factory.attribute.dependency.FactoryListAttribute;
import io.github.factoryfx.factory.attribute.dependency.FactoryListBaseAttribute;
import io.github.factoryfx.factory.attribute.types.EnumAttribute;
import io.github.factoryfx.factory.attribute.types.EnumListAttribute;
import io.github.factoryfx.factory.attribute.types.ObjectValueAttribute;
import io.github.factoryfx.factory.metadata.FactoryMetadataManager;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;

public class DynamicDataDictionary {
    public HashMap classNameToItem = new HashMap<>();


    public DynamicDataDictionary(FactoryBase root){
        HashSet> factoryClasses = new HashSet<>();
        for (FactoryBase factoryBase : root.internal().collectChildrenDeep()) {
            factoryClasses.add(factoryBase.getClass());
            factoryBase.internal().visitAttributesFlat((attributeVariableName, attribute) -> {
                if (attribute instanceof FactoryAttribute){
                    factoryClasses.add(((FactoryAttribute)attribute).internal_getReferenceClass());
                }
            });
        }

        for (Class factoryClass : factoryClasses) {
            DynamicDataDictionaryItem item = new DynamicDataDictionaryItem();
            classNameToItem.put(factoryClass.getName(), item);

            FactoryBase factoryBase = FactoryMetadataManager.getMetadataUnsafe(factoryClass).newInstance();
            factoryBase.internal().visitAttributesFlat((attributeVariableName, attribute) -> {
                DynamicDataDictionaryAttributeItem attributeItem = new DynamicDataDictionaryAttributeItem(getAttributeType(attribute),
                        !attribute.internal_required(),
                        attribute.internal_getPreferredLabelText(Locale.ENGLISH),
                        attribute.internal_getPreferredLabelText(Locale.GERMAN),
                        getPossibleEnumValues(attribute)
                );
                if (!(attribute instanceof ObjectValueAttribute)) {
                    item.attributeNameToItem.put(attributeVariableName, attributeItem);
                }
            });
        }

    }

    private String getAttributeType(Attribute attribute) {
        if (attribute instanceof FactoryBaseAttribute){
            return FactoryAttribute.class.getSimpleName();
        }
        if (attribute instanceof FactoryListBaseAttribute){
            return FactoryListAttribute.class.getSimpleName();
        }
        return attribute.getClass().getSimpleName();
    }

    private List getPossibleEnumValues(Attribute attribute) {
        if (attribute instanceof EnumAttribute){
            return ((EnumAttribute)attribute).internal_possibleEnumValues().stream().map(Enum::toString).collect(Collectors.toList());
        }
        if (attribute instanceof EnumListAttribute){
            return ((EnumListAttribute)attribute).internal_possibleEnumValues().stream().map(Enum::toString).collect(Collectors.toList());
        }
        return List.of();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy