📄 otml.java
字号:
/*
#=========================================================================
# Copyright 2003 SRI International. All rights reserved.
#
# The material contained in this file is confidential and proprietary to SRI
# International and may not be reproduced, published, or disclosed to others
# without authorization from SRI International.
#
# DISCLAIMER OF WARRANTIES
#
# SRI International MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
# SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
# LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SRI International SHALL NOT BE
# LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES
#=========================================================================
Author : shardt
Date: Oct 14, 2003
*/
package com.sri.oaa2.agt.monitor;
import java.util.*;
import java.io.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import com.sri.oaa2.icl.*;
import antlr_oaa.*;
/** Utilities for manipulating OTML, the XML language used by the OaaTest tool.
*/
class OTML {
/** Interface to map from agtInfo.shortId to full agtInfo. */
interface AgentDatabase {
agtInfo findAgentById(String Id);
}
/** Return array of the names of all agents in the event log.
* @param iter iterator over raw event log, see saveLogAsOTML.
*/
public static String[] agentsInLog(Iterator iter,AgentDatabase agentDB) {
Set ret = new HashSet();
while (iter.hasNext()) {
try {
LogLine ll = parseLogLine((String)iter.next());
agtInfo info = agentDB.findAgentById(ll.shortId);
if (info != null && info.name != null) {
ret.add(info.name);
}
}
catch (ANTLRException e) {
}
}
return (String[])ret.toArray(new String[0]);
}
/** Take an iterator over the raw event log (evBrowser.evtLog) and create an OTML document.
*
* @throws Exception Kinda cheap to throw Exception instead of giving more detail, but the
* only way it is used is to print the error message.
* @param iter Iterator over Strings like "2: m_ev(send,addr(tcp(...),4),ev_something(...))"
* @param dest name of OTML file to write
* @param initAgentId numerical id of the initiating agent or null if no initiating agent.
* The same as agtInfo.shortId.
* @param agentDB provides mapping from agent id numbers in the event log to agtInfo
*/
public static void saveLogAsOTML(Iterator iter,File dest,String initAgentId,
AgentDatabase agentDB) throws Exception {
Document doc = log2Doc(iter,initAgentId,agentDB);
// Write XML document to file.
TransformerFactory f = TransformerFactory.newInstance();
Transformer t = f.newTransformer();
t.transform(new DOMSource(doc.getDocumentElement()),
new StreamResult(dest));
}
/** Convert iter to DOM document */
private static Document log2Doc(Iterator iter,String initAgentId,AgentDatabase agentDB)
throws ParserConfigurationException, DOMException {
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
DocumentBuilder b = f.newDocumentBuilder();
Document doc = b.newDocument();
Element testcase = doc.createElement("testcase");
doc.appendChild(testcase);
testcase.appendChild(doc.createTextNode("\n"));
int eventCount = 0;
try {
// This is a bit silly. frmEvBrowser converts the IclTerm to a formatted String and we
// just convert it back.
while (iter.hasNext()) {
LogLine ll = parseLogLine((String)iter.next());
agtInfo agentInfo = agentDB.findAgentById(ll.shortId); // may be null.
String agentName = (agentInfo == null ? null : agentInfo.name);
Element facElement;
if (ll.op.equals("send")) {
// Create a <fromFac to="agent_name">, or straight <fromFac>
facElement = doc.createElement("fromFac");
if (!ll.shortId.equals(initAgentId) &&
agentName != null) {
facElement.setAttribute("to",agentName);
}
ll.event = makeAbstract(ll.event,true);
}
else if (ll.op.equals("receive")) {
// Create a <send>
if (ll.shortId.equals(initAgentId)) {
facElement = doc.createElement("send");
ll.event = makeAbstract(ll.event,false);
}
// Create a <toFac from="agent_name">
else {
facElement = doc.createElement("toFac");
if (agentName != null) {
facElement.setAttribute("from",agentName);
}
ll.event = makeAbstract(ll.event,true);
}
}
else {
throw new RuntimeException("Error parsing event log");
}
facElement.appendChild(doc.createTextNode(ll.event.toString()));
testcase.appendChild(doc.createTextNode(" "));
testcase.appendChild(facElement);
testcase.appendChild(doc.createTextNode("\n"));
eventCount++;
} // while
}
catch (NoSuchElementException e) {
throw new RuntimeException("Error parsing event log",e);
}
catch (ANTLRException e) {
throw new RuntimeException("Error parsing event log");
}
catch (IndexOutOfBoundsException e) {
throw new RuntimeException("Error parsing event log",e);
}
return doc;
}
/** Make event use abstract oaa_* syntax instead of ev_*.
* Will return passed-in event if no changes.
* 1) ev_solve(Id,G,P) --> oaa_Solve(G,P)
* 2) {more to come}
*
* If genericVars is true, replace vars with '_' as approprite for a more
* generic match.
* 1) ev_solved(Id,Req,Slvrs,G,P,Solns) --> ev_solved(_,_,_,G,P,Solns)
* 2) {more to come}
*/
static IclTerm makeAbstract(IclTerm event,boolean genericVars) {
if (!(event instanceof IclStruct)) {
return event;
}
String functor = ((IclStruct)event).getFunctor();
if (functor.equals("ev_solve") && event.size() == 3) {
return new IclStruct("oaa_Solve",event.getTerm(1),event.getTerm(2));
}
if (genericVars) {
if (functor.equals("ev_solved") && event.size() == 6) {
return new IclStruct("ev_solved",new IclVar("_"),new IclVar("_"),new IclVar("_"),
event.getTerm(3),event.getTerm(4),event.getTerm(5));
}
}
return event;
}
static class LogLine {
String op; // send or receive
String shortId; // numerical agent id
IclTerm event; // inner event after removing m_ev wrapper
}
static LogLine parseLogLine(String line) throws ANTLRException {
StringTokenizer toks = new StringTokenizer(line,":",true);
toks.nextToken(); // Skip event number
toks.nextToken(); // Skip ':'
String eventStr = toks.nextToken(""); // Get rest of string
IclTerm event = IclTerm.fromString(eventStr);
LogLine ret = new LogLine();
ret.op = event.getTerm(0).toString();
ret.shortId = event.getTerm(1).getTerm(1).toString();
ret.event = event.getTerm(2);
return ret;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -