package com.amazonaws.eclipse.codedeploy.explorer.editor.table;
import static com.amazonaws.eclipse.codedeploy.explorer.editor.table.DeploymentsTableView.DEPLOYMENT_ID_COL;
import static com.amazonaws.eclipse.codedeploy.explorer.editor.table.DeploymentsTableView.END_TIME_COL;
import static com.amazonaws.eclipse.codedeploy.explorer.editor.table.DeploymentsTableView.INSTANCE_ID_COL;
import static com.amazonaws.eclipse.codedeploy.explorer.editor.table.DeploymentsTableView.LIFECYCLE_EVENT_COL;
import static com.amazonaws.eclipse.codedeploy.explorer.editor.table.DeploymentsTableView.LOGS_COL;
import static com.amazonaws.eclipse.codedeploy.explorer.editor.table.DeploymentsTableView.REVISION_LOCATION_COL;
import static com.amazonaws.eclipse.codedeploy.explorer.editor.table.DeploymentsTableView.START_TIME_COL;
import static com.amazonaws.eclipse.codedeploy.explorer.editor.table.DeploymentsTableView.STATUS_COL;
import java.util.Date;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import com.amazonaws.eclipse.codedeploy.CodeDeployPlugin;
import com.amazonaws.services.codedeploy.model.DeploymentInfo;
import com.amazonaws.services.codedeploy.model.DeploymentOverview;
import com.amazonaws.services.codedeploy.model.ErrorInformation;
import com.amazonaws.services.codedeploy.model.InstanceSummary;
import com.amazonaws.services.codedeploy.model.LifecycleEvent;
import com.amazonaws.services.codedeploy.model.RevisionLocation;
class DeploymentsTableViewLabelProvider extends StyledCellLabelProvider {
@Override
public void update(ViewerCell cell) {
String text = getColumnText(cell.getElement(), cell.getColumnIndex());
cell.setText(text);
if (cell.getColumnIndex() == STATUS_COL) {
if ("Succeeded".equals(text)) {
cell.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN));
} else if ("Failed".equals(text)) {
cell.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
} else if (cell.getElement() != LoadingContentProvider.LOADING ){
cell.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
}
}
super.update(cell); // calls 'repaint' to trigger the paint listener
}
private String getColumnText(Object element, int columnIndex) {
if ( element == LoadingContentProvider.LOADING ) {
return "Loading...";
}
try {
if (element instanceof DeploymentInfo) {
DeploymentInfo deployment = (DeploymentInfo) element;
switch (columnIndex) {
case DEPLOYMENT_ID_COL:
return deployment.getDeploymentId();
case INSTANCE_ID_COL:
return getInstancesOverviewString(deployment);
case START_TIME_COL:
return getDateString(deployment.getCreateTime());
case END_TIME_COL:
return getDateString(deployment.getCompleteTime());
case STATUS_COL:
return deployment.getStatus();
case REVISION_LOCATION_COL:
RevisionLocation revision = deployment.getRevision();
if ("S3".equals(revision.getRevisionType())) {
return String.format("s3://%s/%s",
revision.getS3Location().getBucket(),
revision.getS3Location().getKey());
} else if ("GitHub".equals(revision.getRevisionType())) {
return String.format("github://%s/%s",
revision.getGitHubLocation().getRepository(),
revision.getGitHubLocation().getCommitId());
}
return "";
case LOGS_COL:
ErrorInformation error = deployment.getErrorInformation();
return error == null
? ""
: String.format("[%s] %s", error.getCode(), error.getMessage());
}
}
if (element instanceof InstanceSummary) {
InstanceSummary instance = (InstanceSummary) element;
switch (columnIndex) {
case INSTANCE_ID_COL:
return extractInstanceId(instance.getInstanceId());
case START_TIME_COL:
if (instance.getLifecycleEvents() != null
&& !instance.getLifecycleEvents().isEmpty()) {
return getDateString(instance.getLifecycleEvents().get(0).getStartTime());
} else {
return "";
}
case END_TIME_COL:
if (instance.getLifecycleEvents() != null
&& !instance.getLifecycleEvents().isEmpty()) {
return getDateString(instance.getLifecycleEvents()
.get(instance.getLifecycleEvents().size() - 1)
.getEndTime());
} else {
return "";
}
case STATUS_COL:
return instance.getStatus();
}
}
if (element instanceof LifecycleEvent) {
LifecycleEvent event = (LifecycleEvent) element;
switch (columnIndex) {
case LIFECYCLE_EVENT_COL:
return event.getLifecycleEventName();
case START_TIME_COL:
return getDateString(event.getStartTime());
case END_TIME_COL:
return getDateString(event.getEndTime());
case STATUS_COL:
return event.getStatus();
case LOGS_COL:
return event.getDiagnostics() == null ?
"" : event.getDiagnostics().getErrorCode();
}
}
} catch (Exception e) {
CodeDeployPlugin.getDefault().reportException(
"Unable to display " + element.getClass().getName() +
" in the Deployment Group Editor.", e);
}
return "";
}
private static String getDateString(Date date) {
return date == null ? "" : date.toGMTString();
}
private static String extractInstanceId(String instanceArn) {
int index = instanceArn.lastIndexOf("/");
return instanceArn.substring(index + 1);
}
private static String getInstancesOverviewString(DeploymentInfo deployment) {
DeploymentOverview overview = deployment.getDeploymentOverview();
if (overview == null) {
return "";
}
long total = overview.getFailed() + overview.getInProgress()
+ overview.getPending() + overview.getSkipped()
+ overview.getSucceeded();
return String.format("(%d of %d completed)",
overview.getSucceeded(), total);
}
}