/*==========================================================================*\ | $Id: GitRequestHandler.java,v 1.2 2012/06/22 16:23:17 aallowat Exp $ |*-------------------------------------------------------------------------*| | Copyright (C) 2011 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 org.eclipse.jgit.lib.Constants; import org.webcat.core.Application; import org.webcat.core.EOBase; import org.webcat.core.RepositoryProvider; import org.webcat.core.http.MetaRequestHandler; import org.webcat.core.http.NoCacheRequestFilter; import org.webcat.core.http.RequestHandlerBinder; import com.webobjects.appserver.WOContext; import com.webobjects.eocontrol.EOEnterpriseObject; //------------------------------------------------------------------------- /** * A request handler that provides Git access to file repositories on Web-CAT * (such as a user's storage area, the storage area for a course, and * so forth) using Git's smart HTTP protocol. * * @author Tony Allevato * @author Last changed by $Author: aallowat $ * @version $Revision: 1.2 $, $Date: 2012/06/22 16:23:17 $ */ public class GitRequestHandler extends MetaRequestHandler { //~ Constructors .......................................................... // ---------------------------------------------------------- /** * Initializes a new GitRequestHandler. */ public GitRequestHandler() { // Enable Smart HTTP receive and upload. serve("*/git-receive-pack").with(new ReceivePackRequestHandler()); serve("*/git-upload-pack").with(new UploadPackRequestHandler()); // Filter accesses to the Git info/refs file through our advertisers // so that clients will use Smart HTTP functionality. serve("*/" + Constants.INFO_REFS) .through(new UploadPackRequestHandler.InfoRefs()) .through(new ReceivePackRequestHandler.InfoRefs()) .with(new InfoRefsRequestHandler()); // Finally, serve any request that doesn't match the above with a // standard Web-DAV response. serve("*").with(new GitWebRequestHandler()); } //~ Methods ............................................................... // ---------------------------------------------------------- /** * Gets an absolute URL to access an EO file store. * * @param context the request context * @param eo the EO whose file store should be accessed * @param path the entity-relative path to the resource * @return the file store URL */ public static String completeURLForRepositoryPath(WOContext context, EOBase eo, String path) { String requestPath = requestPathForRepositoryPath(eo, path); if (requestPath == null) { return null; } else { return Application.completeURLWithRequestHandlerKey( context, REQUEST_HANDLER_KEY, requestPath, null, true, 0); } } // ---------------------------------------------------------- /** * Gets a relative URL to access an EO file store. * * @param context the request context * @param eo the EO whose file store should be accessed * @param path the entity-relative path to the resource * @return the file store URL */ public static String urlForRepositoryPath(WOContext context, EOBase eo, String path) { String requestPath = requestPathForRepositoryPath(eo, path); if (requestPath == null) { return null; } else { return context.urlWithRequestHandlerKey(REQUEST_HANDLER_KEY, requestPath, null); } } // ---------------------------------------------------------- /** * Gets the part of an EO file store URL that follows the request handler * key. * * @param eo the EO whose file store should be accessed * @param path the entity-relative path to the resource * @return the file store URL suffix */ private static String requestPathForRepositoryPath(EOBase eo, String path) { if (!(eo instanceof RepositoryProvider)) { return null; } String entityName = eo.entityName(); String repoId = eo.apiId(); StringBuffer buffer = new StringBuffer(); buffer.append(entityName); buffer.append("/"); buffer.append(repoId); if (path != null && path.length() > 0) { buffer.append("/"); buffer.append(path); } return buffer.toString(); } // ---------------------------------------------------------- /** * Overrides the {@link MetaRequestHandler#register(RequestHandlerBinder)} * method to ensure that helper filters are attached to every service * binder. * * @param binder the incoming binder * @return the possibly modified binder */ @Override protected RequestHandlerBinder register(RequestHandlerBinder binder) { return binder.through(new NoCacheRequestFilter()) .through(new GitAuthenticationFilter()) .through(new RepositoryRequestFilter()); } //~ Static/instance variables ............................................. /** * The request handler key that is used to register the handler. */ public static final String REQUEST_HANDLER_KEY = "git"; }