import java.io.IOException; import java.util.*; import org.restlet.Client; import org.restlet.data.Form; import org.restlet.data.Method; import org.restlet.data.Protocol; import org.restlet.data.Request; import org.restlet.data.Response; import org.restlet.resource.*; import org.w3c.dom.*; import edu.gvsu.cis.cs656.lab4.server.PresenceService; import edu.gvsu.cis.cs656.lab4.server.RegistrationInfo; public class PresenceServiceImpl implements PresenceService { private int myPort; private String myHost; private String myAppURI; public PresenceServiceImpl(String host, int port) { myHost = host; myPort = port; myAppURI = "http://" + host + ":" + port + "/v1"; } /** * Register a client with the presence service. * @param reg The information that is to be registered about a client. */ public void register(RegistrationInfo reg) throws Exception { Form form = new Form(); form.add("user[name]", reg.getUserName()); form.add("user[host]", reg.getHost()); form.add("user[port]", (new Integer(reg.getPort())).toString()); form.add("user[status]", reg.getStatus() ? "available" : "away"); // construct request to create a new user resource String usersResouceUri = myAppURI + "/users"; Request request = new Request(Method.POST, usersResouceUri); request.setEntity(form.getWebRepresentation()); // Invoke the client HTTP connector Response resp = new Client(Protocol.HTTP).handle(request); if ( ! resp.getStatus().isSuccess() ) System.out.println(resp.getStatus()); } /** * Unregister a client from the presence service. Client must call this * method when it terminates execution. * @param userName The name of the user to be unregistered. */ public void unregister(String userName) throws Exception { String userResourceUri = myAppURI + "/users/" + userName; Request request = new Request(Method.DELETE, userResourceUri); // Invoke the client HTTP connector Response resp = new Client(Protocol.HTTP).handle(request); if ( ! resp.getStatus().isSuccess() ) System.err.println(resp.getStatus()); } /** * Lookup the registration information of another client. * @param name The name of the client that is to be located. * @return The RegistrationInfo info for the client, or null if * no such client was found. */ public RegistrationInfo lookup(String name) throws Exception { try { String userResourceUri = myAppURI + "/users/" + name; Request request = new Request(Method.GET, userResourceUri); Response resp = new Client(Protocol.HTTP).handle(request); if ( ! resp.getStatus().isSuccess() ) System.out.println(resp.getStatus()); DomRepresentation d = resp.getEntityAsDom(); Node n = d.getFirstChild(); if (n == null) return null; return nodeToRegInfo(n); } catch (Exception ioex) { ioex.printStackTrace(); } return null; } /** * Sets the user's presence status. * @param name The name of the user whose status is to be set. * @param status true if user is available, false otherwise. */ public void setStatus(String userName, boolean status) throws Exception { Form form = new Form(); form.add("user[status]", status ? "available" : "away"); String userResourceUri = myAppURI + "/users/" + userName; Request request = new Request(Method.PUT, userResourceUri); request.setEntity(form.getWebRepresentation()); try { // Invoke the client HTTP connector Response resp = new Client(Protocol.HTTP).handle(request); if ( ! resp.getStatus().isSuccess() ) System.err.println(resp.getStatus()); } catch (IOException e) { e.printStackTrace(); } } /** * Determine all users who are currently registered in the system. * @return An array of RegistrationInfo objects - one for each client * present in the system. */ public RegistrationInfo[] listRegisteredUsers() throws Exception { Vector users = new Vector(); try { String usersResourceUri = myAppURI + "/users"; Request request = new Request(Method.GET, usersResourceUri); // Invoke the client HTTP connector Response resp = new Client(Protocol.HTTP).handle(request); if ( ! resp.getStatus().isSuccess() ) System.err.println(resp.getStatus()); DomRepresentation dom = resp.getEntityAsDom(); System.out.println("DEBUG: DOM received:\n" + dom.getText()); Document d = dom.getDocument(); Node root = d.getFirstChild(); NodeList nl = root.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node n = nl.item(i); if (n.getNodeName().equals("user")) { RegistrationInfo ri = nodeToRegInfo(n); users.add(ri); } } } catch (Exception ioex) { ioex.printStackTrace(); } RegistrationInfo[] dum = null; return users.toArray(dum); } private RegistrationInfo nodeToRegInfo(Node n) { RegistrationInfo ri = new RegistrationInfo(); NodeList nl = n.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node child = nl.item(i); String name = child.getNodeName(); if (name.equals("name")) ri.setUserName(child.getTextContent()); else if (name.equals("host")) ri.setHost(child.getTextContent()); else if (name.equals("port")) ri.setPort(Integer.parseInt(child.getTextContent())); else if (name.equals("status")) ri.setStatus(child.getTextContent().equals("available")); } return ri; } }