package org.molgenis.data.meta; import org.molgenis.data.meta.model.Attribute; import org.molgenis.data.meta.model.AttributeFactory; import org.molgenis.data.meta.model.EntityType; import org.molgenis.data.meta.model.EntityTypeMetadata; import org.molgenis.data.meta.system.SystemAttribute; import org.molgenis.data.populate.IdGenerator; import org.molgenis.data.support.BootstrapEntity; import org.springframework.beans.factory.annotation.Autowired; import java.util.Collections; import java.util.Set; import static java.lang.String.format; import static java.util.Objects.requireNonNull; import static org.molgenis.data.meta.model.Package.PACKAGE_SEPARATOR; import static org.molgenis.data.system.model.RootSystemPackage.PACKAGE_SYSTEM; /** * Base class for all system entity meta data. */ public abstract class SystemEntityType extends EntityType { private AttributeFactory attributeFactory; private IdGenerator idGenerator; private final String entityName; private final String systemPackageName; /** * Construct entity meta data for an entity with the given name stored in the system package. * * @param entityName entity name */ public SystemEntityType(String entityName) { this(entityName, PACKAGE_SYSTEM); } /** * Construct entity meta data for an entity with the given name stored in a system package with the given package name. * * @param entityName entity name * @param systemPackageName system package name */ public SystemEntityType(String entityName, String systemPackageName) { this.entityName = requireNonNull(entityName); this.systemPackageName = requireNonNull(systemPackageName); if (!systemPackageName.startsWith(PACKAGE_SYSTEM)) { throw new IllegalArgumentException( format("Entity [%s] must be located in package [%s] instead of [%s]", entityName, PACKAGE_SYSTEM, systemPackageName)); } } public void bootstrap(EntityTypeMetadata entityTypeMetadata) { super.init(new BootstrapEntity(entityTypeMetadata)); setName(systemPackageName + PACKAGE_SEPARATOR + entityName); setSimpleName(entityName); setDefaultValues(); init(); } /** * Initialize system entity meta data, e.g. adding attributes, setting package */ protected abstract void init(); @Override public String getName() { return systemPackageName + PACKAGE_SEPARATOR + entityName; } @Override public String getSimpleName() { return entityName; } public Attribute addAttribute(String attrName, AttributeRole... attrTypes) { Attribute attr = new SystemAttribute(attributeFactory.getAttributeMetadata()); attr.setIdentifier(idGenerator.generateId()); attr.setDefaultValues(); attr.setName(attrName); addAttribute(attr, attrTypes); return attr; } // setter injection instead of constructor injection to avoid unresolvable circular dependencies @Autowired public void setAttributeFactory(AttributeFactory attributeFactory) { this.attributeFactory = requireNonNull(attributeFactory); } @Autowired public void setIdGenerator(IdGenerator idGenerator) { this.idGenerator = requireNonNull(idGenerator); } /** * Used to determine the order of bootstrapping. * * @return Set containing the {@link SystemEntityType}s that this {@link SystemEntityType}'s definition depends upon. */ public Set<SystemEntityType> getDependencies() { return Collections.emptySet(); } }