package context.apps.demos.imautostatus; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import context.arch.comm.DataObject; import context.arch.discoverer.Discoverer; import context.arch.enactor.EnactorComponentInfo; import context.arch.enactor.EnactorListener; import context.arch.enactor.EnactorParameter; import context.arch.intelligibility.Explainer; import context.arch.intelligibility.Explanation; import context.arch.intelligibility.query.AltQuery; import context.arch.intelligibility.query.Query; import context.arch.storage.Attributes; /** * Main application with GUI to display the IM Autostatus chat window. * @author Brian Y. Lim * */ public class AutostatusIntelligibleApplication extends AutostatusApplication implements EnactorListener, ActionListener { private static final long serialVersionUID = -6334725541707657993L; private Explainer explainer; private ConsoleStringPresenter presenter; private String outcome; private ChatWindow chatWindow; public AutostatusIntelligibleApplication(String userId) { super(userId); enactor.addListener(this); explainer = enactor.getExplainer(); explainer.setDescriptionExplainer(new AutostatusDescriptiveExplainerDelegate()); presenter = new ConsoleStringPresenter(enactor); chatWindow = new ChatWindow(userId, this, generator); } @Override public void componentAdded(EnactorComponentInfo eci, Attributes paramAtts) {} @Override public void componentRemoved(EnactorComponentInfo eci, Attributes paramAtts) {} @Override public void parameterValueChanged(EnactorParameter parameter, Attributes validAtts, Object value) {} @Override public void serviceExecuted(EnactorComponentInfo eci, String serviceName, String functionName, Attributes input, DataObject returnDataObject) {} /** * Would be called when AutostatusEnactor has its EnactorReference triggered */ @Override public void componentEvaluated(EnactorComponentInfo eci) { outcome = enactor.getOutcomeValue(); outcome = outcome.equals("0") ? "within 1 min" : "after 1 min"; //outputPane.setText(""); // clear previous messages // responsiveness prediction chatWindow.writeMessage("imautostatus", "I am likely to respond to you " + outcome); } /** * Called when the Send button is pressed */ @Override public void actionPerformed(ActionEvent evt) { String message = chatWindow.getMessage(); chatWindow.writeMessage("Alice", message); // intelligibility query prompt if (message.startsWith("im-")) { String[] command = message.split(" "); String question = command[0].substring(3); String arguments = null; if (command.length > 1) { arguments = command[1]; } Query query = QueryParser.getQuery(question, arguments); if (query == null) { chatWindow.writeMessage("imautostatus", "Invalid command: " + message); } else if (query instanceof AltQuery && command.length != 2) { chatWindow.writeMessage("imautostatus", "Invalid number of arguments: " + (command.length - 1)); } else { Explanation explanation = explainer.getExplanation(query); System.out.println("explanation: " + explanation); chatWindow.writeMessage("imautostatus", presenter.render(explanation)); } } // just a normal message, so just provide responsiveness prediction else { chatWindow.writeMessage("imautostatus", "I am likely to respond to you " + outcome); } // reset input field chatWindow.clearInput(); } public static void main(String[] args) { Discoverer.start(); new AutostatusIntelligibleApplication("Bob"); } }