/*
* Copyright 2010 JBoss 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://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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 org.drools.eclipse.task.views;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.drools.SystemEventListenerFactory;
import org.drools.eclipse.task.Activator;
import org.drools.eclipse.task.preferences.DroolsTaskConstants;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.dialogs.ViewContentProvider;
import org.eclipse.ui.internal.dialogs.ViewLabelProvider;
import org.eclipse.ui.part.ViewPart;
import org.jbpm.process.workitem.wsht.BlockingAddTaskResponseHandler;
import org.jbpm.task.Status;
import org.jbpm.task.User;
import org.jbpm.task.query.TaskSummary;
import org.jbpm.task.service.TaskClient;
import org.jbpm.task.service.mina.MinaTaskClientConnector;
import org.jbpm.task.service.mina.MinaTaskClientHandler;
public class TaskView extends ViewPart {
private static final String NAME_COLUMN = "Name";
private static final String STATUS_COLUMN = "Status";
private static final String OWNER_COLUMN = "Owner";
private static final String CREATED_COLUMN = "Created";
private static final String COMMENT_COLUMN = "Comment";
private static String[] columnNames = new String[] {
NAME_COLUMN,
STATUS_COLUMN,
OWNER_COLUMN,
CREATED_COLUMN,
COMMENT_COLUMN
};
private static Map<Status, String> STATUSSES;
static {
STATUSSES = new HashMap<Status, String>();
STATUSSES.put(Status.Created, "Created");
STATUSSES.put(Status.Completed, "Completed");
STATUSSES.put(Status.Error, "Error");
STATUSSES.put(Status.Exited, "Exited");
STATUSSES.put(Status.Failed, "Failed");
STATUSSES.put(Status.InProgress, "InProgress");
STATUSSES.put(Status.Obsolete, "Obsolete");
STATUSSES.put(Status.Ready, "Ready");
STATUSSES.put(Status.Reserved, "Reserved");
STATUSSES.put(Status.Suspended, "Suspended");
}
private String ipAddress = "127.0.0.1";
private int port = 9123;
private String language = "en-UK";
private Text userNameText;
private Table table;
private TableViewer tableViewer;
private Action refreshAction;
private Button claimButton;
private Button startButton;
private Button stopButton;
private Button releaseButton;
private Button suspendButton;
private Button resumeButton;
private Button skipButton;
private Button completeButton;
private Button failButton;
private TaskClient client;
private class ViewContentProvider implements IStructuredContentProvider {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
public void dispose() {
}
@SuppressWarnings({ "unchecked" })
public Object[] getElements(Object parent) {
if (parent instanceof List) {
List<TaskSummary> tasks = (List<TaskSummary>) parent;
return tasks.toArray();
}
return new String[0];
}
}
private class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
public String getColumnText(Object obj, int index) {
if (obj instanceof TaskSummary) {
TaskSummary taskSummary = (TaskSummary) obj;
switch (index) {
case 0:
return taskSummary.getName();
case 1:
Status status = taskSummary.getStatus();
return status == null ? null : STATUSSES.get(status);
case 2:
User user = taskSummary.getActualOwner();
if (user == null) {
return null;
}
return user.getId();
case 3:
return DateFormat.getDateTimeInstance().format(
taskSummary.getCreatedOn());
case 4:
return taskSummary.getDescription();
default:
throw new IllegalArgumentException(
"Unknown column index: " + index);
}
}
return getText(obj);
}
public Image getColumnImage(Object obj, int index) {
return getImage(obj);
}
public Image getImage(Object obj) {
return null;
}
}
public TaskView() {
IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore();
ipAddress = preferenceStore.getString(DroolsTaskConstants.SERVER_IP_ADDRESS);
port = preferenceStore.getInt(DroolsTaskConstants.SERVER_PORT);
language = preferenceStore.getString(DroolsTaskConstants.LANGUAGE);
preferenceStore.addPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (DroolsTaskConstants.SERVER_IP_ADDRESS.equals(event.getProperty())) {
ipAddress = (String) event.getNewValue();
} else if (DroolsTaskConstants.SERVER_PORT.equals(event.getProperty())) {
port = (Integer) event.getNewValue();
} else if (DroolsTaskConstants.LANGUAGE.equals(event.getProperty())) {
language = (String) event.getNewValue();
}
}
});
}
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout(11, false));
Label userNameLabel = new Label(parent, SWT.NONE);
userNameLabel.setText("UserId");
userNameText = new Text(parent, SWT.NONE);
GridData layoutData = new GridData();
layoutData.horizontalSpan = 8;
layoutData.minimumWidth = 120;
layoutData.grabExcessHorizontalSpace = true;
layoutData.horizontalAlignment = GridData.FILL_HORIZONTAL;
userNameText.setLayoutData(layoutData);
Button refresh = new Button(parent, SWT.PUSH | SWT.CENTER);
refresh.setText("Refresh");
refresh.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
refresh();
}
});
Button create = new Button(parent, SWT.PUSH | SWT.CENTER);
create.setText("Create");
create.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
createTask();
}
});
createTable(parent);
createTableViewer();
tableViewer.setContentProvider(new ViewContentProvider());
tableViewer.setLabelProvider(new ViewLabelProvider());
tableViewer.setInput(getViewSite());
createButtons(parent);
makeActions();
hookContextMenu();
contributeToActionBars();
}
/**
* Create the Table
*/
private void createTable(Composite parent) {
int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
| SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
table = new Table(parent, style);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessVerticalSpace = true;
gridData.horizontalSpan = 11;
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
// 1st column = task name
TableColumn column = new TableColumn(table, SWT.LEFT, 0);
column.setText("Name");
column.setWidth(300);
// 2nd column = task status
column = new TableColumn(table, SWT.LEFT, 1);
column.setText("Status");
column.setWidth(100);
// 3rd column = task owner
column = new TableColumn(table, SWT.LEFT, 2);
column.setText("Owner");
column.setWidth(100);
// 4th column = expiration time
column = new TableColumn(table, SWT.CENTER, 3);
column.setText("Comment");
column.setWidth(120);
// 5th column = created
column = new TableColumn(table, SWT.CENTER, 3);
column.setText("Created On");
column.setWidth(120);
}
private void createTableViewer() {
tableViewer = new TableViewer(table);
tableViewer.setUseHashlookup(true);
tableViewer.setColumnProperties(columnNames);
}
private void createButtons(Composite parent) {
claimButton = new Button(parent, SWT.PUSH | SWT.CENTER);
claimButton.setText("Claim");
claimButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
claim();
}
});
claimButton.setEnabled(false);
startButton = new Button(parent, SWT.PUSH | SWT.CENTER);
startButton.setText("Start");
startButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
start();
}
});
startButton.setEnabled(false);
stopButton = new Button(parent, SWT.PUSH | SWT.CENTER);
stopButton.setText("Stop");
stopButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
stop();
}
});
stopButton.setEnabled(false);
releaseButton = new Button(parent, SWT.PUSH | SWT.CENTER);
releaseButton.setText("Release");
releaseButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
release();
}
});
releaseButton.setEnabled(false);
suspendButton = new Button(parent, SWT.PUSH | SWT.CENTER);
suspendButton.setText("Suspend");
suspendButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
suspend();
}
});
suspendButton.setEnabled(false);
resumeButton = new Button(parent, SWT.PUSH | SWT.CENTER);
resumeButton.setText("Resume");
resumeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
resume();
}
});
resumeButton.setEnabled(false);
skipButton = new Button(parent, SWT.PUSH | SWT.CENTER);
skipButton.setText("Skip");
skipButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
skip();
}
});
skipButton.setEnabled(false);
completeButton = new Button(parent, SWT.PUSH | SWT.CENTER);
completeButton.setText("Complete");
completeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
complete();
}
});
completeButton.setEnabled(false);
failButton = new Button(parent, SWT.PUSH | SWT.CENTER);
failButton.setText("Fail");
failButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
fail();
}
});
failButton.setEnabled(false);
GridData layoutData = new GridData();
layoutData.horizontalSpan = 2;
layoutData.horizontalAlignment = SWT.BEGINNING;
failButton.setLayoutData(layoutData);
table.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
System.out.println(e);
}
public void widgetSelected(SelectionEvent e) {
updateButtons();
}
});
}
private void updateButtons() {
boolean selected = table.getSelectionCount() == 1;
TaskSummary task = getSelectedTask();
String userId = getUserId();
claimButton.setEnabled(selected && Status.Ready.equals(task.getStatus()));
startButton.setEnabled(selected &&
(Status.Ready.equals(task.getStatus()) ||
(Status.Reserved.equals(task.getStatus())
&& userId.equals(task.getActualOwner().getId()))));
stopButton.setEnabled(selected && Status.InProgress.equals(task.getStatus())
&& userId.equals(task.getActualOwner().getId()));
releaseButton.setEnabled(selected &&
(Status.Reserved.equals(task.getStatus()) || Status.InProgress.equals(task.getStatus()))
&& userId.equals(task.getActualOwner().getId()));
suspendButton.setEnabled(selected &&
(Status.Ready.equals(task.getStatus()) ||
((Status.Reserved.equals(task.getStatus()) || Status.InProgress.equals(task.getStatus()))
&& userId.equals(task.getActualOwner().getId()))));
// TODO only actual owner if previousStatus = reserved or inProgress
resumeButton.setEnabled(selected && Status.Suspended.equals(task.getStatus()));
// TODO only initiator if state Created
skipButton.setEnabled(selected && task.isSkipable() &&
(Status.Created.equals(task.getStatus()) && Status.Ready.equals(task.getStatus()) ||
((Status.Reserved.equals(task.getStatus()) || Status.InProgress.equals(task.getStatus()))
&& userId.equals(task.getActualOwner().getId()))));
completeButton.setEnabled(selected && Status.InProgress.equals(task.getStatus())
&& userId.equals(task.getActualOwner().getId()));
failButton.setEnabled(selected && Status.InProgress.equals(task.getStatus())
&& userId.equals(task.getActualOwner().getId()));
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
TaskView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(tableViewer.getControl());
tableViewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, tableViewer);
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
manager.add(refreshAction);
}
private void fillContextMenu(IMenuManager manager) {
manager.add(refreshAction);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(refreshAction);
}
private void makeActions() {
refreshAction = new Action() {
public void run() {
refresh();
}
};
refreshAction.setText("Refresh");
refreshAction.setToolTipText("Refresh the task list");
refreshAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
}
private void showMessage(String message) {
MessageDialog.openInformation(
tableViewer.getControl().getShell(), "Task View", message);
}
public void setFocus() {
tableViewer.getControl().setFocus();
}
private void refresh() {
String userId = getUserId();
if (userId == null) {
return;
}
TaskClient client = getTaskClient();
if (client == null) {
return;
}
try {
BlockingTaskSummaryResponseHandler responseHandler = new BlockingTaskSummaryResponseHandler();
client.getTasksAssignedAsPotentialOwner(userId, language, responseHandler);
List<TaskSummary> tasks = responseHandler.getResults();
tableViewer.setInput(tasks);
tableViewer.refresh();
tableViewer.setSelection(null);
updateButtons();
} catch (TimeoutException e) {
showMessage("Could not connect to task server, refresh first.");
try {
client.disconnect();
} catch (Exception exc) {
exc.printStackTrace();
}
this.client = null;
tableViewer.setInput(new ArrayList<TaskSummary>());
tableViewer.refresh();
tableViewer.setSelection(null);
}
}
private void createTask() {
NewTaskDialog dialog = new NewTaskDialog(getSite().getShell());
int result = dialog.open();
if (result == Dialog.OK) {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
BlockingAddTaskResponseHandler responseHandler = new BlockingAddTaskResponseHandler();
client.addTask(dialog.getTask(), dialog.getContent(), responseHandler);
responseHandler.waitTillDone(5000);
refresh();
}
}
public void claim() {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
String userId = getUserId();
if (userId == null) {
return;
}
TaskSummary taskSummary = getSelectedTask();
if (taskSummary == null) {
return;
}
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.claim(taskSummary.getId(), userId, responseHandler);
responseHandler.waitTillDone(3000);
refresh();
}
public void start() {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
String userId = getUserId();
if (userId == null) {
return;
}
TaskSummary taskSummary = getSelectedTask();
if (taskSummary == null) {
return;
}
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.start(taskSummary.getId(), userId, responseHandler);
responseHandler.waitTillDone(3000);
refresh();
}
public void stop() {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
String userId = getUserId();
if (userId == null) {
return;
}
TaskSummary taskSummary = getSelectedTask();
if (taskSummary == null) {
return;
}
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.stop(taskSummary.getId(), userId, responseHandler);
responseHandler.waitTillDone(3000);
refresh();
}
public void release() {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
String userId = getUserId();
if (userId == null) {
return;
}
TaskSummary taskSummary = getSelectedTask();
if (taskSummary == null) {
return;
}
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.release(taskSummary.getId(), userId, responseHandler);
responseHandler.waitTillDone(3000);
refresh();
}
public void suspend() {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
String userId = getUserId();
if (userId == null) {
return;
}
TaskSummary taskSummary = getSelectedTask();
if (taskSummary == null) {
return;
}
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.suspend(taskSummary.getId(), userId, responseHandler);
responseHandler.waitTillDone(3000);
refresh();
}
public void resume() {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
String userId = getUserId();
if (userId == null) {
return;
}
TaskSummary taskSummary = getSelectedTask();
if (taskSummary == null) {
return;
}
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.resume(taskSummary.getId(), userId, responseHandler);
responseHandler.waitTillDone(3000);
refresh();
}
public void skip() {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
String userId = getUserId();
if (userId == null) {
return;
}
TaskSummary taskSummary = getSelectedTask();
if (taskSummary == null) {
return;
}
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.skip(taskSummary.getId(), userId, responseHandler);
responseHandler.waitTillDone(3000);
refresh();
}
public void complete() {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
String userId = getUserId();
if (userId == null) {
return;
}
TaskSummary taskSummary = getSelectedTask();
if (taskSummary == null) {
return;
}
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.complete(taskSummary.getId(), userId, null, responseHandler);
responseHandler.waitTillDone(3000);
refresh();
}
public void fail() {
TaskClient client = getTaskClient();
if (client == null) {
return;
}
String userId = getUserId();
if (userId == null) {
return;
}
TaskSummary taskSummary = getSelectedTask();
if (taskSummary == null) {
return;
}
BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
client.fail(taskSummary.getId(), userId, null, responseHandler);
responseHandler.waitTillDone(3000);
refresh();
}
private TaskClient getTaskClient() {
if (client == null) {
client = new TaskClient(new MinaTaskClientConnector("client 1",
new MinaTaskClientHandler(SystemEventListenerFactory.getSystemEventListener())));
boolean connected = client.connect(ipAddress, port);
if (!connected) {
showMessage("Could not connect to task server: " + ipAddress + " [port " + port + "]");
client = null;
}
}
return client;
}
public void dispose() {
if (client != null) {
try {
client.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
super.dispose();
}
private String getUserId() {
return userNameText.getText();
}
private TaskSummary getSelectedTask() {
ISelection selection = tableViewer.getSelection();
if (selection instanceof StructuredSelection) {
Object selected = ((StructuredSelection) selection).getFirstElement();
if (selected instanceof TaskSummary) {
return (TaskSummary) selected;
}
}
return null;
}
}