updated PresenceServiceImpl

git-svn-id: svn://anubis/gvsu@276 45c1a28c-8058-47b2-ae61-ca45b979098e
This commit is contained in:
josh 2008-11-29 16:53:20 +00:00
parent 38452f6f26
commit fe87ea7e8f
3 changed files with 309 additions and 100 deletions

View File

@ -10,10 +10,26 @@ import org.restlet.Router;
import org.restlet.data.Protocol; import org.restlet.data.Protocol;
import org.restlet.util.Variable; import org.restlet.util.Variable;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.config.Configuration;
public class ChatServer extends Application public class ChatServer extends Application
{ {
/**
* This is our persistant object database container.
*/
private ObjectContainer myContainer;
public ChatServer() public ChatServer()
{ {
/** Open and keep the db4o object container. */
Configuration config = Db4o.configure();
config.updateDepth(2);
String fileName = System.getProperty("user.home")
+ File.separator + "cs656-lab4-users.dbo";
System.out.println("Database file is: " + fileName);
myContainer = Db4o.openFile(fileName);
} }
/* Create application root node. /* Create application root node.
@ -25,7 +41,7 @@ public class ChatServer extends Application
Router router = new Router(getContext()); Router router = new Router(getContext());
// Add a route for user resources // Add a route for user resources
router.attach("/users", UserResource.class); router.attach("/users", UsersResource.class);
// Add a route for a user resource // Add a route for a user resource
router.attach("/users/{id}", UserResource.class); router.attach("/users/{id}", UserResource.class);
@ -33,12 +49,10 @@ public class ChatServer extends Application
return router; return router;
} }
/*
public ObjectContainer getContainer() public ObjectContainer getContainer()
{ {
return this.container; return myContainer;
} }
*/
/** /**
* @param args Passed in from the command line. * @param args Passed in from the command line.

View File

@ -1,5 +1,6 @@
import java.io.IOException; import java.io.IOException;
import java.util.*;
import org.restlet.Client; import org.restlet.Client;
import org.restlet.data.Form; import org.restlet.data.Form;
@ -15,11 +16,13 @@ public class PresenceServiceImpl implements PresenceService
{ {
private int myPort; private int myPort;
private String myHost; private String myHost;
private String myAppURI;
public PresenceServiceImpl(String host, int port) public PresenceServiceImpl(String host, int port)
{ {
myHost = host; myHost = host;
myPort = port; myPort = port;
myAppURI = "http://" + host + ":" + port + "/v1";
} }
/** /**
@ -28,6 +31,22 @@ public class PresenceServiceImpl implements PresenceService
*/ */
public void register(RegistrationInfo reg) throws Exception 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]", reg.getPort());
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());
} }
/** /**
@ -37,6 +56,13 @@ public class PresenceServiceImpl implements PresenceService
*/ */
public void unregister(String userName) throws Exception 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());
} }
/** /**
@ -47,6 +73,23 @@ public class PresenceServiceImpl implements PresenceService
*/ */
public RegistrationInfo lookup(String name) throws Exception public RegistrationInfo lookup(String name) throws Exception
{ {
try
{
String userResourceUri = myAppURI + "/users/" + name;
request = new Request(Method.GET, userResourceUri);
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; return null;
} }
@ -57,6 +100,24 @@ public class PresenceServiceImpl implements PresenceService
*/ */
public void setStatus(String userName, boolean status) throws Exception 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();
}
} }
/** /**
@ -66,6 +127,57 @@ public class PresenceServiceImpl implements PresenceService
*/ */
public RegistrationInfo[] listRegisteredUsers() throws Exception public RegistrationInfo[] listRegisteredUsers() throws Exception
{ {
return null; Vector<RegistrationInfo> users = new Vector<RegistrationInfo>();
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.getChildren();
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();
}
return users.toArray();
}
private RegistrationInfo nodeToRegInfo(Node n)
{
Registration ri = new RegistrationInfo();
NodeList nl = n.getChildNodes();
for (int i = 0; i < nl.getLength(); i++)
{
Node n = nl.item(i);
String name = n.getNodeName();
if (name.equals("name"))
ri.setUserName(name.getTextContent());
else if (name.equals("host"))
ri.setHost(name.getTextContent());
else if (name.equals("port"))
ri.setPort(Integer.parseInt(name.getTextContent()));
else if (name.equals("status"))
ri.setStatus(name.getTextContent().equals("available"));
}
return ri;
} }
} }

View File

