001 package nl.cwi.sen1.tide.adapters; 002 003 import java.io.IOException; 004 import java.util.ArrayList; 005 import java.util.HashMap; 006 import java.util.List; 007 import java.util.Map; 008 009 import aterm.ATerm; 010 import aterm.ATermFactory; 011 012 public class DebugAdapter implements DebugAdapterTif { 013 private Map<Integer, DebugAdapterProcess> processes; 014 private DebugAdapterBridge bridge; 015 private ATermFactory factory; 016 017 protected DebugAdapter(ATermFactory factory, String[] args, int port) 018 throws IOException { 019 bridge = new DebugAdapterBridge(factory, this); 020 this.factory = factory; 021 processes = new HashMap<Integer, DebugAdapterProcess>(); 022 023 bridge.init(args); 024 bridge.connect("debug-adapter", null, port); 025 } 026 027 public ATermFactory getFactory() { 028 return factory; 029 } 030 031 public void postEvent(ATerm event) { 032 bridge.postEvent(event); 033 } 034 035 protected void processCreated(DebugAdapterProcess process) { 036 processes.put(new Integer(process.getPid()), process); 037 List<Object> args = new ArrayList<Object>(); 038 args.add(new Integer(process.getPid())); 039 args.add(process.getProcessName()); 040 postEvent(factory.make("process-created(<int>,<str>)", args)); 041 } 042 043 public DebugAdapterProcess getProcess(int id) { 044 return processes.get(new Integer(id)); 045 } 046 047 public void event(int pid, DebugAdapterRule rule, ATerm value) { 048 List<Object> args = new ArrayList<Object>(); 049 args.add(new Integer(pid)); 050 args.add(new Integer(rule.getId())); 051 args.add(value); 052 053 postEvent(factory.make("event(<int>,<int>,<term>)", args)); 054 } 055 056 private void debugMsg(String msg) { 057 System.err.println(msg); 058 } 059 060 public ATerm createRule( 061 int pid, 062 ATerm port, 063 ATerm cond, 064 ATerm act, 065 ATerm tag, 066 ATerm enabled) { 067 068 DebugAdapterProcess proc = getProcess(pid); 069 DebugAdapterRule rule = 070 proc.createRule( 071 pid, 072 port, 073 cond, 074 act, 075 tag, 076 enabled.equals(factory.parse("true"))); 077 078 079 List<Integer> args = new ArrayList<Integer>(); 080 args.add(new Integer(rule.getId())); 081 082 return factory.make("snd-value(rule-created(<int>))", args); 083 } 084 085 public ATerm enableRule(int pid, int rid) { 086 DebugAdapterProcess proc = getProcess(pid); 087 proc.enableRule(rid); 088 return constValue("rule-enabled"); 089 } 090 091 private ATerm constValue(String value) { 092 return factory.parse("snd-value(" + value + ")"); 093 } 094 public ATerm disableRule(int pid, int rid) { 095 DebugAdapterProcess proc = getProcess(pid); 096 proc.disableRule(rid); 097 return constValue("rule-disabled"); 098 } 099 100 public ATerm modifyRule( 101 int pid, 102 int rid, 103 ATerm port, 104 ATerm cond, 105 ATerm act, 106 ATerm enabled) { 107 debugMsg("modify rule received..."); 108 DebugAdapterProcess proc = getProcess(pid); 109 proc.modifyRule( 110 rid, 111 port, 112 cond, 113 act, 114 enabled.equals(factory.parse("true"))); 115 return constValue("rule-modified"); 116 } 117 118 public ATerm deleteRule(int pid, int rid) { 119 DebugAdapterProcess proc = getProcess(pid); 120 proc.deleteRule(rid); 121 return constValue("rule-deleted"); 122 } 123 124 public ATerm evaluate(int pid, ATerm act) { 125 DebugAdapterProcess proc = getProcess(pid); 126 ATerm result = proc.evaluate(act); 127 List<ATerm> args = new ArrayList<ATerm>(); 128 args.add(result); 129 130 return factory.make("snd-value(evaluated(<term>))", args); 131 } 132 133 public void recTerminate(ATerm arg){} 134 135 public void recAckEvent(ATerm event){} 136 137 public void run() { 138 bridge.run(); 139 } 140 }