/******************************************************************************* * 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.instances; import java.util.List; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PlatformUI; import com.cloudbees.eclipse.core.CloudBeesException; import com.cloudbees.eclipse.core.JenkinsService; import com.cloudbees.eclipse.core.jenkins.api.JenkinsInstanceResponse; import com.cloudbees.eclipse.ui.CloudBeesUIPlugin; public class InstanceContentProvider implements IStructuredContentProvider, ITreeContentProvider { private InstanceGroup jenkinsLocalGroup = new InstanceGroup.OnPremiseJenkinsInstanceGroup("Jenkins On-Premise", false); private InstanceGroup jenkinsCloudGroup = new InstanceGroup.DevAtCloudJenkinsInstanceGroup("Jenkins in the Cloud", true); //private InstanceGroup favoritesGroup = new FavoritesInstanceGroup("Favorite Jenkins Jobs", false); public InstanceContentProvider() { this.jenkinsLocalGroup.setLoading(false); this.jenkinsCloudGroup.setLoading(false); //this.favoritesGroup.setLoading(false); } @Override public void inputChanged(final Viewer v, final Object oldInput, final Object newInput) { if (newInput == null || !(newInput instanceof List)) { if (v != null) { if (v instanceof TreeViewer) { ((TreeViewer)v).refresh(true); } else { v.refresh(); } } return; } boolean hasLocal = false; boolean hasCloud = false; for (Object instance : (List) newInput) { if (instance instanceof JenkinsInstanceResponse) { JenkinsInstanceResponse nir = (JenkinsInstanceResponse) instance; if (nir.atCloud) { hasCloud = true; } else { hasLocal = true; } } } if (hasLocal) { this.jenkinsLocalGroup.clear(); } if (hasCloud || (newInput instanceof List && ((List)newInput).isEmpty())) { this.jenkinsCloudGroup.clear(); } for (Object instance : (List) newInput) { if (instance instanceof JenkinsInstanceResponse) { JenkinsInstanceResponse nir = (JenkinsInstanceResponse) instance; if (nir.atCloud) { this.jenkinsCloudGroup.addChild(nir); } else { this.jenkinsLocalGroup.addChild(nir); } } } if (hasLocal) { this.jenkinsLocalGroup.setLoading(false); } if (hasCloud) { this.jenkinsCloudGroup.setLoading(false); } if (v != null) { v.refresh(); ((TreeViewer) v).expandToLevel(1); } } @Override public void dispose() { this.jenkinsLocalGroup = null; this.jenkinsCloudGroup = null; } @Override public Object[] getElements(final Object parent) { return getChildren(parent); } @Override public Object getParent(final Object child) { if (child instanceof JenkinsInstanceHolder) { return ((JenkinsInstanceHolder) child).getParent(); } return null; } @Override public Object[] getChildren(final Object parent) { if (parent instanceof IViewSite) { return new InstanceGroup[] { this.jenkinsCloudGroup, this.jenkinsLocalGroup }; } else if (parent instanceof InstanceGroup) { InstanceGroup ig = ((InstanceGroup) parent); JenkinsInstanceResponse[] ret = ig.getChildren(); if (ig.isCloudHosted() && ret != null && ret.length == 1) { //if hosted at cloud then only one jenkins can be enabled at once JenkinsInstanceResponse resp = (JenkinsInstanceResponse) ret[0]; return resp.views; } return ig.getChildren(); } else if (parent instanceof JenkinsInstanceResponse) { JenkinsInstanceResponse resp = (JenkinsInstanceResponse) parent; return resp.views; } return new Object[0]; } @Override public boolean hasChildren(final Object parent) { if (parent instanceof InstanceGroup) { return ((InstanceGroup) parent).hasChildren(); } if (parent instanceof JenkinsInstanceResponse) { return ((JenkinsInstanceResponse) parent).views != null && ((JenkinsInstanceResponse) parent).views.length > 0; } return false; } public void jenkinsStatusUpdate(final TreeViewer viewer, String viewUrl, boolean online) { JenkinsService jenkinsService = CloudBeesUIPlugin.getDefault().getJenkinsServiceForUrl(viewUrl); boolean dirty = updateJenkinsGroup(jenkinsLocalGroup, jenkinsService, online); if (updateJenkinsGroup(jenkinsCloudGroup, jenkinsService, online)) { dirty = true; } if (dirty) { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { viewer.refresh(true); } }); } } /** * @param group * @param jenkinsService * @param online * @return true if any change was made to the tree structure */ private boolean updateJenkinsGroup(InstanceGroup group, JenkinsService jenkinsService, boolean online) { boolean dirty = false; // Let's see if this url is represented in this tree for (JenkinsInstanceResponse i : group.getChildren()) { if (jenkinsService.getUrl().startsWith(i.viewUrl)) { // came online if ((i.offline && online)) { // fetch new response try { JenkinsInstanceResponse newResp = jenkinsService.getInstance(new NullProgressMonitor()); group.removeChild(i); group.addChild(newResp); dirty = true; } catch (CloudBeesException e) { e.printStackTrace(); } } // went offline if ((!i.offline && !online)) { // prepare the fake response JenkinsInstanceResponse fakeResp = new JenkinsInstanceResponse(); fakeResp.viewUrl = jenkinsService.getUrl(); fakeResp.nodeName = jenkinsService.getLabel(); fakeResp.offline = true; fakeResp.atCloud = jenkinsService.isCloud(); group.removeChild(i); group.addChild(fakeResp); dirty = true; } } } if (dirty) { // status changed. Not loading anymore group.setLoading(false); } return dirty; } public void cloudLoadingFinished() { jenkinsCloudGroup.setLoading(false); } }