Skip to content
Snippets Groups Projects
Commit 7da562b5 authored by Dustin Jenkins's avatar Dustin Jenkins
Browse files

Story 1734: Added GET with JSON.

parent 2cc6dc2f
No related branches found
No related tags found
No related merge requests found
...@@ -93,8 +93,8 @@ public class CreateUserAction extends UsersAction ...@@ -93,8 +93,8 @@ public class CreateUserAction extends UsersAction
UserPersistence userPersistence = getUserPersistence(); UserPersistence userPersistence = getUserPersistence();
UserRequest userRequest = UserRequestReader.read(this.inputStream); UserRequest userRequest = UserRequestReader.read(this.inputStream);
User<? extends Principal> newUser = userPersistence.addUser(userRequest); User<? extends Principal> newUser = userPersistence.addUser(userRequest);
this.response.setContentType("application/xml"); this.response.setContentType(acceptedContentType);
UserWriter.write(newUser, this.response.getOutputStream()); writeUser(newUser, this.response.getWriter());
logUserInfo(newUser.getUserID().getName()); logUserInfo(newUser.getUserID().getName());
return null; return null;
} }
......
...@@ -88,8 +88,8 @@ public class GetUserAction extends UsersAction ...@@ -88,8 +88,8 @@ public class GetUserAction extends UsersAction
{ {
UserPersistence userPersistence = getUserPersistence(); UserPersistence userPersistence = getUserPersistence();
User<? extends Principal> user = userPersistence.getUser(userID); User<? extends Principal> user = userPersistence.getUser(userID);
this.response.setContentType("application/xml"); this.response.setContentType(acceptedContentType);
UserWriter.write(user, this.response.getOutputStream()); writeUser(user, this.response.getWriter());
return null; return null;
} }
......
...@@ -69,6 +69,8 @@ ...@@ -69,6 +69,8 @@
package ca.nrc.cadc.ac.server.web.users; package ca.nrc.cadc.ac.server.web.users;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.security.AccessControlException; import java.security.AccessControlException;
import java.security.Principal; import java.security.Principal;
import java.security.PrivilegedActionException; import java.security.PrivilegedActionException;
...@@ -77,6 +79,7 @@ import java.security.PrivilegedExceptionAction; ...@@ -77,6 +79,7 @@ import java.security.PrivilegedExceptionAction;
import javax.security.auth.Subject; import javax.security.auth.Subject;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import ca.nrc.cadc.ac.User;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import ca.nrc.cadc.ac.UserNotFoundException; import ca.nrc.cadc.ac.UserNotFoundException;
...@@ -88,8 +91,12 @@ public abstract class UsersAction ...@@ -88,8 +91,12 @@ public abstract class UsersAction
implements PrivilegedExceptionAction<Object> implements PrivilegedExceptionAction<Object>
{ {
private static final Logger log = Logger.getLogger(UsersAction.class); private static final Logger log = Logger.getLogger(UsersAction.class);
static final String DEFAULT_CONTENT_TYPE = "text/xml";
static final String JSON_CONTENT_TYPE = "application/json";
protected UserLogInfo logInfo; protected UserLogInfo logInfo;
protected HttpServletResponse response; protected HttpServletResponse response;
protected String acceptedContentType = DEFAULT_CONTENT_TYPE;
UsersAction(UserLogInfo logInfo) UsersAction(UserLogInfo logInfo)
{ {
...@@ -204,4 +211,22 @@ public abstract class UsersAction ...@@ -204,4 +211,22 @@ public abstract class UsersAction
this.logInfo.userName = userName; this.logInfo.userName = userName;
} }
public void setAcceptedContentType(final String acceptedContentType)
{
this.acceptedContentType = acceptedContentType;
}
protected final <T extends Principal> void writeUser(final User<T> user,
final Writer writer)
throws IOException
{
if (acceptedContentType.equals(DEFAULT_CONTENT_TYPE))
{
ca.nrc.cadc.ac.xml.UserWriter.write(user, writer);
}
else if (acceptedContentType.equals(JSON_CONTENT_TYPE))
{
ca.nrc.cadc.ac.json.UserWriter.write(user, writer);
}
}
} }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
******************* CANADIAN ASTRONOMY DATA CENTRE ******************* ******************* CANADIAN ASTRONOMY DATA CENTRE *******************
************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES ************** ************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES **************
* *
* (c) 2014. (c) 2014. * (c) 2015. (c) 2015.
* Government of Canada Gouvernement du Canada * Government of Canada Gouvernement du Canada
* National Research Council Conseil national de recherches * National Research Council Conseil national de recherches
* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6 * Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6
...@@ -75,6 +75,7 @@ import javax.servlet.http.HttpServlet; ...@@ -75,6 +75,7 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import ca.nrc.cadc.util.StringUtil;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import ca.nrc.cadc.auth.AuthenticationUtil; import ca.nrc.cadc.auth.AuthenticationUtil;
...@@ -83,6 +84,7 @@ public class UsersServlet extends HttpServlet ...@@ -83,6 +84,7 @@ public class UsersServlet extends HttpServlet
{ {
private static final Logger log = Logger.getLogger(UsersServlet.class); private static final Logger log = Logger.getLogger(UsersServlet.class);
/** /**
* Create a UserAction and run the action safely. * Create a UserAction and run the action safely.
*/ */
...@@ -91,12 +93,14 @@ public class UsersServlet extends HttpServlet ...@@ -91,12 +93,14 @@ public class UsersServlet extends HttpServlet
{ {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
UserLogInfo logInfo = new UserLogInfo(request); UserLogInfo logInfo = new UserLogInfo(request);
try try
{ {
log.info(logInfo.start()); log.info(logInfo.start());
Subject subject = AuthenticationUtil.getSubject(request); Subject subject = AuthenticationUtil.getSubject(request);
logInfo.setSubject(subject); logInfo.setSubject(subject);
UsersAction action = UsersActionFactory.getUsersAction(request, logInfo); UsersAction action = UsersActionFactory.getUsersAction(request, logInfo);
action.setAcceptedContentType(getAcceptedContentType(request));
action.doAction(subject, response); action.doAction(subject, response);
} }
catch (IllegalArgumentException e) catch (IllegalArgumentException e)
...@@ -158,4 +162,23 @@ public class UsersServlet extends HttpServlet ...@@ -158,4 +162,23 @@ public class UsersServlet extends HttpServlet
doAction(request, response); doAction(request, response);
} }
/**
* Obtain the requested (Accept) content type.
*
* @param request The HTTP Request.
* @return String content type.
*/
String getAcceptedContentType(final HttpServletRequest request)
{
final String requestedContentType = request.getHeader("Accept");
if (!StringUtil.hasText(requestedContentType))
{
return UsersAction.DEFAULT_CONTENT_TYPE;
}
else
{
return requestedContentType;
}
}
} }
...@@ -110,6 +110,7 @@ public class GetUserIDsActionTest ...@@ -110,6 +110,7 @@ public class GetUserIDsActionTest
@Ignore @Ignore
public void testRun() throws Exception public void testRun() throws Exception
{ {
/*
try try
{ {
Collection<HttpPrincipal> userIDs = new ArrayList<HttpPrincipal>(); Collection<HttpPrincipal> userIDs = new ArrayList<HttpPrincipal>();
...@@ -159,6 +160,7 @@ public class GetUserIDsActionTest ...@@ -159,6 +160,7 @@ public class GetUserIDsActionTest
log.error(t.getMessage(), t); log.error(t.getMessage(), t);
fail("unexpected error: " + t.getMessage()); fail("unexpected error: " + t.getMessage());
} }
*/
} }
} }
...@@ -68,35 +68,90 @@ ...@@ -68,35 +68,90 @@
*/ */
package ca.nrc.cadc.ac.server.web.users; package ca.nrc.cadc.ac.server.web.users;
import ca.nrc.cadc.ac.User;
import ca.nrc.cadc.ac.UserNotFoundException; import ca.nrc.cadc.ac.UserNotFoundException;
import ca.nrc.cadc.auth.HttpPrincipal;
import ca.nrc.cadc.net.TransientException; import ca.nrc.cadc.net.TransientException;
import ca.nrc.cadc.util.Log4jInit; import ca.nrc.cadc.util.Log4jInit;
import java.io.PrintWriter; import java.io.*;
import java.io.StringWriter;
import java.security.AccessControlException; import java.security.AccessControlException;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Level; import org.apache.log4j.Level;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.easymock.EasyMock; import org.easymock.EasyMock;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.*; import static org.junit.Assert.*;
/** /**
*
* @author jburke * @author jburke
*/ */
public class UsersActionTest public class UsersActionTest
{ {
private final static Logger log = Logger.getLogger(UsersActionTest.class); private final static Logger log = Logger.getLogger(UsersActionTest.class);
@BeforeClass @BeforeClass
public static void setUpClass() public static void setUpClass()
{ {
Log4jInit.setLevel("ca.nrc.cadc.ac", Level.INFO); Log4jInit.setLevel("ca.nrc.cadc.ac", Level.INFO);
} }
@Test
public void writeUserXML() throws Exception
{
final UsersAction usersAction = new UsersAction(null)
{
@Override
public Object run() throws Exception
{
// Do nothing.
return null;
}
};
final User<HttpPrincipal> user =
new User<HttpPrincipal>(new HttpPrincipal("CADCtest"));
final Writer writer = new StringWriter();
usersAction.writeUser(user, writer);
assertEquals("Wrong XML output.",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
"<user>\r\n" +
" <userID>\r\n" +
" <identity type=\"HTTP\">CADCtest</identity>\r\n" +
" </userID>\r\n" +
"</user>\r\n", writer.toString());
}
@Test
public void writeUserJSON() throws Exception
{
final UsersAction usersAction = new UsersAction(null)
{
@Override
public Object run() throws Exception
{
// Do nothing.
return null;
}
};
final User<HttpPrincipal> user =
new User<HttpPrincipal>(new HttpPrincipal("CADCtest"));
final Writer writer = new StringWriter();
usersAction.setAcceptedContentType(UsersAction.JSON_CONTENT_TYPE);
usersAction.writeUser(user, writer);
assertEquals("Wrong JSON output.",
"{\"user\":{\"userID\":{\"identity\":{\"name\":\"CADCtest\",\"type\":\"HTTP\"}}}}",
writer.toString());
}
@Test @Test
public void testDoActionAccessControlException() throws Exception public void testDoActionAccessControlException() throws Exception
{ {
...@@ -105,7 +160,7 @@ public class UsersActionTest ...@@ -105,7 +160,7 @@ public class UsersActionTest
Exception e = new AccessControlException(""); Exception e = new AccessControlException("");
testDoAction(message, responseCode, e); testDoAction(message, responseCode, e);
} }
@Test @Test
public void testDoActionIllegalArgumentException() throws Exception public void testDoActionIllegalArgumentException() throws Exception
{ {
...@@ -123,7 +178,7 @@ public class UsersActionTest ...@@ -123,7 +178,7 @@ public class UsersActionTest
Exception e = new UserNotFoundException("foo"); Exception e = new UserNotFoundException("foo");
testDoAction(message, responseCode, e); testDoAction(message, responseCode, e);
} }
@Test @Test
public void testDoActionUnsupportedOperationException() throws Exception public void testDoActionUnsupportedOperationException() throws Exception
{ {
...@@ -132,17 +187,19 @@ public class UsersActionTest ...@@ -132,17 +187,19 @@ public class UsersActionTest
Exception e = new UnsupportedOperationException(); Exception e = new UnsupportedOperationException();
testDoAction(message, responseCode, e); testDoAction(message, responseCode, e);
} }
@Test @Test
public void testDoActionTransientException() throws Exception public void testDoActionTransientException() throws Exception
{ {
try try
{ {
HttpServletResponse response = EasyMock.createMock(HttpServletResponse.class); HttpServletResponse response = EasyMock
.createMock(HttpServletResponse.class);
EasyMock.expect(response.isCommitted()).andReturn(Boolean.FALSE); EasyMock.expect(response.isCommitted()).andReturn(Boolean.FALSE);
response.setContentType("text/plain"); response.setContentType("text/plain");
EasyMock.expectLastCall().once(); EasyMock.expectLastCall().once();
EasyMock.expect(response.getWriter()).andReturn(new PrintWriter(new StringWriter())); EasyMock.expect(response.getWriter())
.andReturn(new PrintWriter(new StringWriter()));
EasyMock.expectLastCall().once(); EasyMock.expectLastCall().once();
response.setStatus(503); response.setStatus(503);
EasyMock.expectLastCall().once(); EasyMock.expectLastCall().once();
...@@ -165,17 +222,19 @@ public class UsersActionTest ...@@ -165,17 +222,19 @@ public class UsersActionTest
fail("unexpected error: " + t.getMessage()); fail("unexpected error: " + t.getMessage());
} }
} }
private void testDoAction(String message, int responseCode, Exception e) private void testDoAction(String message, int responseCode, Exception e)
throws Exception throws Exception
{ {
try try
{ {
HttpServletResponse response = EasyMock.createMock(HttpServletResponse.class); HttpServletResponse response = EasyMock
.createMock(HttpServletResponse.class);
EasyMock.expect(response.isCommitted()).andReturn(Boolean.FALSE); EasyMock.expect(response.isCommitted()).andReturn(Boolean.FALSE);
response.setContentType("text/plain"); response.setContentType("text/plain");
EasyMock.expectLastCall().once(); EasyMock.expectLastCall().once();
EasyMock.expect(response.getWriter()).andReturn(new PrintWriter(new StringWriter())); EasyMock.expect(response.getWriter())
.andReturn(new PrintWriter(new StringWriter()));
EasyMock.expectLastCall().once(); EasyMock.expectLastCall().once();
response.setStatus(responseCode); response.setStatus(responseCode);
EasyMock.expectLastCall().once(); EasyMock.expectLastCall().once();
...@@ -200,7 +259,7 @@ public class UsersActionTest ...@@ -200,7 +259,7 @@ public class UsersActionTest
public class UsersActionImpl extends UsersAction public class UsersActionImpl extends UsersAction
{ {
Exception exception; Exception exception;
public UsersActionImpl(UserLogInfo logInfo) public UsersActionImpl(UserLogInfo logInfo)
{ {
super(logInfo); super(logInfo);
...@@ -216,5 +275,5 @@ public class UsersActionTest ...@@ -216,5 +275,5 @@ public class UsersActionTest
this.exception = e; this.exception = e;
} }
} }
} }
package ca.nrc.cadc.ac.server.web.users;
import javax.servlet.http.HttpServletRequest;
import org.junit.Test;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
public class UsersServletTest
{
@Test
public void getAcceptedContentTypeJSON() throws Exception
{
final HttpServletRequest mockRequest =
createMock(HttpServletRequest.class);
final UsersServlet testSubject = new UsersServlet();
expect(mockRequest.getHeader("Accept")).
andReturn("application/json").once();
replay(mockRequest);
assertEquals("Wrong content type.", "application/json",
testSubject.getAcceptedContentType(mockRequest));
verify(mockRequest);
}
@Test
public void getAcceptedContentTypeDefault() throws Exception
{
final HttpServletRequest mockRequest =
createMock(HttpServletRequest.class);
final UsersServlet testSubject = new UsersServlet();
expect(mockRequest.getHeader("Accept")).andReturn(null).once();
replay(mockRequest);
assertEquals("Wrong content type.", "text/xml",
testSubject.getAcceptedContentType(mockRequest));
verify(mockRequest);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment