Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @RequiresCapability(WorkInProgressCapability.WORK_IN_PROGRESS)
- class WorkInProgressAction implements UiAction<ChangeResource>,
- RestModifyView<ChangeResource, WorkInProgressAction.Input> {
- private static final Logger log = LoggerFactory
- .getLogger(WorkInProgressAction.class);
- static class Input {
- String message;
- }
- private final Provider<ReviewDb> dbProvider;
- @Inject
- WorkInProgressAction(Provider<ReviewDb> dbProvider) {
- this.dbProvider = dbProvider;
- }
- @Override
- public String apply(ChangeResource rsrc, Input input)
- throws ResourceConflictException {
- ChangeControl control = rsrc.getControl();
- if (!control.getCurrentUser().isIdentifiedUser()) {
- throw new AuthException("not permitted to modify change status");
- }
- IdentifiedUser caller = (IdentifiedUser) control.getCurrentUser();
- Change change = rsrc.getChange();
- if (change.getStatus() != Status.NEW) {
- throw new ResourceConflictException("change is " + status(change));
- }
- ChangeMessage message;
- ReviewDb db = dbProvider.get();
- db.changes().beginTransaction(change.getId());
- try {
- change = db.changes().atomicUpdate(
- change.getId(),
- new AtomicUpdate<Change>() {
- @Override
- public Change update(Change change) {
- if (change.getStatus() == Status.NEW) {
- change.setStatus(Status.WORKINPROGRESS);
- ChangeUtil.updated(change);
- return change;
- }
- return null;
- }
- });
- if (change == null) {
- throw new ResourceConflictException("change is "
- + status(db.changes().get(rsrc.getChange().getId())));
- }
- // TODO(davido): Do we need to reindex that change?
- //indexer.index(change);
- message = newMessage(input, caller, change);
- db.changeMessages().insert(Collections.singleton(message));
- new ApprovalsUtil(db).syncChangeStatus(change);
- db.commit();
- } finally {
- db.rollback();
- }
- try {
- ReplyToChangeSender cm = restoredSenderFactory.create(change);
- cm.setFrom(caller.getAccountId());
- cm.setChangeMessage(message);
- cm.send();
- } catch (Exception e) {
- log.error("Cannot email update for change " + change.getChangeId(), e);
- }
- return String.format("changed");
- }
- @Override
- public Description getDescription(ChangeResource resource) {
- return new Description()
- .setLabel("Work In Progress")
- .setTitle("Set Work In Progress");
- }
- private ChangeMessage newMessage(Input input, IdentifiedUser caller,
- Change change) throws OrmException {
- StringBuilder msg = new StringBuilder(
- "Change "
- + change.getId().get()
- + ": Work In Progress");
- if (!Strings.nullToEmpty(input.message).trim().isEmpty()) {
- msg.append("\n\n");
- msg.append(input.message.trim());
- }
- ChangeMessage message = new ChangeMessage(
- new ChangeMessage.Key(
- change.getId(),
- ChangeUtil.messageUUID(dbProvider.get())),
- caller.getAccountId(),
- change.getLastUpdatedOn(),
- change.currentPatchSetId());
- message.setMessage(msg.toString());
- return message;
- }
- private static String status(Change change) {
- return change != null
- ? change.getStatus().name().toLowerCase()
- : "deleted";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment