⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 otml.java

📁 SRI international 发布的OAA框架软件
💻 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 + -