package org.molgenis.data.meta.system;
import com.google.common.collect.Maps;
import org.molgenis.data.meta.SystemEntityType;
import org.molgenis.data.meta.model.Attribute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
import static java.lang.String.format;
import static org.molgenis.data.meta.AttributeType.COMPOUND;
/**
* Registry containing all {@link SystemEntityType}.
*/
@Component
public class SystemEntityTypeRegistry
{
private final Logger LOG = LoggerFactory.getLogger(SystemEntityTypeRegistry.class);
private final Map<String, SystemEntityType> systemEntityTypeMap;
public SystemEntityTypeRegistry()
{
systemEntityTypeMap = Maps.newHashMap();
}
public SystemEntityType getSystemEntityType(String entityName)
{
return systemEntityTypeMap.get(entityName);
}
public Stream<SystemEntityType> getSystemEntityTypes()
{
return systemEntityTypeMap.values().stream();
}
public boolean hasSystemEntityType(String entityName)
{
return systemEntityTypeMap.containsKey(entityName);
}
void addSystemEntityType(SystemEntityType systemEntityType)
{
String systemEntityTypeName = systemEntityType.getName();
if (systemEntityTypeName == null)
{
throw new IllegalArgumentException(format("[%s] is missing name, did you forget to call setName()?",
systemEntityType.getClass().getSimpleName()));
}
LOG.trace("Registering system entity [{}] ...", systemEntityTypeName);
systemEntityTypeMap.put(systemEntityTypeName, systemEntityType);
}
public boolean hasSystemAttribute(String attrIdentifier)
{
return getSystemAttribute(attrIdentifier) != null;
}
public Attribute getSystemAttribute(String attrIdentifier)
{
return getSystemEntityTypes().map(systemEntityType -> getSystemAttribute(systemEntityType, attrIdentifier))
.filter(Objects::nonNull).findFirst().orElse(null);
}
private static Attribute getSystemAttribute(SystemEntityType systemEntityType, String attrIdentifier)
{
return getSystemAttributeRec(systemEntityType.getAllAttributes(), attrIdentifier);
}
private static Attribute getSystemAttributeRec(Iterable<Attribute> attrs, String attrIdentifier)
{
for (Attribute attr : attrs)
{
if (attr.getIdentifier() != null && attr.getIdentifier().equals(attrIdentifier))
{
return attr;
}
else
{
if (attr.getDataType() == COMPOUND)
{
return getSystemAttributeRec(attr.getChildren(), attrIdentifier);
}
}
}
return null;
}
}