package com.github.nyrkovalex.ironadmin.core.pages; import com.github.nyrkovalex.ironadmin.core.EntityProvider; import com.github.nyrkovalex.ironadmin.core.utils.IronContracts; import com.github.nyrkovalex.ironadmin.core.utils.IronObjects; import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public abstract class AbstractPage<T> implements Page<T> { private final String title; private final String url; private final Class<T> entityClass; private final EntityProvider<T> entityProvider; private final Collection<String> skippedProperties; private final Map<String, PropertyDefinition> definitionOverrides; private final String idPropertyName; protected AbstractPage(@NotNull Class<T> entityClass, @NotNull EntityProvider<T> entityProvider) { this(entityClass, entityProvider, PageMapping.of(entityClass), EntityMeta.of(entityClass).build()); } protected AbstractPage(@NotNull Class<T> entityClass, @NotNull EntityProvider<T> entityProvider, @NotNull PageMapping pageMapping) { this(entityClass, entityProvider, pageMapping, EntityMeta.of(entityClass).build()); } protected AbstractPage(@NotNull Class<T> entityClass, @NotNull EntityProvider<T> entityProvider, @NotNull EntityMeta meta) { this(entityClass, entityProvider, PageMapping.of(entityClass), meta); } protected AbstractPage(@NotNull Class<T> entityClass, @NotNull EntityProvider<T> entityProvider, @NotNull PageMapping pageMapping, @NotNull EntityMeta entityMeta) { validateContracts(entityClass, entityProvider, pageMapping, entityMeta); this.title = entityMeta.getTitle(); this.url = pageMapping.getUrl(); this.entityClass = entityClass; this.entityProvider = entityProvider; this.skippedProperties = entityMeta.getSkippedProperties(); this.definitionOverrides = buildOverridesMap(entityMeta.getOverrides()); this.idPropertyName = entityMeta.getIdPropertyName(); } private static void validateContracts(Class<?> entityClass, EntityProvider<?> entityProvider, PageMapping meta, EntityMeta entityMeta) { IronContracts.notNull(entityClass, "Entity class"); IronContracts.notNull(entityProvider, "Entity provider"); IronContracts.notNull(meta, "Page meta"); IronContracts.notNull(entityMeta, "Property Schema"); } private static Map<String, PropertyDefinition> buildOverridesMap(Collection<PropertyDefinition> overrides) { Map<String, PropertyDefinition> overridesMap = new HashMap<>(overrides.size()); overrides.forEach((od) -> overridesMap.put(od.getName(), od)); return overridesMap; } @NotNull @Override public List<PropertyDefinition> properties() { return IronObjects.streamPropertyNames(entityClass) .filter((name) -> !skippedProperties.contains(name)) .map((name) -> definitionOverrides.getOrDefault(name, new PropertyDefinition(name))) .collect(Collectors.toList()); } @NotNull @Override public final String title() { return title; } @NotNull @Override public String url() { return url; } @NotNull @Override public EntityProvider<T> provider() { return entityProvider; } @NotNull @Override public String idPropertyName() { return idPropertyName; } }