Commit 72877d86 authored by Brian Major's avatar Brian Major
Browse files

s1711 - Removed CSV data transfer - it was causing AJP/output stream mixing

parent d14b38a6
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -68,17 +68,15 @@
 */
package ca.nrc.cadc.ac.server.web;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import ca.nrc.cadc.ac.Group;
import ca.nrc.cadc.ac.GroupReader;
import ca.nrc.cadc.ac.GroupWriter;
import ca.nrc.cadc.ac.User;
import ca.nrc.cadc.ac.server.GroupPersistence;
import java.io.InputStream;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;

public class CreateGroupAction extends GroupsAction
{
@@ -96,8 +94,8 @@ public class CreateGroupAction extends GroupsAction
        GroupPersistence groupPersistence = getGroupPersistence();
        Group group = GroupReader.read(this.inputStream);
        Group newGroup = groupPersistence.addGroup(group);
        setContentType("application/xml");
        GroupWriter.write(newGroup, getOutputStream());
        this.response.setContentType("application/xml");
        GroupWriter.write(newGroup, this.response.getOutputStream());

        List<String> addedMembers = null;
        if ((newGroup.getUserMembers().size() > 0) || (newGroup.getGroupMembers().size() > 0))
+2 −3
Original line number Diff line number Diff line
@@ -70,7 +70,6 @@
import ca.nrc.cadc.ac.Group;
import ca.nrc.cadc.ac.GroupWriter;
import ca.nrc.cadc.ac.server.GroupPersistence;
import javax.servlet.http.HttpServletResponse;

public class GetGroupAction extends GroupsAction
{
@@ -87,8 +86,8 @@ public class GetGroupAction extends GroupsAction
    {
        GroupPersistence groupPersistence = getGroupPersistence();
        Group group = groupPersistence.getGroup(this.groupName);
        setContentType("application/xml");
        GroupWriter.write(group, getOutputStream());
        this.response.setContentType("application/xml");
        GroupWriter.write(group, this.response.getOutputStream());
        return null;
    }

+19 −13
Original line number Diff line number Diff line
@@ -65,21 +65,22 @@
 *  $Revision: 4 $
 *
 ************************************************************************
 */package ca.nrc.cadc.ac.server.web;
 */

package ca.nrc.cadc.ac.server.web;

import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Collection;

import ca.nrc.cadc.ac.server.GroupPersistence;

import com.csvreader.CsvWriter;
import org.apache.log4j.Logger;

import javax.servlet.http.HttpServletResponse;
import ca.nrc.cadc.ac.server.GroupPersistence;

public class GetGroupNamesAction extends GroupsAction
{
    
    private static final Logger log = Logger.getLogger(GetGroupNamesAction.class);

