com.google.gerrit.server.notedb.rebuild.StatusChangeEvent.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gerrit.server.notedb.rebuild.StatusChangeEvent.java

Source

// Copyright (C) 2016 The Android Open Source Project
//
// 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 com.google.gerrit.server.notedb.rebuild;

import com.google.common.base.Optional;
import com.google.common.collect.ImmutableMap;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.server.notedb.ChangeUpdate;
import com.google.gwtorm.server.OrmException;

import java.sql.Timestamp;
import java.util.Map;
import java.util.regex.Pattern;

class StatusChangeEvent extends Event {
    private static final ImmutableMap<Change.Status, Pattern> PATTERNS = ImmutableMap.of(Change.Status.ABANDONED,
            Pattern.compile("^Abandoned(\n.*)*$"), Change.Status.MERGED,
            Pattern.compile("^Change has been successfully" + " (merged|cherry-picked|rebased|pushed).*$"),
            Change.Status.NEW, Pattern.compile("^Restored(\n.*)*$"));

    static Optional<StatusChangeEvent> parseFromMessage(ChangeMessage message, Change change, Change noteDbChange) {
        String msg = message.getMessage();
        if (msg == null) {
            return Optional.absent();
        }
        for (Map.Entry<Change.Status, Pattern> e : PATTERNS.entrySet()) {
            if (e.getValue().matcher(msg).matches()) {
                return Optional.of(new StatusChangeEvent(message, change, noteDbChange, e.getKey()));
            }
        }
        return Optional.absent();
    }

    private final Change change;
    private final Change noteDbChange;
    private final Change.Status status;

    private StatusChangeEvent(ChangeMessage message, Change change, Change noteDbChange, Change.Status status) {
        this(message.getPatchSetId(), message.getAuthor(), message.getWrittenOn(), change, noteDbChange,
                message.getTag(), status);
    }

    private StatusChangeEvent(PatchSet.Id psId, Account.Id author, Timestamp when, Change change,
            Change noteDbChange, String tag, Change.Status status) {
        super(psId, author, author, when, change.getCreatedOn(), tag);
        this.change = change;
        this.noteDbChange = noteDbChange;
        this.status = status;
    }

    @Override
    boolean uniquePerUpdate() {
        return true;
    }

    @SuppressWarnings("deprecation")
    @Override
    void apply(ChangeUpdate update) throws OrmException {
        checkUpdate(update);
        update.fixStatus(status);
        noteDbChange.setStatus(status);
        if (status == Change.Status.MERGED) {
            update.setSubmissionId(change.getSubmissionId());
            noteDbChange.setSubmissionId(change.getSubmissionId());
        }
    }
}