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

io.katharsis.meta.internal.MetaDataObjectProvider Maven / Gradle / Ivy

There is a newer version: 3.0.2
Show newest version
package io.katharsis.meta.internal;

import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Set;

import io.katharsis.core.internal.utils.ClassUtils;
import io.katharsis.core.internal.utils.PropertyUtils;
import io.katharsis.meta.model.MetaAttribute;
import io.katharsis.meta.model.MetaDataObject;
import io.katharsis.meta.model.MetaElement;
import io.katharsis.meta.provider.MetaProviderContext;

public abstract class MetaDataObjectProvider extends MetaDataObjectProviderBase {

	@Override
	public MetaElement createElement(Type type, MetaProviderContext context) {
		Class rawClazz = ClassUtils.getRawType(type);
		Class superClazz = rawClazz.getSuperclass();
		MetaElement superMeta = null;
		if (superClazz != Object.class && superClazz != null) {
			superMeta = context.getLookup().getMeta(superClazz, getMetaClass());
		}
		MetaDataObject meta = newDataObject();
		meta.setName(rawClazz.getSimpleName());
		meta.setImplementationType(type);
		meta.setSuperType((MetaDataObject) superMeta);
		createAttributes(meta);
		return meta;
	}

	protected abstract MetaDataObject newDataObject();

	@Override
	public void onInitialized(MetaProviderContext context, MetaElement element) {
		if (element instanceof MetaAttribute && element.getParent().getClass() == getMetaClass()) {
			MetaAttribute attr = (MetaAttribute) element;
			MetaDataObject parent = attr.getParent();
			Type implementationType = PropertyUtils.getPropertyType(parent.getImplementationClass(), attr.getName());
			MetaElement metaType = context.getLookup().getMeta(implementationType, getMetaClass(), true);
			if(metaType == null){
				 metaType = context.getLookup().getMeta(implementationType);
			}
			attr.setType(metaType.asType());
		}
	}

	protected abstract Class getMetaClass();

	@Override
	public Set> getMetaTypes() {
		Set> set = new HashSet<>();
		set.add(getMetaClass());
		return set;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy