ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/experimental/agents/AgentStation.java
(Generate patch)

Comparing experimental/agents/AgentStation.java (file contents):
Revision 1.1 by ajm, Mon Apr 23 19:45:18 2001 UTC vs.
Revision 1.2 by ajm, Fri May 4 02:04:35 2001 UTC

# Line 1 | Line 1
1 < import java.io.*;
2 < import java.net.*;
3 < import java.rmi.RMISecurityManager;
4 < import java.util.*;
1 > //---PACKAGE DECLARATION---
2  
3 + //---IMPORTS---
4 + import java.net.Socket;
5 + import java.io.IOException;
6 + import java.util.ArrayList;
7 +
8 + /**
9 + * An implementation of an agent station
10 + *
11 + * @author  $Author$
12 + * @version $Id$
13 + */
14   class AgentStation extends Station {
15 +
16 + //---FINAL / FINAL STATIC ATTRIBUTES---
17 +
18 +    /**
19 +     * The current CVS revision of this class
20 +     */
21 +    public static final String REVISION = "$Revision$";
22      
23 <    public static final String REVISION = "v0.0.1";
9 <    public static final int LISTEN_PORT = 32497;
23 >    public static final int DIRECT_LISTEN_PORT = 32497;
24      
25 <    public static void main(String[] args) throws IOException, UnknownHostException, ClassNotFoundException {
12 <        System.out.println("- Agent Station " + REVISION + "-");
13 <        System.out.println("Boot sequence start.");
14 <        //System.getProperties().setProperty("java.security.policy", "/home/cut/ajm4/java/java.policy");
15 <        //if (System.getSecurityManager() == null) {
16 <        //    System.out.println("Setting security manager...");
17 <        //    System.setSecurityManager(new RMISecurityManager());
18 <        //}
19 <        AgentStation station = new AgentStation();
20 <        
21 <        station.startListening();
22 <                        
23 <        System.out.println("Boot sequence end.");
24 <    }
25 >    public static final int PEER_LISTEN_PORT = 32498;
26      
27 <    public void startListening() throws IOException, UnknownHostException, ClassNotFoundException {
28 <        ServerSocket listener = new ServerSocket(LISTEN_PORT);
29 <        while (_listening) {
30 <            System.out.println("Listening...");
31 <            Socket conn = listener.accept();
32 <            System.out.println("Got connection...");
33 <            ObjectInputStream p = new ObjectInputStream(conn.getInputStream());
34 <            System.out.println("Got hook to stream...");
35 <            Agent agent = (Agent)p.readObject();
36 <            _agentList.add(agent);
36 <            System.out.println("Got agent...");
37 <            System.out.println("Closing connection...");
38 <                conn.close();
39 <                System.out.println("Telling agent that its journey is complete...");
40 <                agent.onArrival(this);
41 <                System.out.println("New agent name - " + agent.getName());
42 <                System.out.println(agent.getName() + "'s transmission count - " + agent.getTransmissionCount());
43 <                System.out.println("Attempting to run locally...");
44 <                Thread thread = new Thread(agent);
45 <                thread.start();
46 <                System.out.println("Done.");
27 > //---STATIC METHODS---
28 >  
29 >    /**
30 >     * Returns a reference to the singleton agent station in use
31 >     *
32 >     * @throws RuntimeException if not yet initialised
33 >     */
34 >    public static AgentStation getInstance() throws RuntimeException {
35 >        if (_instance == null) {
36 >            throw new RuntimeException("Cannot obtain instance to uninitialised AgentStation!");
37          }
38 +        return _instance;
39      }
40 +
41 +    /**
42 +     * Constructs and returns the singleton AgentStation class
43 +     *
44 +     * @throws RuntimeException if already initialised
45 +     */
46 +    public static AgentStation initialise(String name, String descriptiveName, String initialPeerHostname, int initialPeerPort) {
47 +        if (_instance != null) {
48 +            throw new RuntimeException("Already initialised!");
49 +        }
50 +        _instance = new AgentStation(name, descriptiveName, initialPeerHostname, initialPeerPort);
51 +        return _instance;
52 +    }
53      
54 + //---CONSTRUCTORS---
55 +
56 +    /**
57 +     * Starts up the agent station.
58 +     * This is a private method to ensure singleton pattern.
59 +     */
60 +    private AgentStation(String name, String descriptiveName, String initialPeerHostname, int initialPeerPort) {
61 +        _name = name;
62 +        _descriptiveName = descriptiveName;
63 +        
64 +        DirectAgentHandlerFactory directAgentHandlerFactory = new DirectAgentHandlerFactory();
65 +        PeerHandlerFactory peerHandlerFactory = new PeerHandlerFactory();
66 +        
67 +        Listener directAgentListener = new Listener(DIRECT_LISTEN_PORT, directAgentHandlerFactory);
68 +        Listener peerListener = new Listener(PEER_LISTEN_PORT, peerHandlerFactory);
69 +        
70 +        directAgentListener.start();
71 +        peerListener.start();
72 +        
73 +        // TESTING ONLY - Have one peer connection
74 +        if (initialPeerHostname != null) {
75 +            try {
76 +                _logger.write(toString(), Logger.DEBUG, "Establishing peer connection with - " + initialPeerHostname + ":" + initialPeerPort);
77 +                Socket socket = new Socket(initialPeerHostname, initialPeerPort);
78 +        
79 +                PeerHandler peerHandler = new PeerHandler(socket);
80 +                addPeer(peerHandler);
81 +            } catch (IOException e) {
82 +                _logger.write(toString(), Logger.ERROR, "I/O ERROR - " + e);
83 +            }
84 +        }    
85 +        _logger.write(toString(), Logger.SYSINIT, "created");
86 +    }
87 +
88 + //---PUBLIC METHODS---
89 +
90 +    //*** STATION SERVICES TO AGENTS ***
91 +    
92      public ArrayList getAllAgents() {
93          return _agentList;
94      }
95      
96 +    public ArrayList getAllPeers() {
97 +        return _peerList;
98 +    }
99 +    
100      public String getName() {
101 <        return _name;
101 >        return _name + " - " + _descriptiveName;
102      }
103      
104 <    private String _name = "Listening Post Alpha76";
105 <    private boolean _listening = true;
104 >    public void sendAgent(Agent agent, PeerHandler peerHandler) {
105 >        // NOTE - no support for restarting agent on a failed send.
106 >        agent.shutdown();
107 >        ((PeerHandler) _peerList.get(_peerList.indexOf(peerHandler))).sendAgent(agent);
108 >    }
109 >    
110 >    //*** OTHER PUBLIC METHODS ***
111 >
112 >    public void addAgent(Agent agent) {
113 >        _logger.write(toString(), Logger.DEBUG, "registered agent");
114 >        _agentList.add(agent);
115 >    }
116 >    
117 >    public void removeAgent(Agent agent) {
118 >        _agentList.remove(_agentList.indexOf(agent));
119 >        _logger.write(toString(), Logger.DEBUG, "deregistered agent");
120 >    }
121 >    
122 >    public void addPeer(PeerHandler peerHandler) {
123 >        _logger.write(toString(), Logger.DEBUG, "registered peer");
124 >        _peerList.add(peerHandler);
125 >    }
126 >    
127 >    public void removePeer(PeerHandler peerHandler) {
128 >        _peerList.remove(peerHandler);
129 >        _logger.write(toString(), Logger.DEBUG, "deregistered peer");
130 >    }
131 >
132 >    /**
133 >     * Overrides the {@link java.lang.Object#toString() Object.toString()}
134 >     * method to provide clean logging (every class should have this).
135 >     *
136 >     * This uses the uk.ac.ukc.iscream.util.FormatName class
137 >     * to format the toString()
138 >     *
139 >     * @return the name of this class and its CVS revision
140 >     */
141 >    public String toString() {
142 >        return FormatName.getName(
143 >            _name,
144 >            getClass().getName(),
145 >            REVISION);
146 >    }
147 >
148 > //---PRIVATE/PROTECTED METHODS---
149 >
150 > //---ACCESSOR/MUTATOR METHODS---
151 >
152 > //---ATTRIBUTES---
153 >
154 >    /**
155 >     * This is the friendly identifier of the
156 >     * component this class is running in.
157 >     * eg, a Filter may be called "filter1",
158 >     * If this class does not have an owning
159 >     * component,  a name from the configuration
160 >     * can be placed here.  This name could also
161 >     * be changed to null for utility classes.
162 >     */
163 >    private String _name;
164 >
165 >    /**
166 >     * This holds a reference to the
167 >     * system logger that is being used.
168 >     */
169 >    private Logger _logger = Logger.getInstance();
170 >    
171 >    private String _descriptiveName;
172 >    
173      private ArrayList _agentList = new ArrayList();
174 +    
175 +    private ArrayList _peerList = new ArrayList();
176 +
177 + //---STATIC ATTRIBUTES---
178 +
179 +    /**
180 +     * Holds the reference to the singleton instance of his class
181 +     */
182 +    private static AgentStation _instance;
183 +    
184 +
185   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines