/*******************************************************************************
* Copyright (c) 2011, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.orion.server.git.servlets;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.orion.internal.server.servlets.ServletResourceHandler;
import org.eclipse.orion.server.core.PreferenceHelper;
import org.eclipse.orion.server.git.GitConstants;
import org.eclipse.orion.server.git.objects.Blame;
import org.eclipse.orion.server.git.objects.Branch;
import org.eclipse.orion.server.git.objects.Clone;
import org.eclipse.orion.server.git.objects.Commit;
import org.eclipse.orion.server.git.objects.ConfigOption;
import org.eclipse.orion.server.git.objects.Diff;
import org.eclipse.orion.server.git.objects.Ignore;
import org.eclipse.orion.server.git.objects.Index;
import org.eclipse.orion.server.git.objects.PullRequest;
import org.eclipse.orion.server.git.objects.Remote;
import org.eclipse.orion.server.git.objects.Stash;
import org.eclipse.orion.server.git.objects.Status;
import org.eclipse.orion.server.git.objects.Submodule;
import org.eclipse.orion.server.git.objects.Tag;
import org.eclipse.orion.server.git.objects.Tree;
/**
* A git handler for Orion Git API v 1.0.
*/
public class GitHandlerV1 extends ServletResourceHandler<String> {
private ServletResourceHandler<String> branchHandlerV1;
private ServletResourceHandler<String> cloneHandlerV1;
private ServletResourceHandler<String> commitHandlerV1;
private ServletResourceHandler<String> configHandlerV1;
private ServletResourceHandler<String> diffHandlerV1;
private ServletResourceHandler<String> indexHandlerV1;
private ServletResourceHandler<String> ignoreHandlerV1;
private ServletResourceHandler<String> remoteHandlerV1;
private ServletResourceHandler<String> statusHandlerV1;
private ServletResourceHandler<String> tagHandlerV1;
private ServletResourceHandler<String> blameHandlerV1;
private ServletResourceHandler<String> treeHandlerV1;
private ServletResourceHandler<String> stashHandlerV1;
private ServletResourceHandler<String> submoduleHandlerV1;
private ServletResourceHandler<String> pullRequestHandlerV1;
GitHandlerV1(ServletResourceHandler<IStatus> statusHandler) {
branchHandlerV1 = new GitBranchHandlerV1(statusHandler);
blameHandlerV1 = new GitBlameHandlerV1(statusHandler);
cloneHandlerV1 = new GitCloneHandlerV1(statusHandler);
commitHandlerV1 = new GitCommitHandlerV1(statusHandler);
configHandlerV1 = new GitConfigHandlerV1(statusHandler);
diffHandlerV1 = new GitDiffHandlerV1(statusHandler);
indexHandlerV1 = new GitIndexHandlerV1(statusHandler);
ignoreHandlerV1 = new GitIgnoreHandlerV1(statusHandler);
remoteHandlerV1 = new GitRemoteHandlerV1(statusHandler);
statusHandlerV1 = new GitStatusHandlerV1(statusHandler);
tagHandlerV1 = new GitTagHandlerV1(statusHandler);
treeHandlerV1 = new GitTreeHandlerV1(statusHandler);
stashHandlerV1 = new GitStashHandlerV1(statusHandler);
submoduleHandlerV1 = new GitSubmoduleHandlerV1(statusHandler);
pullRequestHandlerV1 = new GitPullRequestHandlerV1(statusHandler);
}
@Override
public boolean handleRequest(HttpServletRequest request, HttpServletResponse response, String gitPathInfo) throws ServletException {
String[] infoParts = gitPathInfo.split("\\/", 3); //$NON-NLS-1$
if (infoParts.length < 2)
return false; // malformed request, we don't know how to handle this
String pathString = infoParts.length > 2 ? infoParts[2] : "";
if (request.getContextPath().length() != 0) {
IPath path = pathString == null ? Path.EMPTY : new Path(pathString);
IPath contextPath = new Path(request.getContextPath());
if (contextPath.isPrefixOf(path)) {
pathString = path.removeFirstSegments(contextPath.segmentCount()).toString();
}
}
// TODO: Add to constants
String tokenName = PreferenceHelper.getString("ltpa.token.name"); //$NON-NLS-1$
if (tokenName != null) {
javax.servlet.http.Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie currentCookie = cookies[i];
if (tokenName.equals(currentCookie.getName())) {
Cookie loginCookie = new Cookie(currentCookie.getName(), GitUtils.sanitizeCookie(currentCookie.getValue()));
request.setAttribute(GitConstants.KEY_SSO_TOKEN, loginCookie);
}
}
}
}
if (infoParts[1].equals(Branch.RESOURCE)) {
return branchHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Clone.RESOURCE)) {
return cloneHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Commit.RESOURCE)) {
return commitHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(ConfigOption.RESOURCE)) {
return configHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Diff.RESOURCE)) {
return diffHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Index.RESOURCE)) {
return indexHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Remote.RESOURCE)) {
return remoteHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Status.RESOURCE)) {
return statusHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Tag.RESOURCE)) {
return tagHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Blame.RESOURCE)) {
return blameHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Ignore.RESOURCE)) {
return ignoreHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Tree.RESOURCE)) {
return treeHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Stash.RESOURCE)) {
return stashHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(Submodule.RESOURCE)) {
return submoduleHandlerV1.handleRequest(request, response, pathString);
} else if (infoParts[1].equals(PullRequest.RESOURCE)) {
return pullRequestHandlerV1.handleRequest(request, response, pathString);
}
return false;
}
}