/******************************************************************************* * Copyright (c) 2013 Cloud Bees, Inc. * All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Cloud Bees, Inc. - initial API and implementation *******************************************************************************/ package com.cloudbees.eclipse.dev.ui.views.jobs; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.progress.IDeferredWorkbenchAdapter; import org.eclipse.ui.progress.IElementCollector; import com.cloudbees.eclipse.core.CloudBeesException; import com.cloudbees.eclipse.core.jenkins.api.JenkinsJobsResponse; import com.cloudbees.eclipse.core.jenkins.api.JenkinsJobsResponse.JobViewGeneric; import com.cloudbees.eclipse.core.jenkins.api.JenkinsJobsResponse.View; import com.cloudbees.eclipse.ui.CloudBeesUIPlugin; public class DeferWrapper implements IDeferredWorkbenchAdapter { protected static final Object[] EMPTY = new Object[0]; private JobHolder parent; public DeferWrapper(JobHolder element) { this.parent = element; } @Override public Object[] getChildren(Object parent) { return null; } @Override public ImageDescriptor getImageDescriptor(Object object) { return null; } @Override public String getLabel(Object o) { return "na: "+o; } @Override public Object getParent(Object o) { return null; } @Override public void fetchDeferredChildren(Object object, IElementCollector collector, IProgressMonitor monitor) { if (monitor.isCanceled()) { return; } try { Object[] children = getChildren(object, monitor); if (monitor.isCanceled()) { return; } if (children.length > 0) { collector.add(children, monitor); } collector.done(); } catch (CloudBeesException e){ CloudBeesUIPlugin.getDefault().getLogger().error(e); } } private Object[] getChildren(Object parent, IProgressMonitor monitor) throws CloudBeesException { JobViewGeneric p = null; if (parent instanceof JobHolder) { p = ((JobHolder) parent).job; } if (p!=null && (p instanceof JobViewGeneric) && ((JobViewGeneric) p).isFolderOrView()) { // This is a folder job or a view so we can use the url to fetch the children String url = ((JenkinsJobsResponse.JobViewGeneric) p).getUrl(); JenkinsJobsResponse jobs = CloudBeesUIPlugin.getDefault().getJenkinsServiceForUrl(url).getJobs(url, monitor); List<JenkinsJobsResponse.JobViewGeneric> reslist = new ArrayList<JenkinsJobsResponse.JobViewGeneric>(); List<JobHolder> retlist = new ArrayList<JobHolder>(); if (jobs.views != null) for (View view : jobs.views) { if (view.url != null && (jobs.primaryView == null || !view.url.equals(jobs.primaryView.url))) { reslist.add(view); } } if (jobs.jobs != null) { reslist.addAll(Arrays.asList(jobs.jobs)); } Iterator<JobViewGeneric> it = reslist.iterator(); while (it.hasNext()) { JenkinsJobsResponse.JobViewGeneric j = (JenkinsJobsResponse.JobViewGeneric) it.next(); retlist.add(new JobHolder(j, ((JobHolder)parent))); } return retlist.toArray(new JobHolder[0]); } return EMPTY; } @Override public boolean isContainer() { return parent.job.isFolderOrView(); } @Override public ISchedulingRule getRule(Object object) { return null; } }