package com.amazonaws.eclipse.opsworks.explorer; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import com.amazonaws.eclipse.core.AwsToolkitCore; import com.amazonaws.eclipse.core.regions.ServiceAbbreviations; import com.amazonaws.eclipse.explorer.AWSResourcesRootElement; import com.amazonaws.eclipse.explorer.AbstractContentProvider; import com.amazonaws.eclipse.explorer.Loading; import com.amazonaws.eclipse.opsworks.ServiceAPIUtils; import com.amazonaws.eclipse.opsworks.explorer.node.AppsRootNode; import com.amazonaws.eclipse.opsworks.explorer.node.LayerElementNode; import com.amazonaws.eclipse.opsworks.explorer.node.LayersRootNode; import com.amazonaws.eclipse.opsworks.explorer.node.OpsWorksRootNode; import com.amazonaws.services.opsworks.AWSOpsWorks; import com.amazonaws.services.opsworks.model.App; import com.amazonaws.services.opsworks.model.Instance; import com.amazonaws.services.opsworks.model.Layer; import com.amazonaws.services.opsworks.model.Stack; public class OpsWorksContentProvider extends AbstractContentProvider { private static OpsWorksContentProvider instance; public OpsWorksContentProvider() { instance = this; } /* * Abstract methods of AbstractContentProvider */ public boolean hasChildren(Object element) { if (element instanceof AWSResourcesRootElement || element instanceof OpsWorksRootNode || element instanceof Stack) { return true; } if (element instanceof LayersRootNode) { LayersRootNode node = (LayersRootNode)element; return node.getLayerNodes() != null && !node.getLayerNodes().isEmpty(); } if (element instanceof LayerElementNode) { LayerElementNode node = (LayerElementNode)element; return node.getInstancesInLayer() != null && !node.getInstancesInLayer().isEmpty(); } if (element instanceof AppsRootNode) { AppsRootNode node = (AppsRootNode)element; return node.getApps() != null && !node.getApps().isEmpty(); } return false; } @Override public Object[] loadChildren(Object parentElement) { if (parentElement instanceof AWSResourcesRootElement) { return new Object[] { OpsWorksRootNode.ROOT_ELEMENT }; } if (parentElement instanceof OpsWorksRootNode) { new DataLoaderThread(parentElement) { @Override public Object[] loadData() { AWSOpsWorks client = AwsToolkitCore.getClientFactory() .getOpsWorksClient(); return ServiceAPIUtils.getAllStacks(client).toArray(); } }.start(); } if (parentElement instanceof Stack) { final String stackId = ((Stack) parentElement).getStackId(); new DataLoaderThread(parentElement) { @Override public Object[] loadData() { AWSOpsWorks client = AwsToolkitCore.getClientFactory() .getOpsWorksClient(); List<Layer> layers = ServiceAPIUtils .getAllLayersInStack(client, stackId); List<LayerElementNode> layerNodes = new LinkedList<LayerElementNode>(); for (Layer layer : layers) { layerNodes.add(new LayerElementNode(layer)); } LayersRootNode layersRoot = new LayersRootNode(layerNodes); List<App> apps = ServiceAPIUtils .getAllAppsInStack(client, stackId); AppsRootNode appsRoot = new AppsRootNode(apps); return new Object[] {appsRoot, layersRoot}; } }.start(); } if (parentElement instanceof LayersRootNode) { AWSOpsWorks client = AwsToolkitCore.getClientFactory() .getOpsWorksClient(); List<LayerElementNode> layerNodes = ((LayersRootNode)parentElement).getLayerNodes(); for (LayerElementNode layerNode : layerNodes) { List<Instance> instances = ServiceAPIUtils .getAllInstancesInLayer(client, layerNode.getLayer().getLayerId()); layerNode.setInstancesInLayer(instances); } return layerNodes.toArray(); } if (parentElement instanceof LayerElementNode) { return ((LayerElementNode)parentElement).getInstancesInLayer().toArray(); } if (parentElement instanceof AppsRootNode) { return ((AppsRootNode)parentElement).getApps().toArray(); } return Loading.LOADING; } @Override public String getServiceAbbreviation() { return ServiceAbbreviations.OPSWORKS; } @Override public void dispose() { viewer.removeOpenListener(listener); super.dispose(); } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { super.inputChanged(viewer, oldInput, newInput); this.viewer.addOpenListener(listener); } public static OpsWorksContentProvider getInstance() { return instance; } private final IOpenListener listener = new IOpenListener() { public void open(OpenEvent event) { StructuredSelection selection = (StructuredSelection)event.getSelection(); Iterator<?> i = selection.iterator(); while ( i.hasNext() ) { Object obj = i.next(); // Node double-click actions } } }; }