    GetGroupNamesAction(GroupLogInfo logInfo)
    {
        super(logInfo);
@@ -90,16 +91,21 @@ public class GetGroupNamesAction extends GroupsAction
    {
        GroupPersistence groupPersistence = getGroupPersistence();
        Collection<String> groups = groupPersistence.getGroupNames();
        setContentType("text/csv");

        final Writer writer = new OutputStreamWriter(getOutputStream());
        final CsvWriter csvWriter = new CsvWriter(writer, ',');

        log.debug("Found " + groups.size() + " group names");
        response.setContentType("text/plain");
        log.debug("Set content-type to text/plain");
        Writer writer = response.getWriter();
        boolean start = true;
        for (final String group : groups)
        {
            csvWriter.write(group);
            if (!start)
            {
                writer.write("\r\n");
            }
        csvWriter.endRecord();
            writer.write(group);
            start = false;
        }
        
        return null;
    }
}
+40 −81
Original line number Diff line number Diff line
@@ -69,7 +69,6 @@
package ca.nrc.cadc.ac.server.web;

import java.io.IOException;
import java.io.OutputStream;
import java.security.AccessControlException;
import java.security.Principal;
import java.security.PrivilegedActionException;
@@ -90,108 +89,99 @@ import ca.nrc.cadc.ac.server.GroupPersistence;
import ca.nrc.cadc.ac.server.PluginFactory;
import ca.nrc.cadc.ac.server.UserPersistence;
import ca.nrc.cadc.net.TransientException;
import ca.nrc.cadc.uws.server.SyncOutput;


public abstract class GroupsAction
    implements PrivilegedExceptionAction<Object>
{
    private static final Logger log = Logger.getLogger(GroupsAction.class);
    protected GroupLogInfo logInfo;
    private SyncOutput syncOutput;
    protected HttpServletResponse response;

    GroupsAction(GroupLogInfo logInfo)
    {
        this.logInfo = logInfo;
    }

    public void doAction(Subject subject, final HttpServletResponse response)
    public void doAction(Subject subject, HttpServletResponse response)
        throws IOException
    {
        syncOutput = new SyncOutput()
        try
        {
            @Override
            public void setResponseCode(int code)
            try
            {
                response.setStatus(code);
            }
                this.response = response;

            @Override
            public void setHeader(String key, String value)
                if (subject == null)
                {
                response.setHeader(key, value);
                    run();
                }

            @Override
            public OutputStream getOutputStream() throws IOException
                else
                {
                return response.getOutputStream();
                    Subject.doAs(subject, this);
                }
        };

        try
            }
            catch (PrivilegedActionException e)
            {
            if (subject == null)
                Throwable cause = e.getCause();
                if (cause != null)
                {
                run();
                    throw cause;
                }
            else
            {
                runPrivileged(subject);
                throw e;
            }
        }
        catch (AccessControlException e)
        {
            log.debug("Permission denied", e);
            log.debug(e);
            String message = "Permission Denied";
            this.logInfo.setMessage(message);
            sendError(403, message);
        }
        catch (IllegalArgumentException e)
        {
            log.debug("Illegal argument", e);
            log.debug(e);
            String message = e.getMessage();
            this.logInfo.setMessage(message);
            sendError(400, message);
        }
        catch (MemberNotFoundException e)
        {
            log.debug("Member Not Found", e);
            log.debug(e);
            String message = "Member not found: " + e.getMessage();
            this.logInfo.setMessage(message);
            sendError(404, message);
        }
        catch (GroupNotFoundException e)
        {
            log.debug("Group not found", e);
            log.debug(e);
            String message = "Group not found: " + e.getMessage();
            this.logInfo.setMessage(message);
            sendError(404, message);
        }
        catch (UserNotFoundException e)
        {
            log.debug("User Not Found", e);
            log.debug(e);
            String message = "User not found: " + e.getMessage();
            this.logInfo.setMessage(message);
            sendError(404, message);
        }
        catch (MemberAlreadyExistsException e)
        {
            log.debug("Member Already Exists", e);
            log.debug(e);
            String message = "Member already exists: " + e.getMessage();
            this.logInfo.setMessage(message);
            sendError(409, message);
        }
        catch (GroupAlreadyExistsException e)
        {
            log.debug("Group Already Exists", e);
            log.debug(e);
            String message = "Group already exists: " + e.getMessage();
            this.logInfo.setMessage(message);
            sendError(409, message);
        }
        catch (UnsupportedOperationException e)
        {
            log.debug("Unsupported Operation", e);
            log.debug(e);
            this.logInfo.setMessage("Not yet implemented.");
            sendError(501);
        }
@@ -213,58 +203,27 @@ public abstract class GroupsAction
        }
    }

    private void runPrivileged(final Subject subject) throws Throwable
    {
        try
        {
            Subject.doAs(subject, this);
        }
        catch (PrivilegedActionException e)
        {
            final Throwable cause = e.getCause();
            if (cause != null)
            {
                throw cause;
            }
            throw e;
        }
    }

    protected final void setStatusCode(final int statusCode)
    {
        syncOutput.setResponseCode(statusCode);
    }

    protected final OutputStream getOutputStream() throws IOException
    {
        return syncOutput.getOutputStream();
    }

    protected final void setContentType(final String contentType)
    {
        syncOutput.setHeader("Content-Type", contentType);
    }

    protected final void setRedirectLocation(final String location)
    {
        syncOutput.setHeader("Location", location);
    }

    private void sendError(int responseCode)
        throws IOException
    {
        sendError(responseCode, null);
    }

    private void sendError(final int code, String message)
    private void sendError(int responseCode, String message)
        throws IOException
    {
        setContentType("text/plain");
        setStatusCode(code);

        if (!this.response.isCommitted())
        {
            this.response.setContentType("text/plain");
            if (message != null)
            {
            getOutputStream().write(message.getBytes());
                this.response.getWriter().write(message);
            }
            this.response.setStatus(responseCode);
        }
        else
        {
            log.warn("Could not send error " + responseCode + " (" + message + ") because the response is already committed.");
        }
    }

+1 −0
Original line number Diff line number Diff line
@@ -185,6 +185,7 @@ public class GroupsActionFactory

        if (action != null)
        {
            log.debug("Returning action: " + action.getClass());
            return action;
        }
        throw new IllegalArgumentException("Bad groups request: " + method + " on " + path);
Loading