/* * Copyright 2008-2012 Amazon Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://aws.amazon.com/apache2.0 * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES * OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and * limitations under the License. */ package com.amazonaws.eclipse.ec2.ui.views.instances; import java.text.DateFormat; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jface.viewers.BaseLabelProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; import com.amazonaws.eclipse.core.AwsToolkitCore; import com.amazonaws.eclipse.ec2.Ec2Plugin; import com.amazonaws.eclipse.ec2.TagFormatter; import com.amazonaws.eclipse.ec2.keypairs.KeyPairManager; import com.amazonaws.services.ec2.model.Instance; import com.amazonaws.services.ec2.model.Tag; /** * Label and content provider for the EC2 Instance table. */ class ViewContentAndLabelProvider extends BaseLabelProvider implements ITreeContentProvider, ITableLabelProvider { static final int INSTANCE_ID_COLUMN = 0; static final int PUBLIC_DNS_COLUMN = 1; static final int IMAGE_ID_COLUMN = 2; static final int ROOT_DEVICE_COLUMN = 3; static final int STATE_COLUMN = 4; static final int INSTANCE_TYPE_COLUMN = 5; static final int AVAILABILITY_ZONE_COLUMN = 6; static final int KEY_NAME_COLUMN = 7; static final int LAUNCH_TIME_COLUMN = 8; static final int SECURITY_GROUPS_COLUMN = 9; static final int TAGS_COLUMN = 10; private final DateFormat dateFormat; private KeyPairManager keyPairManager = new KeyPairManager(); /** The input to be displayed by this content / label provider */ private InstancesViewInput instancesViewInput; /** Map of instance states to images representing those states */ private static final Map<String, Image> stateImageMap = new HashMap<String, Image>(); static { stateImageMap.put("running", Ec2Plugin.getDefault().getImageRegistry().get("status-running")); stateImageMap.put("rebooting", Ec2Plugin.getDefault().getImageRegistry().get("status-rebooting")); stateImageMap.put("shutting-down", Ec2Plugin.getDefault().getImageRegistry().get("status-waiting")); stateImageMap.put("pending", Ec2Plugin.getDefault().getImageRegistry().get("status-waiting")); stateImageMap.put("stopping", Ec2Plugin.getDefault().getImageRegistry().get("status-waiting")); stateImageMap.put("stopped", Ec2Plugin.getDefault().getImageRegistry().get("status-terminated")); stateImageMap.put("terminated", Ec2Plugin.getDefault().getImageRegistry().get("status-terminated")); } /** Default constructor */ ViewContentAndLabelProvider() { dateFormat = DateFormat.getDateTimeInstance(); } /* * IStructuredContentProvider Interface */ /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer v, Object oldInput, Object newInput) { instancesViewInput = (InstancesViewInput)newInput; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose() */ public void dispose() { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object parent) { if (instancesViewInput == null) { return new Object[0]; } return instancesViewInput.instances.toArray(); } /* * ITableLabelProvider Interface */ /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText(Object obj, int index) { Instance instance = (Instance)obj; switch (index) { case INSTANCE_ID_COLUMN: return instance.getInstanceId(); case PUBLIC_DNS_COLUMN: return instance.getPublicDnsName(); case ROOT_DEVICE_COLUMN: return instance.getRootDeviceType(); case STATE_COLUMN: return instance.getState().getName(); case INSTANCE_TYPE_COLUMN: return instance.getInstanceType().toString(); case AVAILABILITY_ZONE_COLUMN: return instance.getPlacement().getAvailabilityZone(); case IMAGE_ID_COLUMN: return instance.getImageId(); case KEY_NAME_COLUMN: return instance.getKeyName(); case LAUNCH_TIME_COLUMN: if ( instance.getLaunchTime() == null ) return ""; return dateFormat.format(instance.getLaunchTime()); case SECURITY_GROUPS_COLUMN: return formatSecurityGroups(instancesViewInput.securityGroupMap.get(instance.getInstanceId())); case TAGS_COLUMN: return TagFormatter.formatTags(instance.getTags()); default: return "???"; } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage(Object obj, int index) { Instance instance = (Instance)obj; switch (index) { case INSTANCE_ID_COLUMN: return Ec2Plugin.getDefault().getImageRegistry().get("server"); case KEY_NAME_COLUMN: if (keyPairManager.isKeyPairValid(AwsToolkitCore.getDefault().getCurrentAccountId(), instance.getKeyName())) { return Ec2Plugin.getDefault().getImageRegistry().get("check"); } else { return Ec2Plugin.getDefault().getImageRegistry().get("error"); } case STATE_COLUMN: String state = instance.getState().getName().toLowerCase(); return stateImageMap.get(state); } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object) */ public Image getImage(Object obj) { return null; } /* * Package Interface */ /** * Provides access to the instance -> security groups mapping contained in * this class. This should probably be shifted around into another location, * but for now we'll provide this data from here. If the amount of other * data we need to associated with the Instance datatype grows a lot, * we should definitely clean this up so that other objects can more easily * access this data. * * @param instanceId * The ID of the instance to look up. * * @return A list of the security groups the specified instance is in. */ List<String> getSecurityGroupsForInstance(String instanceId) { if (instancesViewInput == null) { return null; } return instancesViewInput.securityGroupMap.get(instanceId); } /* * Private Interface */ /** * Takes the list of security groups and turns it into a comma separated * string list. * * @param securityGroups * A list of security groups to turn into a comma separated * string list. * * @return A comma separated list containing the contents of the specified * list of security groups. */ private String formatSecurityGroups(List<String> securityGroups) { if (securityGroups == null) return ""; String allSecurityGroups = ""; for (String securityGroup : securityGroups) { if (allSecurityGroups.length() > 0) allSecurityGroups += ", "; allSecurityGroups += securityGroup; } return allSecurityGroups; } public Object[] getChildren(Object parentElement) { return new Object[0]; } public Object getParent(Object element) { return null; } public boolean hasChildren(Object element) { return false; } } /** * Simple container for the instances and security group mappings displayed * by the viewer associated with this content/label provider. */ class InstancesViewInput { /** The EC2 instances being displayed by this viewer */ public final List<Instance> instances; /** A map of instance ids -> security groups */ public final Map<String, List<String>> securityGroupMap; /** * Constructs a new InstancesViewInput object with the specified list of * instances and mapping of instances to security groups. * * @param instances * A list of the instances that should be displayed. * @param securityGroupMap * A map of instance ids to the list of security groups in which * that instance was launched. */ public InstancesViewInput(final List<Instance> instances, final Map<String, List<String>> securityGroupMap) { this.instances = instances; this.securityGroupMap = securityGroupMap; } }