/*==========================================================================*\
| $Id: GitWebContext.java,v 1.4 2012/06/22 16:23:17 aallowat 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 org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.webcat.core.EOBase;
import org.webcat.core.git.GitRef;
import org.webcat.core.git.GitRepository;
import com.webobjects.appserver.WOContext;
//-------------------------------------------------------------------------
/**
* TODO real description
*
* @author Tony Allevato
* @author Last changed by $Author: aallowat $
* @version $Revision: 1.4 $, $Date: 2012/06/22 16:23:17 $
*/
public class GitWebContext
{
//~ Constructors ..........................................................
// ----------------------------------------------------------
public GitWebContext(EOBase originator,
GitRepository repository, String repositoryName, GitWebMode mode)
{
this.originator = originator;
this.repository = repository;
this.repositoryName = repositoryName;
this.mode = mode;
setHeadName(Constants.MASTER);
}
// ----------------------------------------------------------
public GitWebContext(EOBase originator,
GitRepository repository, String repositoryName, GitWebMode mode,
String pathSuffix)
{
this(originator, repository, repositoryName, mode);
ObjectId id = null;
try
{
id = ObjectId.fromString(pathSuffix);
}
catch (Exception e)
{
int firstSlash = pathSuffix.indexOf('/');
if (firstSlash == -1)
{
setHeadName(pathSuffix);
}
else
{
setHeadName(pathSuffix.substring(0, firstSlash));
path = pathSuffix.substring(firstSlash + 1);
}
id = repository.resolve(headObjectId.getName() + ":" + path);
}
objectId = id;
}
// ----------------------------------------------------------
private GitWebContext(GitWebContext source)
{
originator = source.originator;
repository = source.repository;
repositoryName = source.repositoryName;
mode = source.mode;
headName = source.headName;
headObjectId = source.headObjectId;
objectId = source.objectId;
path = source.path;
}
//~ Methods ...............................................................
// ----------------------------------------------------------
public EOBase originator()
{
return originator;
}
// ----------------------------------------------------------
public GitRepository repository()
{
return repository;
}
// ----------------------------------------------------------
public String repositoryName()
{
return repositoryName;
}
// ----------------------------------------------------------
public GitWebMode mode()
{
return mode;
}
// ----------------------------------------------------------
public void setMode(GitWebMode mode)
{
this.mode = mode;
// Clear out any unnecessary context options (for example, COMMIT
// doesn't need a path, just an object ID).
switch (mode)
{
case BRANCHES:
case COMPARE:
path = null;
objectId = null;
break;
case COMMIT:
path = null;
break;
default:
// Do nothing.
break;
}
}
// ----------------------------------------------------------
public String headName()
{
return headName;
}
// ----------------------------------------------------------
private void setHeadName(String headName)
{
this.headName = headName;
computeHeadObjectId();
}
// ----------------------------------------------------------
public ObjectId headObjectId()
{
return headObjectId;
}
// ----------------------------------------------------------
public void setHeadObjectId(ObjectId objectId)
{
headObjectId = objectId;
}
// ----------------------------------------------------------
public void computeHeadObjectId()
{
GitRef ref = repository.refWithName(headName);
if (ref != null)
{
headObjectId = ref.ref().getObjectId();
}
}
// ----------------------------------------------------------
public GitRef headRef()
{
return repository.refWithName(headName);
}
// ----------------------------------------------------------
public void setHeadRef(GitRef ref)
{
if (ref != null)
{
setHeadName(ref.shortName());
}
else
{
setHeadName(null);
}
}
// ----------------------------------------------------------
public ObjectId objectId()
{
return objectId;
}
// ----------------------------------------------------------
public void setObjectId(ObjectId objectId)
{
// TODO recompute the path here?
this.objectId = objectId;
}
// ----------------------------------------------------------
public String path()
{
return path;
}
// ----------------------------------------------------------
public void setPath(String path)
{
// TODO recompute the object ID here?
this.path = path;
}
// ----------------------------------------------------------
public void appendToPath(String pathComponent)
{
String newPath = path();
if (newPath == null || newPath.length() == 0)
{
newPath = pathComponent;
}
else
{
if (newPath.endsWith("/"))
{
newPath += pathComponent;
}
else
{
newPath += "/" + pathComponent;
}
}
setPath(newPath);
}
// ----------------------------------------------------------
public String lastPathComponent()
{
String thePath = path();
if (thePath != null)
{
int lastSlash = thePath.lastIndexOf('/');
if (lastSlash == -1)
{
return thePath;
}
else
{
String component = thePath.substring(lastSlash + 1);
if (component.length() == 0)
{
return null;
}
else
{
return component;
}
}
}
else
{
return null;
}
}
// ----------------------------------------------------------
public void removeLastPathComponent()
{
String thePath = path();
if (thePath != null)
{
int lastSlash = thePath.lastIndexOf('/');
if (lastSlash == -1)
{
thePath = null;
}
else
{
thePath = thePath.substring(0, lastSlash);
}
setPath(thePath);
}
}
// ----------------------------------------------------------
public static GitWebContext parse(EOBase originator,
GitRepository repository, String repositoryName, String path)
{
GitWebContext newContext = null;
if (path == null || path.length() == 0)
{
return new GitWebContext(originator, repository,
repositoryName, GitWebMode.TREE, Constants.MASTER);
}
String typeString = null;
String remainder = null;
int firstSlash = path.indexOf('/');
if (firstSlash == -1)
{
typeString = path;
}
else
{
typeString = path.substring(0, firstSlash);
remainder = path.substring(firstSlash + 1);
}
GitWebMode type = GitWebMode.valueOf(
typeString.toUpperCase());
if (type != null)
{
switch (type)
{
case TREE:
case COMMITS:
case BLOB:
case RAW:
newContext = new GitWebContext(originator, repository,
repositoryName, type, remainder);
break;
case BRANCHES:
newContext = new GitWebContext(originator, repository,
repositoryName, type);
break;
case COMMIT:
newContext = new GitWebContext(originator, repository,
repositoryName, type);
newContext.headObjectId = ObjectId.fromString(remainder);
break;
case COMPARE:
// TODO implement
break;
}
}
return newContext;
}
// ----------------------------------------------------------
public GitWebContext clone()
{
return new GitWebContext(this);
}
// ----------------------------------------------------------
public String toURL(WOContext context)
{
String pathAfterType = urlPathAfterRequestType();
String fullPath = mode.name().toLowerCase();
if (pathAfterType != null)
{
fullPath += "/" + pathAfterType;
}
return GitRequestHandler.urlForRepositoryPath(context, originator,
fullPath);
}
// ----------------------------------------------------------
public String description()
{
String description;
switch (mode)
{
case BLOB:
case TREE:
if (path() == null)
{
description = repositoryName() + " at " + headName();
}
else
{
description = path() + " at " + headName()
+ " from " + repositoryName();
}
break;
case COMMIT:
description = "Commit " + headObjectId().getName()
+ " to " + repositoryName();
break;
case COMMITS:
description = "Commit History for " + repositoryName();
break;
case BRANCHES:
description = "All Branches for " + repositoryName();
break;
default:
// FIXME
description = null;
break;
}
return description;
}
// ----------------------------------------------------------
public void setDescription(String description)
{
// Do nothing; keep KVC happy.
}
// ----------------------------------------------------------
private String urlPathAfterRequestType()
{
if (headName() != null && path != null)
{
return headName() + "/" + path;
}
else if (objectId != null)
{
return objectId.getName();
}
else if (headName() != null)
{
return headName();
}
else
{
return null;
}
}
//~ Static/instance variables .............................................
private EOBase originator;
private GitWebMode mode;
private GitRepository repository;
private String repositoryName;
private String headName;
private ObjectId headObjectId;
private ObjectId objectId;
private String path;
}