@ -1,11 +1,12 @@
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// //
// Filename: UserResource.java // Filename: BookResource.java
// Description: // Description:
// //
// $Id:$ // $Id:$
// //
//---------------------------------------------------------------------- //----------------------------------------------------------------------
package edu.gvsu.cis.rest.example;
import java.io.IOException; import java.io.IOException;
@ -14,73 +15,97 @@ import org.restlet.data.Form;
import org.restlet.data.MediaType; import org.restlet.data.MediaType;
import org.restlet.data.Request; import org.restlet.data.Request;
import org.restlet.data.Response; import org.restlet.data.Response;
import org.restlet.resource.Resource;
import org.restlet.data.Status; import org.restlet.data.Status;
import org.restlet.resource.DomRepresentation; import org.restlet.resource.DomRepresentation;
import org.restlet.resource.Representation; import org.restlet.resource.Representation;
import org.restlet.resource.Variant; import org.restlet.resource.Variant;
public class UserResource extends Resource
{
public UserResource(Context context, Request request, Response response) /**
*
* Book Resource. This handles HTTP requests against a specific Book resource.
* e.g. URIs of the form /v1/books/{id}
*
* @author Jonathan Engelsma
*
*/
public class BookResource extends BaseResource {
private Book book;
/**
* Load up the book resource data that is being called on.
* @param context Context of the HTTP request.
* @param request The HTTP request.
* @param response The HTTP response that will be returned to the caller.
*/
public BookResource(Context context, Request request, Response response)
{ {
super(context, request, response); super(context, request, response);
System.out.println("In BookResource");
String id = (String) request.getAttributes().get("id"); String id = (String) request.getAttributes().get("id");
this.book = findBook(id);
if(this.book != null) {
getVariants().add(new Variant(MediaType.TEXT_XML)); getVariants().add(new Variant(MediaType.TEXT_XML));
} }
}
/** /**
* handle HTTP GET requests. * handle HTTP GET requests. Return an XML representation of the book resource.
*/ */
@Override @Override
public Representation getRepresentation(Variant variant) public Representation getRepresentation(Variant variant)
{ {
DomRepresentation rep = null; DomRepresentation rep=null;
if (variant.getMediaType().equals(MediaType.TEXT_XML)) if (variant.getMediaType().equals(MediaType.TEXT_XML)){
{ try {
try if (book!=null){
{ rep = book.getDomRepresentation();
}
else{
rep = new DomRepresentation(MediaType.TEXT_XML); rep = new DomRepresentation(MediaType.TEXT_XML);
getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND); getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND);
rep.getDocument().normalizeDocument(); //TODO: we need to return a 404 here.
//Error.embedErrorInResponse(rep.getDocument(),MediaType.TEXT_XML,Error.ErrorCode.RESOURCE_UNDEFINED);
} }
catch (IOException e) rep.getDocument().normalizeDocument();
{
} catch (IOException e){
e.printStackTrace(); e.printStackTrace();
} }
} }
return rep; return rep;
} }
@Override @Override
public boolean allowDelete() public boolean allowDelete() {
{
return true; return true;
} }
/**
* Handle an HTTP DELETE request. Delete the book resource.
*/
@Override @Override
public void delete() public void delete()
{ {
/* if (this.book != null) {
if (this.book != null)
{
getContainer().delete(this.book); getContainer().delete(this.book);
// TODO: need to delete the book reviews here as well.
getContainer().commit(); getContainer().commit();
getResponse().setStatus(Status.SUCCESS_OK); getResponse().setStatus(Status.SUCCESS_OK);
} else { } else {
getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND); getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND);
} }
*/
} }
/** /**
* PUT is implemented. * PUT is implemented.
*/ */
@Override @Override
public boolean allowPut() public boolean allowPut() {
{ // TODO Auto-generated method stub
return true; return true;
} }
@ -90,5 +115,63 @@ public class UserResource extends Resource
@Override @Override
public void put(Representation entity) public void put(Representation entity)
{ {
try {
if (entity.getMediaType().equals(MediaType.APPLICATION_WWW_FORM, true) && (this.book != null)) {
// Parse the entity as a web form
Form form = new Form(entity);
// update the loaded Book object
String value = form.getFirstValue("book[authors]");
if (value != null) {
book.setAuthors(value);
} }
value = form.getFirstValue("book[isbn]");
if(value != null) {
book.setIsbn(value);
}
value = form.getFirstValue("book[title]");
if(value != null) {
book.setTitle(value);
}
value = form.getFirstValue("book[publisher]");
if(value != null) {
book.setPublisher(value);
}
value = form.getFirstValue("book[year]");
if (value != null ) {
book.setYear(value);
}
// commit the changes.
getContainer().set(book);
getContainer().commit();
getResponse().setStatus(Status.SUCCESS_OK);
getResponse().setEntity(this.book.getDomRepresentation());
} else {
// Intentionnally hide the bookmark existence
getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND);
}
} catch (IOException e) {
getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
e.printStackTrace();
}
}
/**
* Returns the book instance.
* @return a reference to a Book instance.
*/
public Book getBook() {
return this.book;
}
} }