/*==========================================================================*\
| $Id: ReceivePackRequestHandler.java,v 1.2 2012/03/28 13:48:08 stedwar2 Exp $
|*-------------------------------------------------------------------------*|
| Copyright (C) 2011-2012 Virginia Tech
|
| This file is part of Web-CAT.
|
| Web-CAT is free software; you can redistribute it and/or modify
| it under the terms of the GNU Affero General Public License as published
| by the Free Software Foundation; either version 3 of the License, or
| (at your option) any later version.
|
| Web-CAT is distributed in the hope that it will be useful,
| but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| GNU General Public License for more details.
|
| You should have received a copy of the GNU Affero General Public License
| along with Web-CAT; if not, see <http://www.gnu.org/licenses/>.
\*==========================================================================*/
package org.webcat.core.git.http;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import org.apache.http.HttpStatus;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.PostReceiveHook;
import org.eclipse.jgit.transport.ReceiveCommand;
import org.eclipse.jgit.transport.ReceivePack;
import org.eclipse.jgit.transport.RefAdvertiser.PacketLineOutRefAdvertiser;
import org.eclipse.jgit.util.HttpSupport;
import org.webcat.core.git.GitUtilities;
import org.webcat.core.http.RequestHandlerWithResponse;
import org.webcat.core.http.RequestUtils;
import org.webcat.core.http.SmartGZIPOutputStream;
import com.webobjects.appserver.WORequest;
import com.webobjects.appserver.WOResponse;
//-------------------------------------------------------------------------
/**
* Handles Git Smart HTTP requests for the {@code git-receive-pack} service.
*
* @author Tony Allevato
* @author Last changed by $Author: stedwar2 $
* @version $Revision: 1.2 $, $Date: 2012/03/28 13:48:08 $
*/
public class ReceivePackRequestHandler
implements RequestHandlerWithResponse
{
//~ Methods ...............................................................
// ----------------------------------------------------------
/**
* Handles the request and generates the ReceivePack response.
*
* @param request the request
* @param response the response
* @throws Exception if an error occurs
*/
public void handleRequest(WORequest request, WOResponse response)
throws Exception
{
String contentType = request.headerForKey(HttpSupport.HDR_CONTENT_TYPE);
if (RECEIVE_PACK_REQUEST_TYPE.equals(contentType))
{
final Repository repo =
RepositoryRequestUtils.repositoryFromRequest(request);
ReceivePack rp = new ReceivePack(repo);
rp.setBiDirectionalPipe(false);
rp.setPostReceiveHook(new PostReceiveHook() {
public void onPostReceive(ReceivePack pack,
Collection<ReceiveCommand> commands)
{
// Once the pack is received, force a pull of the working
// copy so that anyone using Web-DAV will get synched.
GitUtilities.workingCopyForRepository(repo, true);
}
});
response.setHeader(RECEIVE_PACK_RESULT_TYPE,
HttpSupport.HDR_CONTENT_TYPE);
InputStream input = RequestUtils.inputStreamForRequest(request);
SmartGZIPOutputStream output =
new SmartGZIPOutputStream(request, response);
rp.receive(input, output, null);
output.close();
}
else
{
response.setStatus(HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE);
}
}
//~ Inner classes .........................................................
// ----------------------------------------------------------
/**
* Prepends info/refs advertisements for the {@code git-receive-pack}
* service to a response.
*/
public static class InfoRefs extends SmartHttpInfoRefsFilter
{
//~ Constructors ......................................................
// ----------------------------------------------------------
/**
* Creates a new filter for the {@code git-receive-pack} service.
*/
public InfoRefs()
{
super("git-receive-pack");
}
//~ Methods ...........................................................
// ----------------------------------------------------------
@Override
protected void advertise(WORequest request, Repository repository,
PacketLineOutRefAdvertiser advertiser) throws IOException
{
ReceivePack rp = new ReceivePack(repository);
try
{
rp.sendAdvertisedRefs(advertiser);
}
finally
{
rp.getRevWalk().release();
}
}
}
//~ Static/instance variables .............................................
private static final String RECEIVE_PACK_REQUEST_TYPE =
"application/x-git-receive-pack-request";
private static final String RECEIVE_PACK_RESULT_TYPE =
"application/x-git-receive-pack-result";
}