models.PullRequestEvent.java Source code

Java tutorial

Introduction

Here is the source code for models.PullRequestEvent.java

Source

/**
 * Yobi, Project Hosting SW
 *
 * Copyright 2013 NAVER Corp.
 * http://yobi.io
 *
 * @Author Wansoon Park
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package models;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.persistence.*;

import org.apache.commons.lang3.StringUtils;
import models.enumeration.EventType;
import models.enumeration.State;
import org.joda.time.DateTime;
import play.db.ebean.Model;
import utils.EventConstants;
import utils.JodaDateUtil;

@Entity
public class PullRequestEvent extends Model implements TimelineItem {

    private static final long serialVersionUID = 1981361242582594128L;
    public static Finder<Long, PullRequestEvent> finder = new Finder<>(Long.class, PullRequestEvent.class);

    @Id
    public Long id;
    public String senderLoginId;

    @ManyToOne
    public PullRequest pullRequest;

    @Enumerated(EnumType.STRING)
    public EventType eventType;

    public Date created;

    public String oldValue;
    public String newValue;

    @Override
    public Date getDate() {
        return created;
    }

    public static void addFromNotificationEvent(NotificationEvent notiEvent, PullRequest pullRequest) {
        PullRequestEvent event = new PullRequestEvent();
        event.created = notiEvent.created;
        event.senderLoginId = notiEvent.getSender().loginId;
        event.pullRequest = pullRequest;
        event.eventType = notiEvent.eventType;
        event.oldValue = notiEvent.oldValue;
        event.newValue = notiEvent.newValue;

        add(event);
    }

    private static void add(PullRequestEvent event) {
        PullRequestEvent lastEvent = getLatestEventInDraftTime(event);
        if (needToDeleteEvent(lastEvent, event)) {
            lastEvent.delete();
        } else {
            event.save();
        }
    }

    private static PullRequestEvent getLatestEventInDraftTime(PullRequestEvent event) {
        Date draftDate = DateTime.now().minusMillis(EventConstants.DRAFT_TIME_IN_MILLIS).toDate();

        return PullRequestEvent.finder.where().eq("pull_request_id", event.pullRequest.id).gt("created", draftDate)
                .orderBy("created desc").setMaxRows(1).findUnique();
    }

    private static boolean needToDeleteEvent(PullRequestEvent lastEvent, PullRequestEvent currentEvent) {
        return lastEvent != null && currentEvent.eventType == EventType.PULL_REQUEST_REVIEW_STATE_CHANGED
                && lastEvent.eventType == EventType.PULL_REQUEST_REVIEW_STATE_CHANGED
                && StringUtils.equals(currentEvent.senderLoginId, lastEvent.senderLoginId);
    }

    public static void addStateEvent(User sender, PullRequest pullRequest, State state) {
        PullRequestEvent event = new PullRequestEvent();
        event.created = JodaDateUtil.now();
        event.senderLoginId = sender.loginId;
        event.pullRequest = pullRequest;
        event.eventType = EventType.PULL_REQUEST_STATE_CHANGED;
        event.newValue = state.state();

        event.save();
    }

    public static void addMergeEvent(User sender, EventType eventType, State state, PullRequest pullRequest) {
        PullRequestEvent event = new PullRequestEvent();
        event.created = new Date();
        event.senderLoginId = sender.loginId;
        event.pullRequest = pullRequest;
        event.eventType = eventType;
        event.newValue = state.state();

        event.save();
    }

    public static void addCommitEvents(User sender, PullRequest pullRequest, List<PullRequestCommit> commits,
            String oldValue) {
        Date createdDate = new Date();
        PullRequestEvent event = new PullRequestEvent();
        event.created = createdDate;
        event.senderLoginId = sender.loginId;
        event.pullRequest = pullRequest;
        event.eventType = EventType.PULL_REQUEST_COMMIT_CHANGED;
        event.newValue = StringUtils.EMPTY;
        event.oldValue = oldValue;

        for (int i = 0; i < commits.size(); i++) {
            event.newValue += commits.get(i).id;
            if (i != commits.size() - 1) {
                event.newValue += PullRequest.DELIMETER;
            }
        }

        event.save();
    }

    public static List<PullRequestEvent> findByPullRequest(PullRequest pullRequest) {
        return finder.where().eq("pullRequest", pullRequest).findList();
    }

    @Transient
    public List<PullRequestCommit> getPullRequestCommits() {
        List<PullRequestCommit> commits = new ArrayList<>();

        String[] commitIds = this.newValue.split(PullRequest.DELIMETER);
        for (String commitId : commitIds) {
            commits.add(PullRequestCommit.findById(commitId));
        }

        Collections.sort(commits, TimelineItem.DESC);

        return commits;
    }
}