package org.molgenis.data.annotation.core.resources.impl;
import org.molgenis.data.Entity;
import org.molgenis.data.Query;
import org.molgenis.data.QueryRule;
import org.molgenis.data.annotation.core.resources.MultiResourceConfig;
import org.molgenis.data.annotation.core.resources.Resource;
import org.molgenis.data.annotation.core.resources.ResourceConfig;
import org.molgenis.data.vcf.model.VcfAttributes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public abstract class MultiFileResource implements Resource
{
private final String name;
private final Map<String, ResourceImpl> resources = new HashMap<>();
private final MultiResourceConfig config;
private static final Logger LOG = LoggerFactory.getLogger(MultiFileResource.class);
public MultiFileResource(String name, MultiResourceConfig config)
{
this.name = name;
this.config = config;
}
private void initializeResources()
{
this.resources.clear();
for (Entry<String, ResourceConfig> chromConfig : config.getConfigs().entrySet())
{
final String key = chromConfig.getKey();
this.resources.put(key, new ResourceImpl(name + key, new ResourceConfig()
{
// Config may change so keep querying the MultiResourceConfig for the current File
@Override
public File getFile()
{
ResourceConfig resourceConfig = config.getConfigs().get(key);
if (resourceConfig == null)
{
initializeResources();
return null;
}
File file = resourceConfig.getFile();
return file;
}
})
{
@Override
public RepositoryFactory getRepositoryFactory()
{
return MultiFileResource.this.getRepositoryFactory();
}
});
}
}
private static Object getFirstEqualsValueFor(String attributeName, Query<Entity> q)
{
return q.getRules().stream().filter(rule -> attributeName.equals(rule.getField())
&& rule.getOperator() == QueryRule.Operator.EQUALS).findFirst().get().getValue();
}
@Override
public boolean isAvailable()
{
// initialize after autowiring is complete and resources is empty
if (resources.isEmpty())
{
initializeResources();
}
for (Resource chrom : resources.values())
{
if (!chrom.isAvailable())
{
return false;
}
}
return true;
}
@Override
public String getName()
{
return name;
}
@Override
public Iterable<Entity> findAll(Query<Entity> q)
{
// initialize after autowiring is complete and resources is empty
isAvailable();
Object chromValue = getFirstEqualsValueFor(VcfAttributes.CHROM, q);
Iterable<Entity> result = new ArrayList<Entity>();
if (chromValue != null)
{
String chromStringValue = chromValue.toString();
Resource resource = resources.get(chromStringValue);
try
{
result = resource.findAll(q);
}
catch (NullPointerException e)
{
LOG.debug("No file for chromosome %s skipping..", chromStringValue);
}
}
return result;
}
}