package com.illumina.basespace.igv;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.broad.igv.feature.genome.Genome;
import org.broad.igv.track.Track;
import org.broad.igv.track.TrackLoader;
import org.broad.igv.ui.IGV;
import org.broad.igv.ui.util.MessageUtils;
import org.broad.igv.util.ResourceLocator;
import com.illumina.basespace.ApiClient;
import com.illumina.basespace.entity.File;
import com.illumina.basespace.entity.FileCompact;
import com.illumina.basespace.igv.bam.BAMLocatorFactory;
import com.illumina.basespace.igv.gff.GFFLocatorFactory;
import com.illumina.basespace.igv.vcf.VCFLocatorFactory;
import com.illumina.basespace.igv.wiggle.WiggleLocatorFactory;
import com.illumina.basespace.response.ListFilesResponse;
public class BaseSpaceTrackLoader extends TrackLoader
{
private static final Logger log = Logger.getLogger(BaseSpaceTrackLoader.class.getPackage().getName());
private static List<IResourceLocatorFactory<?>>loaderRegistry = new ArrayList<IResourceLocatorFactory<?>>();
static
{
loaderRegistry.add(new BAMLocatorFactory());
loaderRegistry.add(new VCFLocatorFactory());
loaderRegistry.add(new WiggleLocatorFactory());
loaderRegistry.add(new GFFLocatorFactory());
loaderRegistry.add(new LocalDownloadLocatorFactory());
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public List<Track> load(ResourceLocator locator, Genome genome)
{
List<Track> newTracks = new ArrayList<Track>();
if (IBaseSpaceTrackLoader.class.isAssignableFrom(locator.getClass()))
{
if (((IBaseSpaceTrackLoader)locator).loadTrack(locator, newTracks, genome))
return newTracks;
}
log.info("Use default Track Loading");
return super.load(locator, genome);
}
public static void loadTracks(UUID clientId, ListFilesResponse resp)
{
loadTracks(clientId, Arrays.asList(resp.items()));
}
public static void loadTracks(UUID clientId, List<FileCompact> files)
{
try
{
ApiClient client = BaseSpaceMain.instance().getApiClient(clientId);
List<ResourceLocator> locators = new ArrayList<ResourceLocator>();
StringBuilder sb = new StringBuilder();
boolean first = true;
for (FileCompact fc : files)
{
if (fc.getSize() == 0)
sb.append((!first?",":"") + fc.getName());
else
{
File file = client.getFile(fc.getId()).get();
for(IResourceLocatorFactory<?> loader:loaderRegistry)
{
ResourceLocator locator = loader.newLocator(clientId, client, file, files);
if (locator != null)
{
locators.add(locator);
}
}
}
first = false;
}
if (sb.length() > 0)
{
MessageUtils.showMessage("The following file(s) were not loaded because they were empty: " + sb.toString());
}
if (locators.size() == 0) return;
IGV.getInstance().loadTracks(locators);
}
catch (Throwable t)
{
t.printStackTrace();
}
}
}