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    }