package com.illumina.basespace.igv.ui.tree;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.SwingWorker;
import org.broad.igv.ui.IGV;
import com.illumina.basespace.entity.AppResult;
import com.illumina.basespace.entity.AppResultCompact;
import com.illumina.basespace.entity.AppSession;
import com.illumina.basespace.entity.AppSessionCompact;
import com.illumina.basespace.entity.FileCompact;
import com.illumina.basespace.igv.BaseSpaceConstants;
import com.illumina.basespace.igv.BaseSpaceMain;
import com.illumina.basespace.igv.BaseSpaceMain.ClientContext;
import com.illumina.basespace.igv.ui.BaseSpaceHelper;
import com.illumina.basespace.igv.ui.ImageProvider;
import com.illumina.basespace.igv.ui.ProgressReport;
import com.illumina.basespace.infrastructure.BaseSpaceException;
import com.illumina.basespace.param.FileParams;
import com.illumina.basespace.param.QueryParams;
import com.illumina.basespace.property.AppResultReference;
import com.illumina.basespace.property.Property;
public class AppSessionNode extends BaseSpaceTreeNode<AppSessionCompact>
{
private static QueryParams params;
private String appResultId;
static
{
params = new QueryParams(128);
params.setSortDir(QueryParams.DESCENDING);
params.setSortBy("Id");
}
public AppSessionNode(AppSession bean,UUID clientId, ClientContext clientContext)
{
super(bean, clientId, clientContext);
// this.appResultId = appResultId;
}
public AppSessionNode(AppSessionCompact bean,UUID clientId, ClientContext clientContext)
{
super(bean, clientId, clientContext);
// this.appResultId = appResultId;
}
@Override
public void loadChildrenAsynch(final JTree tree)
{
final BaseSpaceTreeNode<?> treeNode = this;
BrowserDialog.instance().workInit(100);
final FileParams fileParams = new FileParams(BaseSpaceConstants.FILE_TYPES.keySet().toArray(new String[0]),
128);
final String thisAppResultId = appResultId;
SwingWorker< List<BaseSpaceTreeNode<?>>,ProgressReport> worker = new SwingWorker< List<BaseSpaceTreeNode<?>>,ProgressReport>()
{
/**
* Load appresults for an appsession: /appsessions/{id}/appresults
*/
@Override
protected List<BaseSpaceTreeNode<?>> doInBackground() throws Exception
{
try
{
List<AppResultCompact> entities = new ArrayList<AppResultCompact>();
// List<AppResultCompact> appResultCompactList = new ArrayList<AppResultCompact>();
entities.addAll(Arrays.asList(BaseSpaceMain.instance().getApiClient(getClientId()).getAppResults(getBean(), params).items()));
BrowserDialog.instance().setWorkMax(entities.size());
List<String>appResultIDs = new ArrayList<String>();
List<BaseSpaceTreeNode<?>> decorators = new ArrayList<BaseSpaceTreeNode<?>>(entities.size());
int count = 0;
for (AppResultCompact obj : entities)
{
count++;
if (obj.getStatus().equalsIgnoreCase(BaseSpaceConstants.STATUS_COMPLETE) && !appResultIDs.contains(obj.getId()))
{
FileCompact[]files = BaseSpaceMain.instance().getApiClient(getClientId()).getFiles(obj, fileParams).items();
if (files.length > 0)
{
publish(new ProgressReport(obj.getName(),count));
AppResultNode an = new AppResultNode(obj,getClientId(),getClientContext());
decorators.add(an);
appResultIDs.add(obj.getId());
}
}
}
return decorators;
}
catch(Throwable t)
{
t.printStackTrace();
throw new RuntimeException("Error adding appresults",t);
}
}
@Override
protected void process(List<ProgressReport> chunks)
{
BrowserDialog.instance().workProgress(chunks);
}
@Override
protected void done()
{
try
{
super.done();
BrowserDialog.instance().workDone();
List<BaseSpaceTreeNode<?>> decorators = get();
addChildren(tree,treeNode,decorators);
}
catch(Throwable t)
{
BaseSpaceHelper.showErrorDialog(IGV.getMainFrame(),t);
}
finally
{
BrowserDialog.instance().workDone();
}
}
};
BrowserDialog.instance().workStart();
worker.execute();
}
@Override
public void renderNode(JTree tree, JLabel label, AppSessionCompact value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus)
{
String nameToDisplay = value.getName() + " " + value.getId();
label.setText( "<html>" + nameToDisplay + "</html>");
label.setIcon(ImageProvider.instance().getIcon("sample.png"));
}
}