private JPanel createTopPanel(YWorkItem item) { JPanel topPanel = new JPanel(new BorderLayout()); topPanel.setBackground(YAdminGUI._apiColour); JPanel leftPanel = new JPanel(new BorderLayout()); leftPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); JTextArea explanatoryText = new JTextArea(); explanatoryText.setText( "The data you submitted for this work item was \n" + "validated against a schema (see below). For some reason the\n" + "this data did not succeed in passing the constrainst set\n" + "inside the schema.\n" + "Usage Note: If this is causing problems try using the Web server\n" + "version of YAWL, which supports automatic forms generation.\n" + "Otherwise you could copy the schema from this page and use it\n " + "to create a valid output document using an XML development tool."); explanatoryText.setEditable(false); explanatoryText.setFont(new Font("Arial", Font.BOLD, 12)); explanatoryText.setForeground(Color.DARK_GRAY); explanatoryText.setBackground(YAdminGUI._apiColour); leftPanel.add(explanatoryText); topPanel.add(leftPanel, BorderLayout.WEST); JPanel rightPanel = new JPanel(new GridLayout(4, 2)); rightPanel.setBackground(YAdminGUI._apiColour); rightPanel.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder( BorderFactory.createEtchedBorder(), "Work Item Details"), BorderFactory.createEmptyBorder(10, 10, 10, 10))); YTask task = YEngine.getInstance().getTaskDefinition(item.getSpecificationID(), item.getTaskID()); String taskName = task.getName(); String[] text = { item.getSpecificationID().toString(), taskName, item.getIDString(), item.getStartTimeStr() }; String[] labels = {"Specification ID", "Task Name", "WorkItem ID", "Task Started"}; for (int i = 0; i < text.length; i++) { String s = text[i]; rightPanel.add(new JLabel(labels[i])); JTextField t = new JTextField(s); t.setEditable(false); rightPanel.add(t); } topPanel.add(rightPanel, BorderLayout.CENTER); return topPanel; }
/** @author Lachlan Aldred Date: 15/05/2003 Time: 16:32:43 */ public class YWorklistModel { private static final Logger logger = Logger.getLogger(YWorklistModel.class); private YWorklistTableModel _availableWork; private YWorklistTableModel _myActiveTasks; private Vector inSequenceWorkitemIDs = new Vector(); private DateFormat _formatter; private static ParamsDefinitions _paramsDefinitions = new ParamsDefinitions(); // Reference to engine's management interface (used for accessing specifcation definiions) private static InterfaceAManagement _engineManagement = YEngine.getInstance(); // Reference to engine's client interface (used for worklist driving) private static InterfaceBClient _engineClient = YEngine.getInstance(); private static String xmlCommentHeader = "<!-- Test data loaded from -"; private String _username; private YWorklistGUI _gui; private JFrame _frame; public YWorklistModel(String userName, JFrame frame) { _frame = frame; _username = userName; _availableWork = new YWorklistTableModel( new String[] { "Case ID", "Task ID", "Description", "Status", "Enablement Time", "Firing Time", "Seq" }); _myActiveTasks = new YWorklistTableModel( new String[] { "Case ID", "Task ID", "Description", "Enablement Time", "Firing Time", "Start Time", "Seq" }); _formatter = new SimpleDateFormat("MMM dd H:mm:ss"); _gui = new YWorklistGUI(userName, this, frame); } // #################################################################################### // INTERFACE TO LOCAL WORKLIST // #################################################################################### private void removeUnstartedWorkItem(String caseIDStr, String taskID) { _availableWork.removeRow(caseIDStr + taskID); } private void addEnabledWorkItem(YWorkItem workItem, boolean inSequence) { logger.debug("addEnabledWorkItem: " + workItem.getIDString()); String caseIDStr = workItem.getCaseID().toString(); String taskID = workItem.getTaskID(); YSpecificationID specificationID = workItem.getSpecificationID(); YTask task = _engineClient.getTaskDefinition(specificationID, taskID); String taskDescription = task.getDecompositionPrototype().getID(); if (null == taskDescription) { taskDescription = taskID; } _availableWork.addRow( caseIDStr + taskID, new Object[] { caseIDStr, taskID, taskDescription, "Enabled", _formatter.format(workItem.getEnablementTime()), "", inSequence ? "Y" : "N" }); } private void addFiredWorkItem(YWorkItem workItem, boolean inSequence) { String caseIDStr = workItem.getCaseID().toString(); String taskID = workItem.getTaskID(); YSpecificationID specificationID = workItem.getSpecificationID(); YTask task = _engineClient.getTaskDefinition(specificationID, taskID); String taskDescription = task.getDecompositionPrototype().getID(); if (null == taskDescription) { taskDescription = taskID; } _availableWork.addRow( caseIDStr + taskID, new Object[] { caseIDStr, taskID, taskDescription, "Fired", _formatter.format(workItem.getEnablementTime()), _formatter.format(workItem.getFiringTime()), inSequence ? "Y" : "N" }); } private void removeStartedItem(String caseIDStr, String taskID) { _myActiveTasks.removeRow(caseIDStr + taskID); } private void addStartedWorkItem(YWorkItem item, boolean inSequence) { String caseIDStr = item.getCaseID().toString(); String taskID = item.getTaskID(); YSpecificationID specificationID = item.getSpecificationID(); YTask task = _engineClient.getTaskDefinition(specificationID, taskID); String taskDescription = task.getDecompositionPrototype().getID(); if (null == taskDescription) { taskDescription = taskID; } boolean allowsDynamicInstanceCreation = true; try { _engineClient.checkElegibilityToAddInstances(item.getIDString()); } catch (YAWLException e) { allowsDynamicInstanceCreation = false; } _myActiveTasks.addRow( caseIDStr + taskID, new Object[] { caseIDStr, taskID, taskDescription, _formatter.format(item.getEnablementTime()), _formatter.format(item.getFiringTime()), _formatter.format(item.getStartTime()), inSequence ? "Y" : "N", new Boolean(allowsDynamicInstanceCreation), item.getDataString(), getOutputSkeletonXML(caseIDStr, taskID) }); } Object[] getActiveTableData(String caseIDStr, String taskIDStr) { return (Object[]) _myActiveTasks._rows.get(caseIDStr + taskIDStr); } void setActiveTableData(Object[] data) { String workItemID; workItemID = (String) data[0] + data[1]; _myActiveTasks._rows.put(workItemID, data); } // ###################################################################################### // INTERFACE TO GUI // ###################################################################################### // MUTATORS ############################################################################ public void applyForWorkItem(String caseID, String taskID) throws YPersistenceException { Set workItems = _engineClient.getAvailableWorkItems(); for (Iterator iterator = workItems.iterator(); iterator.hasNext(); ) { YWorkItem item = (YWorkItem) iterator.next(); if (item.getCaseID().toString().equals(caseID) && item.getTaskID().equals(taskID)) { try { _engineClient.startWorkItem(item, null); } catch (YStateException e) { e.printStackTrace(); reportGeneralProblem(e); } catch (YDataStateException e) { e.printStackTrace(); new SpecificationQueryProcessingValidationErrorBox(_frame, item, e); } catch (YAWLException e) { e.printStackTrace(); reportGeneralProblem(e); } } } } public void createNewInstance(String caseID, String taskID, String newInstanceData) throws YPersistenceException { Set workItems = _engineClient.getAllWorkItems(); for (Iterator iterator = workItems.iterator(); iterator.hasNext(); ) { YWorkItem item = (YWorkItem) iterator.next(); if (item.getCaseID().toString().equals(caseID) && item.getTaskID().equals(taskID)) { try { _engineClient.createNewInstance(item, newInstanceData); } catch (YStateException e) { e.printStackTrace(); } } } } public boolean allowsDynamicInstanceCreation(String caseID, String taskID) { Set workItems = _engineClient.getAllWorkItems(); for (Iterator iterator = workItems.iterator(); iterator.hasNext(); ) { YWorkItem item = (YWorkItem) iterator.next(); if (item.getCaseID().toString().equals(caseID) && item.getTaskID().equals(taskID)) { try { _engineClient.checkElegibilityToAddInstances(item.getIDString()); return true; } catch (YStateException e) { return false; } } } return false; } public void attemptToFinishActiveJob(String caseID, String taskID) { Set workItems = _engineClient.getAllWorkItems(); for (Iterator iterator = workItems.iterator(); iterator.hasNext(); ) { YWorkItem item = (YWorkItem) iterator.next(); if (item.getCaseID().toString().equals(caseID) && item.getTaskID().equals(taskID)) { try { String outputData = _myActiveTasks.getOutputData(caseID, taskID); /** AJH: Write the output data into test data file */ File testDataDir = YAdminGUI.getSpecTestDataDirectory(item.getSpecificationID().getKey()); File taskInputData = new File(testDataDir, taskID + ".xml"); if (!taskInputData.exists()) { logger.info("Creating task data file - " + taskInputData.getAbsolutePath()); taskInputData.createNewFile(); } StringUtil.stringToFile(taskInputData.getAbsolutePath(), outputData); // _engineClient.completeWorkItem(item, outputData, inSequenceWorkitemIDs); _engineClient.completeWorkItem(item, outputData, null, YEngine.WorkItemCompletion.Normal); } catch (YDataStateException e) { String errors = e.getMessage(); if (errors.indexOf("FAILED TO VALIDATE AGAINST SCHEMA =") != -1) { System.out.println(e.getMessage()); new SpecificationQueryProcessingValidationErrorBox(_frame, item, e); } else { new UserInputValidationErrorBox(_frame, item, e); System.out.println(e.getMessage()); } } catch (Exception e) { // todo AJH - Create defalut skeleton at this point???? reportGeneralProblem(e); } } } } /** * Return the XML test data for a specified task * * @param caseID * @param taskID * @return testData */ public String getTaskTestData(String caseID, String taskID) { String testData = null; File taskInputData = null; Set workItems = _engineClient.getAllWorkItems(); for (Iterator iterator = workItems.iterator(); iterator.hasNext(); ) { YWorkItem item = (YWorkItem) iterator.next(); if (item.getCaseID().toString().equals(caseID) && item.getTaskID().equals(taskID)) { try { File testDataDir = YAdminGUI.getSpecTestDataDirectory(item.getSpecificationID().getKey()); taskInputData = new File(testDataDir, taskID + ".xml"); if (taskInputData.exists()) { testData = StringUtil.fileToString(taskInputData); } } catch (Exception e) { reportGeneralProblem(e); } } } if (testData == null) { return testData; } else if (testData.startsWith(xmlCommentHeader)) { return testData; } else { return xmlCommentHeader + taskInputData.getName() + " -->\n" + testData; } } private void reportGeneralProblem(Exception e) { _gui.reportGeneralProblem(e); } public void rollBackActiveTask(String caseID, String taskID) throws YPersistenceException, YLogException { Set workItems = _engineClient.getAllWorkItems(); for (Iterator iterator = workItems.iterator(); iterator.hasNext(); ) { YWorkItem item = (YWorkItem) iterator.next(); if (item.getCaseID().toString().equals(caseID) && item.getTaskID().equals(taskID)) { try { _engineClient.rollbackWorkItem(item.getIDString()); } catch (YStateException e) { e.printStackTrace(); } } } } public void refreshLists(String userName) { // clear the models List keys = new ArrayList(); keys.addAll(_availableWork._rows.keySet()); for (int i = 0; i < keys.size(); i++) { String id = (String) keys.get(i); _availableWork.removeRow(id); } keys.clear(); keys.addAll(_myActiveTasks._rows.keySet()); for (int i = 0; i < keys.size(); i++) { String id = (String) keys.get(i); _myActiveTasks.removeRow(id); } // now update them updateSelf(); // _worklistManager.informRemotePartnerOfcurrentState(userName); } private void updateSelf() { boolean inSequence = false; Set availableWorkItems = _engineClient.getAvailableWorkItems(); for (Iterator iterator = availableWorkItems.iterator(); iterator.hasNext(); ) { YWorkItem item = (YWorkItem) iterator.next(); if (inSequenceWorkitemIDs.contains(item.getTaskID())) { inSequence = true; } else { inSequence = false; } if (item.getStatus().equals(YWorkItemStatus.statusEnabled)) { addEnabledWorkItem(item, inSequence); } else if (item.getStatus().equals(YWorkItemStatus.statusFired)) { addFiredWorkItem(item, inSequence); } } Set allWorkItems = _engineClient.getAllWorkItems(); for (Iterator iterator = allWorkItems.iterator(); iterator.hasNext(); ) { YWorkItem item = (YWorkItem) iterator.next(); if (inSequenceWorkitemIDs.contains(item.getTaskID())) { inSequence = true; } else { inSequence = false; } if (item.getStatus().equals(YWorkItemStatus.statusExecuting)) { addStartedWorkItem(item, inSequence); } if (_paramsDefinitions.getParamsForTask(item.getTaskID()) == null) { YTask task = _engineClient.getTaskDefinition(item.getSpecificationID(), item.getTaskID()); String paramsAsXML = task.getInformation(); TaskInformation taskInfo = Marshaller.unmarshalTaskInformation(paramsAsXML); YParametersSchema paramsForTask = taskInfo.getParamSchema(); _paramsDefinitions.setParamsForTask(item.getTaskID(), paramsForTask); } } } // ACCESSORS ########################################################################### public YWorklistTableModel getAvaliableModel() { return this._availableWork; } public YWorklistTableModel getActiveTasksModel() { return this._myActiveTasks; } public String getOutputSkeletonXML(String caseID, String taskID) { YParametersSchema params = _paramsDefinitions.getParamsForTask(taskID); YWorkItem item = _engineClient.getWorkItem(caseID + ":" + taskID); YSpecificationID specID = item.getSpecificationID(); YTask task = _engineClient.getTaskDefinition(specID, item.getTaskID()); return Marshaller.getOutputParamsInXML( params, task.getDecompositionPrototype().getRootDataElementName()); } public List validateData() { List validationMessages = new Vector(); return validationMessages; } public YParameter getMIUniqueParam(String taskID) { YParametersSchema p = _paramsDefinitions.getParamsForTask(taskID); if (p == null) { return null; } return p.getFormalInputParam(); } public YWorklistGUI getGUI() { return _gui; } }