Fixing a bug: completing reachability graph with missing past traces.
[jpf-core.git] / src / examples / RobotManager.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19
20 import java.util.ArrayList;
21 import java.util.HashMap;
22 import java.util.List;
23 import java.util.Random;
24
25 /**
26  * a simplified version of the AWT RobotManager example
27  */
28 public class RobotManager {
29
30   static class Robot {
31     String id;
32     
33     Robot (String id){
34       this.id = id;
35     }
36     
37     String getId(){
38       return id;
39     }
40     
41     String processSequence(String sequence){
42       System.out.printf("robot %s processing sequence: %s\n", id, sequence);
43       return "Ok";
44     }
45   }
46   
47   class StatusAcquisitionThread extends Thread {
48     boolean done;
49
50     public StatusAcquisitionThread () {
51       setDaemon(true);
52     }
53
54     @Override
55         public void run () {
56       int n = robotList.size();
57       Random random = new Random(0);
58
59       while (!done) {
60         int idx = random.nextInt(n);
61         Robot robot = robotList.get(idx);
62         setRobotOnline(robot, !isRobotOnline(robot.id));
63
64         try {
65           Thread.sleep(3000);
66         } catch (InterruptedException ix) {
67         }
68       }
69     }
70
71     public void terminate () {
72       done = true;
73     }
74   }
75   
76   List<Robot> robotList = new ArrayList<Robot>();
77   HashMap<String,Robot> onlineRobots = new HashMap<String,Robot>();
78   StatusAcquisitionThread acquisitionThread;
79
80   public RobotManager() {
81     robotList.add( new Robot("RATS-1"));
82     robotList.add( new Robot("RATS-2"));    
83     robotList.add( new Robot("RCAT-1"));
84     robotList.add( new Robot("POGO-1"));
85     
86     for (Robot r : robotList) {
87       setRobotOnline(r, true);
88     }
89   }
90   
91   public void setRobotOnline (Robot robot, boolean isOnline) {
92     if (isOnline) {
93       onlineRobots.put(robot.getId(), robot);
94     } else {
95       onlineRobots.remove(robot.getId());
96     }
97   }
98   
99   public boolean isRobotOnline (String robotName) {
100     return onlineRobots.containsKey(robotName);
101   }
102   
103   public Robot getOnlineRobot (String robotName) {
104     return onlineRobots.get(robotName);
105   }
106   
107   public String sendSequence(Robot robot, String sequence) {    
108     return robot.processSequence(sequence); 
109   }
110   
111   void startStatusAcquisitionThread (){
112     acquisitionThread = new StatusAcquisitionThread();
113     acquisitionThread.start();
114   }
115   
116   void stopStatusAcquisitionThread(){
117     acquisitionThread.terminate();
118   }
119   
120   void processInput (){
121     String robotName = "POGO-1";
122     String sequence = "left; go";
123     
124     if (isRobotOnline(robotName)){
125       Robot robot = getOnlineRobot( robotName);
126       String result = robot.processSequence(sequence);
127       System.out.printf("sent sequence \"%s\" to robot %s => %s\n", sequence, robotName, result);
128     } else {
129       System.out.print("robot not online: ");
130       System.out.println(robotName);
131     }
132   }
133   
134   public static void main (String[] args){
135     RobotManager robotManager = new RobotManager();
136     robotManager.startStatusAcquisitionThread();
137     robotManager.processInput();
138     //robotManager.stopStatusAcquisitionThread();
139   }
140 }