import java.util.*; simple component Server { Map users = new HashMap(); Map userToPort = new HashMap(); Map channels = new HashMap(); dynamic port P { provided { void login(String login, String password); void logout(); List getPeers(); void openChannel(String nickName); void sendMessage(String message); void close(); } required { void loginOk(); void loginNotOk(); void openOk(); void openNotOk(); void receiveMessage(String message); void openChannel(); void closedByPeer(); } protocol q1; q1 -> q2 { trigger login; } q2 -> q1 { effect ^out.loginNotOk(); } q2 -> q3 { effect ^out.loginOk(); } q3 -> q1 { trigger logout;} q3 -> q4 { trigger openChannel; } q3 -> q3 { trigger getPeers; } q4 -> q3 { effect ^out.openNotOk(); } q4 -> q5 { effect ^out.openOk(); } q3 -> q5 { trigger wait; effect ^out.openChannel(); } q5 -> q3 { trigger close; } q5 -> q5 { trigger sendMessage; } q5 -> q5 { trigger wait; effect ^out.receiveMessage(); } q5 -> q3 { trigger wait; effect ^out.closedByPeer(); } } } !> } constructor Server() { users.put("Franz", ""); users.put("Sepp", ""); users.put("Nandl", ""); users.put("Resi", ""); } void login(P q, String login, String pw) implements P.login(String, String) { String s = (String)users.get(login); try { if(s != null && s.equals(pw)) { userToPort.put(q, login); q.loginOk(); } else q.loginNotOk(); } catch(Exception e) { e.printStackTrace(); } } void logout(P q) implements P.logout() { userToPort.remove(q); } List getPeers() implements P.getPeers() { List result = new Vector(); for(Iterator it = userToPort.keySet().iterator(); it.hasNext(); result.add(userToPort.get(it.next()))); return result; } void sendMessage(P q, String message) implements P.sendMessage(String) { Iterator it = channels.keySet().iterator(); while (it.hasNext()) { P port1 = (P)it.next(); P port2 = (P)channels.get(port1); if (port1 != null) { if (port1.equals(q)) port2.receiveMessage(message); else if (port2.equals(q)) port1.receiveMessage(message); } } } void openChannel(P q, String login) implements P.openChannel(String) { System.out.println(q + " " + login); try { P p = findPortToUser(login); if(p == null) { q.openNotOk(); } else if (channels.get(p) != null) { q.openNotOk(); } else if (p.equals(q)) q.openNotOk(); else { channels.put(q, p); p.openChannel(); q.openOk(); } } catch(Exception e) { e.printStackTrace(); } } void close(P q) implements P.close() { Iterator it = channels.keySet().iterator(); do { if(!it.hasNext()) break; P next = (P)it.next(); P p = (P)channels.get(next); if(next.equals(q)) { channels.remove(next); p.closedByPeer(); } else if(p.equals(q)) { channels.remove(next); next.closedByPeer(); } } while(true); } private P findPortToUser(String user) { P result = null; Iterator it = userToPort.keySet().iterator(); do { if(!it.hasNext()) break; P next = (P)it.next(); String nick = (String)userToPort.get(next); if(nick.equals(user)) result = next; } while(true); return result; } }