001    package toolbus.tifs;
002    
003    import java.util.ArrayList;
004    import java.util.Iterator;
005    import java.util.List;
006    
007    import aterm.AFun;
008    import aterm.ATerm;
009    import aterm.ATermAppl;
010    
011    abstract public class Communication{
012            private final ATermAppl representation;
013            private final List<String> argumentList;
014            
015            public Communication(ATerm t){
016                    representation = (ATermAppl) t;
017                    
018                    argumentList = new ArrayList<String>();
019                    initArgumentList();
020            }
021            
022            protected ATermAppl getRepresentation(){
023                    return representation;
024            }
025            
026            public String getName(){
027                    ATermAppl resultTerm = (ATermAppl) representation.getArgument(0);
028                    return resultTerm.getAFun().getName();
029            }
030            
031            public String getResultType(){
032                    return "void";
033            }
034            
035            public Iterator<String> fetchArgumentIterator(){
036                    return argumentList.iterator();
037            }
038            
039            private void initArgumentList(){
040                    ATermAppl args = (ATermAppl) representation.getArgument(0);
041                    int arity = args.getArity();
042                    for(int i = 0; i < arity; i++){
043                            ATermAppl arg = (ATermAppl) args.getArgument(i);
044                            String typeName = arg.getAFun().getName();
045                            argumentList.add(typeName);
046                    }
047            }
048            
049            public static Communication create(ATermAppl appl){
050                    AFun fun = appl.getAFun();
051                    String name = fun.getName();
052                    
053                    // <yuck>
054                    if(name.equals("eval")){
055                            return new Eval(appl);
056                    }else if(name.equals("do")){
057                            return new Do(appl);
058                    }else if(name.equals("event")){
059                            return new Event(appl);
060                    }
061                    // </yuck>
062                    
063                    throw new RuntimeException("illegal communication construct: " + name);
064            }
065            
066    }