package com.celements.model.classes; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xwiki.component.annotation.Requirement; import org.xwiki.configuration.ConfigurationSource; import org.xwiki.model.reference.DocumentReference; import org.xwiki.model.reference.WikiReference; import com.celements.model.classes.fields.ClassField; import com.celements.model.util.ModelUtils; public abstract class AbstractClassDefinition implements ClassDefinition { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractClassDefinition.class); @Requirement protected ModelUtils modelUtils; @Requirement protected ConfigurationSource configSrc; private volatile List<ClassField<?>> fields; @Override public DocumentReference getClassRef() { return getClassRef(null); } @Override public DocumentReference getClassRef(WikiReference wikiRef) { return modelUtils.adjustRef(getClassRefInternal(), DocumentReference.class, wikiRef); } /** * @return class ref for this class definition. wiki will be adjusted */ protected abstract DocumentReference getClassRefInternal(); @Override public boolean isBlacklisted() { boolean ret = false; Object prop = configSrc.getProperty(CFG_SRC_KEY); if (prop instanceof List) { ret = ((List<?>) prop).contains(getName()); } LOGGER.debug("isBlacklisted: '{}' for '{}'", ret, getName()); return ret; } @Override public List<ClassField<?>> getFields() { if (fields == null) { fields = new ArrayList<>(); for (Field field : this.getClass().getDeclaredFields()) { try { if (ClassField.class.isAssignableFrom(field.getType())) { fields.add((ClassField<?>) field.get(this)); } } catch (IllegalAccessException | IllegalArgumentException exc) { LOGGER.error("failed to get field '{}", field, exc); } } } return Collections.unmodifiableList(fields); } }