/*******************************************************************************
* Copyright (c) 2013 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.jobs.internal;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import org.eclipse.gyrex.admin.ui.internal.widgets.AdminPageWithTree;
import org.eclipse.gyrex.cloud.services.queue.IQueue;
import org.eclipse.gyrex.cloud.services.queue.IQueueService;
import org.eclipse.gyrex.common.identifiers.IdHelper;
import org.eclipse.gyrex.jobs.internal.JobsActivator;
import org.eclipse.gyrex.jobs.internal.worker.JobInfo;
import org.eclipse.gyrex.jobs.manager.IJobManager;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.apache.commons.lang.StringUtils;
/**
* Admin page for managing the content of a job queue.
*/
public class ManageJobQueuePage extends AdminPageWithTree {
private static final int COLUMN_ID = 0;
private static final int COLUMN_TYPE = 1;
private static final int COLUMN_CONTEXT = 2;
private static final int COLUMN_AGE = 3;
private static final int COLUMN_TRIGGER = 4;
static String toRelativeTime(final long duration) {
if (duration < TimeUnit.MINUTES.toMillis(2))
return "a minute";
else if (duration < TimeUnit.HOURS.toMillis(2))
return String.format("%d minutes", TimeUnit.MILLISECONDS.toMinutes(duration));
else
return String.format("%d hours", TimeUnit.MILLISECONDS.toMinutes(duration));
}
private Label queueLabel;
public ManageJobQueuePage() {
super(5);
setTitle("Job Queue Contents");
}
@Override
protected void createButtons(final Composite parent) {
// TODO Auto-generated method stub
}
@Override
protected ITreeContentProvider createContentProvider() {
return new JobQueueContentProvider();
}
@Override
protected Control createHeader(final Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(GridLayoutFactory.fillDefaults().create());
queueLabel = new Label(composite, SWT.BEGINNING);
return composite;
}
@Override
protected String getColumnLabel(final int column) {
switch (column) {
case COLUMN_ID:
return "Job";
case COLUMN_TYPE:
return "Type";
case COLUMN_CONTEXT:
return "Context";
case COLUMN_AGE:
return "Age";
case COLUMN_TRIGGER:
return "Trigger";
default:
return null;
}
}
@Override
protected String getElementLabel(final Object element, final int column) {
if (element instanceof JobInfo) {
final JobInfo jobInfo = (JobInfo) element;
switch (column) {
case COLUMN_ID:
return jobInfo.getJobId();
case COLUMN_TYPE:
return getTypeName(jobInfo);
case COLUMN_CONTEXT:
return String.valueOf(jobInfo.getContextPath());
case COLUMN_AGE:
return toRelativeTime(System.currentTimeMillis() - jobInfo.getQueueTimestamp());
case COLUMN_TRIGGER:
return jobInfo.getQueueTrigger();
default:
return null;
}
} else if ((column == NO_COLUMN) || (column == COLUMN_ID))
return String.valueOf(element);
else
return null;
}
private String getQueueId() {
final String[] args = getArguments();
if ((args.length > 1) && StringUtils.isNotBlank(args[1])) {
switch (args[1]) {
case "default":
return IJobManager.DEFAULT_QUEUE;
case "priority":
return IJobManager.PRIORITY_QUEUE;
default:
if (IdHelper.isValidId(args[1]))
return args[1];
break;
}
}
return IJobManager.DEFAULT_QUEUE;
}
private IQueueService getQueueService() {
return JobsUiActivator.getInstance().getService(IQueueService.class);
}
private String getTypeName(final JobInfo info) {
final String name = JobsActivator.getInstance().getJobProviderRegistry().getName(info.getJobTypeId());
if (StringUtils.isNotBlank(name))
return name;
return "unknown (" + info.getJobTypeId() + ")";
}
@Override
protected Object getViewerInput() {
final String queueId = getQueueId();
final IQueue queue = getQueueService().getQueue(queueId, null);
if (queue != null)
return queue;
return Collections.singleton(String.format("Queue '%s' not available!", queueId));
}
@Override
protected boolean isColumnSortable(final int column) {
return false;
}
@Override
public void setArguments(final String[] args) {
super.setArguments(args);
}
@Override
protected void updateButtons() {
updateQueueLabel();
}
private void updateQueueLabel() {
final String queueId = getQueueId();
final StringBuilder text = new StringBuilder();
switch (queueId) {
case IJobManager.DEFAULT_QUEUE:
text.append("Default Job Queue");
break;
case IJobManager.PRIORITY_QUEUE:
text.append("Priority Job Queue");
break;
default:
text.append("Custom Queue: ").append(queueId);
break;
}
final IQueue queue = getQueueService().getQueue(queueId, null);
final int count = queue != null ? queue.size() : -1;
if ((count > 1) || (count == 0)) {
text.append(" (").append(count).append(" jobs)");
} else if (count == 1) {
text.append(" (").append(count).append(" job)");
}
queueLabel.setText(text.toString());
queueLabel.getParent().layout();
}
}