Paul Martin
2016-04-30 a502d96a860456ec5e8c96761db70f7cabb74751
src/main/java/com/gitblit/servlet/SyndicationServlet.java
@@ -22,6 +22,8 @@
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServlet;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -31,7 +33,6 @@
import com.gitblit.Constants;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.dagger.DaggerServlet;
import com.gitblit.manager.IProjectManager;
import com.gitblit.manager.IRepositoryManager;
import com.gitblit.models.FeedEntryModel;
@@ -40,13 +41,13 @@
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.servlet.AuthenticationFilter.AuthenticatedRequest;
import com.gitblit.utils.BugtraqProcessor;
import com.gitblit.utils.HttpUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.MessageProcessor;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.SyndicationUtils;
import dagger.ObjectGraph;
import com.google.inject.Inject;
import com.google.inject.Singleton;
/**
 * SyndicationServlet generates RSS 2.0 feeds and feed links.
@@ -56,7 +57,8 @@
 * @author James Moger
 *
 */
public class SyndicationServlet extends DaggerServlet {
@Singleton
public class SyndicationServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
@@ -68,11 +70,15 @@
   private IProjectManager projectManager;
   @Override
   protected void inject(ObjectGraph dagger) {
      this.settings = dagger.get(IStoredSettings.class);
      this.repositoryManager = dagger.get(IRepositoryManager.class);
      this.projectManager = dagger.get(IProjectManager.class);
   @Inject
   public SyndicationServlet(
         IStoredSettings settings,
         IRepositoryManager repositoryManager,
         IProjectManager projectManager) {
      this.settings = settings;
      this.repositoryManager = repositoryManager;
      this.projectManager = projectManager;
   }
   /**
@@ -148,7 +154,7 @@
      String servletUrl = request.getContextPath() + request.getServletPath();
      String url = request.getRequestURI().substring(servletUrl.length());
      if (url.charAt(0) == '/' && url.length() > 1) {
      if (url.length() > 1 && url.charAt(0) == '/') {
         url = url.substring(1);
      }
      String repositoryName = url;
@@ -163,6 +169,15 @@
            searchType = type;
         }
      }
      Constants.FeedObjectType objectType = Constants.FeedObjectType.COMMIT;
      if (!StringUtils.isEmpty(request.getParameter("ot"))) {
         Constants.FeedObjectType type = Constants.FeedObjectType.forName(request.getParameter("ot"));
         if (type != null) {
            objectType = type;
         }
      }
      int length = settings.getInteger(Keys.web.syndicationEntries, 25);
      if (StringUtils.isEmpty(objectId)) {
         objectId = org.eclipse.jgit.lib.Constants.HEAD;
@@ -184,7 +199,7 @@
      response.setContentType("application/rss+xml; charset=UTF-8");
      boolean isProjectFeed = false;
      String feedName = null;
      String feedName = "Gitblit";
      String feedTitle = null;
      String feedDescription = null;
@@ -214,15 +229,11 @@
      boolean mountParameters = settings.getBoolean(Keys.web.mountParameters, true);
      String urlPattern;
      if (mountParameters) {
         // mounted parameters
         urlPattern = "{0}/commit/{1}/{2}";
      } else {
         // parameterized parameters
         urlPattern = "{0}/commit/?r={1}&h={2}";
      String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null);
      if (StringUtils.isEmpty(gitblitUrl)) {
         gitblitUrl = HttpUtils.getGitblitURL(request);
      }
      String gitblitUrl = HttpUtils.getGitblitURL(request);
      char fsc = settings.getChar(Keys.web.forwardSlashCharacter, '/');
      List<FeedEntryModel> entries = new ArrayList<FeedEntryModel>();
@@ -232,7 +243,7 @@
         RepositoryModel model = repositoryManager.getRepositoryModel(name);
         if (repository == null) {
            if (model.isCollectingGarbage) {
            if (model != null && model.isCollectingGarbage) {
               logger.warn(MessageFormat.format("Temporarily excluding {0} from feed, busy collecting garbage", name));
            }
            continue;
@@ -244,47 +255,92 @@
            feedDescription = model.description;
         }
         List<RevCommit> commits;
         if (StringUtils.isEmpty(searchString)) {
            // standard log/history lookup
            commits = JGitUtils.getRevLog(repository, objectId, offset, length);
         if (objectType == Constants.FeedObjectType.TAG) {
            String urlPattern;
            if (mountParameters) {
               // mounted parameters
               urlPattern = "{0}/tag/{1}/{2}";
            } else {
               // parameterized parameters
               urlPattern = "{0}/tag/?r={1}&h={2}";
            }
            List<RefModel> tags = JGitUtils.getTags(repository, false, length, offset);
            for (RefModel tag : tags) {
               FeedEntryModel entry = new FeedEntryModel();
               entry.title = tag.getName();
               entry.author = tag.getAuthorIdent().getName();
               entry.link = MessageFormat.format(urlPattern, gitblitUrl,
                     StringUtils.encodeURL(model.name.replace('/', fsc)), tag.getObjectId().getName());
               entry.published = tag.getDate();
               entry.contentType = "text/html";
               entry.content = tag.getFullMessage();
               entry.repository = model.name;
               entry.branch = objectId;
               entry.tags = new ArrayList<String>();
               // add tag id and referenced commit id
               entry.tags.add("tag:" + tag.getObjectId().getName());
               entry.tags.add("commit:" + tag.getReferencedObjectId().getName());
               entries.add(entry);
            }
         } else {
            // repository search
            commits = JGitUtils.searchRevlogs(repository, objectId, searchString, searchType,
                  offset, length);
         }
         Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(repository, model.showRemoteBranches);
         MessageProcessor processor = new MessageProcessor(settings);
         // convert RevCommit to SyndicatedEntryModel
         for (RevCommit commit : commits) {
            FeedEntryModel entry = new FeedEntryModel();
            entry.title = commit.getShortMessage();
            entry.author = commit.getAuthorIdent().getName();
            entry.link = MessageFormat.format(urlPattern, gitblitUrl,
                  StringUtils.encodeURL(model.name.replace('/', fsc)), commit.getName());
            entry.published = commit.getCommitterIdent().getWhen();
            entry.contentType = "text/html";
            String message = processor.processCommitMessage(repository, model, commit.getFullMessage());
            entry.content = message;
            entry.repository = model.name;
            entry.branch = objectId;
            entry.tags = new ArrayList<String>();
            // add commit id and parent commit ids
            entry.tags.add("commit:" + commit.getName());
            for (RevCommit parent : commit.getParents()) {
               entry.tags.add("parent:" + parent.getName());
            String urlPattern;
            if (mountParameters) {
               // mounted parameters
               urlPattern = "{0}/commit/{1}/{2}";
            } else {
               // parameterized parameters
               urlPattern = "{0}/commit/?r={1}&h={2}";
            }
            // add refs to tabs list
            List<RefModel> refs = allRefs.get(commit.getId());
            if (refs != null && refs.size() > 0) {
               for (RefModel ref : refs) {
                  entry.tags.add("ref:" + ref.getName());
            List<RevCommit> commits;
            if (StringUtils.isEmpty(searchString)) {
               // standard log/history lookup
               commits = JGitUtils.getRevLog(repository, objectId, offset, length);
            } else {
               // repository search
               commits = JGitUtils.searchRevlogs(repository, objectId, searchString, searchType,
                     offset, length);
            }
            Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(repository, model.showRemoteBranches);
            BugtraqProcessor processor = new BugtraqProcessor(settings);
            // convert RevCommit to SyndicatedEntryModel
            for (RevCommit commit : commits) {
               FeedEntryModel entry = new FeedEntryModel();
               entry.title = commit.getShortMessage();
               entry.author = commit.getAuthorIdent().getName();
               entry.link = MessageFormat.format(urlPattern, gitblitUrl,
                     StringUtils.encodeURL(model.name.replace('/', fsc)), commit.getName());
               entry.published = commit.getCommitterIdent().getWhen();
               entry.contentType = "text/html";
               String message = processor.processCommitMessage(repository, model, commit.getFullMessage());
               entry.content = message;
               entry.repository = model.name;
               entry.branch = objectId;
               entry.tags = new ArrayList<String>();
               // add commit id and parent commit ids
               entry.tags.add("commit:" + commit.getName());
               for (RevCommit parent : commit.getParents()) {
                  entry.tags.add("parent:" + parent.getName());
               }
               // add refs to tabs list
               List<RefModel> refs = allRefs.get(commit.getId());
               if (refs != null && refs.size() > 0) {
                  for (RefModel ref : refs) {
                     entry.tags.add("ref:" + ref.getName());
                  }
               }
               entries.add(entry);
            }
            entries.add(entry);
         }
      }
@@ -312,7 +368,7 @@
         if (mountParameters) {
            // mounted url
            feedLink = MessageFormat.format("{0}/summary/{1}", gitblitUrl,
                  StringUtils.encodeURL(feedName));
                  StringUtils.encodeURL(feedName.replace('/', fsc)));
         } else {
            // parameterized url
            feedLink = MessageFormat.format("{0}/summary/?r={1}", gitblitUrl,