List<Tag> tags = new ArrayList<Tag>();
for (Ref ref : refs) {
if (nameFilter != null && !nameFilter.equals("")) {
String shortName = Repository.shortenRefName(ref.getName());
if (shortName.toLowerCase().contains(nameFilter.toLowerCase())) {
Tag tag = new Tag(cloneLocation, db, ref);
tags.add(tag);
}
} else {
Tag tag = new Tag(cloneLocation, db, ref);
tags.add(tag);
}
}
Collections.sort(tags, Tag.COMPARATOR);
JSONArray children = new JSONArray();
int firstTag = pageSize > 0 ? pageSize * (pageNo - 1) : 0;
int lastTag = pageSize > 0 ? firstTag + pageSize - 1 : tags.size() - 1;
lastTag = lastTag > tags.size() - 1 ? tags.size() - 1 : lastTag;
if (pageNo > 1 && baseLocation != null) {
String prev = baseLocation + "?page=" + (pageNo - 1) + "&pageSize=" + pageSize;
if (nameFilter != null && !nameFilter.equals("")) {
prev += "&filter=" + GitUtils.encode(nameFilter);
}
if (commitsSize > 0) {
prev += "&" + GitConstants.KEY_TAG_COMMITS + "=" + commitsSize;
}
result.put(ProtocolConstants.KEY_PREVIOUS_LOCATION, prev);
}
if (lastTag < tags.size() - 1) {
String next = baseLocation + "?page=" + (pageNo + 1) + "&pageSize=" + pageSize;
if (nameFilter != null && !nameFilter.equals("")) {
next += "&filter=" + GitUtils.encode(nameFilter);
}
if (commitsSize > 0) {
next += "&" + GitConstants.KEY_TAG_COMMITS + "=" + commitsSize;
}
result.put(ProtocolConstants.KEY_NEXT_LOCATION, next);
}
for (int i = firstTag; i <= lastTag; i++) {
Tag tag = tags.get(i);
if (this.commitsSize == 0) {
children.put(tag.toJSON());
} else {
// add info about commits if requested
LogCommand lc = git.log();
String toCommitName = tag.getRevCommitName();
ObjectId toCommitId = db.resolve(toCommitName);
Ref toCommitRef = db.getRef(toCommitName);
toCommitId = getCommitObjectId(db, toCommitId);
lc.add(toCommitId);
lc.setMaxCount(this.commitsSize);
Iterable<RevCommit> commits = lc.call();
Log log = new Log(cloneLocation, db, commits, null, null, toCommitRef);
log.setPaging(1, commitsSize);
children.put(tag.toJSON(log.toJSON()));
}
}
result.put(ProtocolConstants.KEY_CHILDREN, children);
result.put(ProtocolConstants.KEY_TYPE, Tag.TYPE);
return new ServerStatus(Status.OK_STATUS, HttpServletResponse.SC_OK, result);