/*******************************************************************************
* Copyright (c) 2012 AGETO Service GmbH and others.
* All rights reserved.
*
* This program and the accompanying materials are 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:
* Gunnar Wagenknecht - initial API and implementation
*******************************************************************************/
package org.eclipse.gyrex.admin.ui.cloud.internal;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.gyrex.cloud.admin.ICloudManager;
import org.eclipse.gyrex.cloud.admin.INodeDescriptor;
import org.eclipse.gyrex.cloud.admin.INodeListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Control;
public final class NodeBrowserContentProvider implements ITreeContentProvider {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
public static final class NodeItem {
private final boolean approved;
private final boolean online;
private final INodeDescriptor descriptor;
public NodeItem(final boolean approved, final boolean online, final INodeDescriptor descriptor) {
this.approved = approved;
this.online = online;
this.descriptor = descriptor;
}
public INodeDescriptor getDescriptor() {
return descriptor;
}
public boolean isApproved() {
return approved;
}
public boolean isOnline() {
return online;
}
}
private static final Object[] EMPTY_ARRAY = new Object[0];
private final INodeListener nodeListener = new INodeListener() {
@Override
public void nodesChanged() {
final Viewer viewer = NodeBrowserContentProvider.this.viewer;
final Control control = viewer.getControl();
if (null != control && !control.isDisposed()) {
control.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
if (!control.isDisposed()) {
viewer.refresh();
}
}
});
}
}
};
Viewer viewer;
private void attach(final Object input) {
if (input instanceof ICloudManager) {
((ICloudManager) input).addNodeListener(nodeListener);
}
}
private void detach(final Object input) {
if (input instanceof ICloudManager) {
((ICloudManager) input).removeNodeListener(nodeListener);
}
}
@Override
public void dispose() {
if (null != viewer) {
detach(viewer.getInput());
viewer = null;
}
}
@Override
public Object[] getChildren(final Object parentElement) {
return EMPTY_ARRAY;
}
@Override
public Object[] getElements(final Object inputElement) {
if (inputElement instanceof ICloudManager) {
final List<NodeItem> nodes = new ArrayList<NodeItem>();
final ICloudManager cloudManager = (ICloudManager) inputElement;
final Set<String> onlineNodes = cloudManager.getOnlineNodes();
for (final INodeDescriptor nodeDescriptor : cloudManager.getApprovedNodes()) {
nodes.add(new NodeItem(true, onlineNodes.contains(nodeDescriptor.getId()), nodeDescriptor));
}
for (final INodeDescriptor nodeDescriptor : cloudManager.getPendingNodes()) {
nodes.add(new NodeItem(false, onlineNodes.contains(nodeDescriptor.getId()), nodeDescriptor));
}
return nodes.toArray();
}
return EMPTY_ARRAY;
}
@Override
public Object getParent(final Object element) {
return null;
}
@Override
public boolean hasChildren(final Object element) {
return false;
}
@Override
public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
if (null != this.viewer && this.viewer != viewer) {
throw new IllegalStateException("please use separate provider instance for different viewers");
}
this.viewer = viewer;
detach(oldInput);
attach(newInput);
}
}