/*******************************************************************************
* Copyright (c) 2014 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.objects;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.orion.server.core.ProtocolConstants;
import org.eclipse.orion.server.core.resources.Property;
import org.eclipse.orion.server.core.resources.ResourceShape;
import org.eclipse.orion.server.core.resources.annotations.PropertyDescription;
import org.eclipse.orion.server.core.resources.annotations.ResourceDescription;
import org.eclipse.orion.server.git.GitConstants;
import org.eclipse.orion.server.git.servlets.GitServlet;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@ResourceDescription(type = Stash.TYPE)
public class StashPage extends GitObject {
private static final ResourceShape DEFAULT_RESOURCE_SHAPE = new ResourceShape();
{
Property[] defaultProperties = new Property[] { //
new Property(ProtocolConstants.KEY_LOCATION), // super
new Property(GitConstants.KEY_CLONE), // super
new Property(ProtocolConstants.KEY_CHILDREN), //
new Property(ProtocolConstants.KEY_PREVIOUS_LOCATION), //
new Property(ProtocolConstants.KEY_NEXT_LOCATION) };
DEFAULT_RESOURCE_SHAPE.setProperties(defaultProperties);
}
protected Collection<RevCommit> stash;
private int pageSize;
private int page;
private String messageFilter;
public StashPage(URI cloneLocation, Repository db, Collection<RevCommit> stash, int page, int pageSize, String filter) {
super(cloneLocation, db);
this.stash = stash;
this.page = Math.max(1, page);
this.pageSize = Math.max(0, pageSize);
this.messageFilter = filter;
}
@PropertyDescription(name = ProtocolConstants.KEY_CHILDREN)
protected JSONArray getChildren() throws GitAPIException, JSONException, URISyntaxException, IOException, CoreException {
int toSkip = (page - 1) * pageSize;
JSONArray children = new JSONArray();
int curr = 1, arrLength = 0;
for (RevCommit revCommit : stash) {
if (curr++ > toSkip) {
if (arrLength++ >= pageSize)
break;
Stash commit = new Stash(cloneLocation, db, revCommit, null);
if (messageFilter != null && !messageFilter.equals("")) {
if (revCommit.getFullMessage().toLowerCase().contains(messageFilter.toLowerCase()))
children.put(commit.toJSON());
} else {
children.put(commit.toJSON());
}
}
}
return children;
}
@PropertyDescription(name = ProtocolConstants.KEY_PREVIOUS_LOCATION)
protected URI getPreviousPageLocation() throws URISyntaxException {
if (page > 1) {
URI location = getLocation();
String query = String.format("page=%d&pageSize=%d", (page - 1), pageSize); //$NON-NLS-1$
return new URI(location.getScheme(), location.getAuthority(), location.getPath(), query, location.getFragment());
}
return null;
}
@PropertyDescription(name = ProtocolConstants.KEY_NEXT_LOCATION)
protected URI getNextPageLocation() throws URISyntaxException {
if (hasNextPage()) {
URI location = getLocation();
String query = String.format("page=%d&pageSize=%d", (page + 1), pageSize); //$NON-NLS-1$
return new URI(location.getScheme(), location.getAuthority(), location.getPath(), query, location.getFragment());
}
return null;
}
protected boolean hasNextPage() {
return stash.size() > (page * pageSize);
}
@Override
protected URI getLocation() throws URISyntaxException {
IPath stashPath = new Path(GitServlet.GIT_URI).append(Stash.RESOURCE);
// clone location is of the form /gitapi/clone/file/{workspaceId}/{projectName}[/{path}]
IPath clonePath = new Path(cloneLocation.getPath()).removeFirstSegments(2);
stashPath = stashPath.append(clonePath);
return new URI(cloneLocation.getScheme(), cloneLocation.getAuthority(), stashPath.toString(), null, null);
}
@Override
public JSONObject toJSON() throws JSONException, URISyntaxException, IOException, CoreException {
return jsonSerializer.serialize(this, DEFAULT_RESOURCE_SHAPE);
}
}