com.orange.clara.pivotaltrackermirror.controllers.MirrorReferenceController.java Source code

Java tutorial

Introduction

Here is the source code for com.orange.clara.pivotaltrackermirror.controllers.MirrorReferenceController.java

Source

package com.orange.clara.pivotaltrackermirror.controllers;

import com.google.common.collect.Lists;
import com.orange.clara.pivotaltrackermirror.exceptions.CannotFindConverterException;
import com.orange.clara.pivotaltrackermirror.exceptions.ConvertException;
import com.orange.clara.pivotaltrackermirror.job.MirrorJob;
import com.orange.clara.pivotaltrackermirror.model.MirrorReference;
import com.orange.clara.pivotaltrackermirror.model.request.MirrorReferenceRequest;
import io.swagger.annotations.ApiOperation;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.net.URI;
import java.util.Date;

/**
 * Copyright (C) 2016 Orange
 * <p>
 * This software is distributed under the terms and conditions of the 'Apache-2.0'
 * license which can be found in the file 'LICENSE' in this package distribution
 * or at 'https://opensource.org/licenses/Apache-2.0'.
 * <p>
 * Author: Arthur Halet
 * Date: 15/07/2016
 */
@RestController
@RequestMapping("/api/mirrorReferences")
public class MirrorReferenceController extends AbstractController {

    @Autowired
    @Qualifier("appUrl")
    private String appUrl;
    @Autowired
    @Qualifier("refreshMirrorMinutes")
    private Integer refreshMirrorMinutes;

    @ApiOperation(value = "Register a mirror reference", response = MirrorReference.class)
    @RequestMapping(method = RequestMethod.POST, value = "", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> register(@RequestBody MirrorReferenceRequest mirrorReferenceRequest)
            throws ConvertException, CannotFindConverterException, SchedulerException {
        MirrorReference mirrorReference = mirrorReferenceRequest.toMirrorReference();
        mirrorReference.setUpdatedAt(null);
        mirrorReference = this.mirrorReferenceRepo.save(mirrorReference);
        JobDetail job = JobBuilder.newJob(MirrorJob.class)
                .withIdentity(MirrorJob.JOB_KEY_NAME + mirrorReference.getId(), MirrorJob.JOB_KEY_GROUP)
                .usingJobData(MirrorJob.JOB_MIRROR_REFERENCE_ID_KEY, String.valueOf(mirrorReference.getId()))
                .usingJobData(MirrorJob.JOB_MIRROR_TOKEN_KEY, mirrorReferenceRequest.getToken()).build();
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(MirrorJob.TRIGGER_KEY_NAME + mirrorReference.getId(), MirrorJob.TRIGGER_KEY_GROUP)
                .startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInMinutes(refreshMirrorMinutes).repeatForever())
                .build();
        scheduler.scheduleJob(job, trigger);
        return ResponseEntity.created(URI.create(appUrl + "/api/task/" + mirrorReference.getId() + "/status"))
                .body(mirrorReference);
    }

    @ApiOperation(value = "Get a specific mirror referenced by its id", response = MirrorReference.class)
    @RequestMapping(method = RequestMethod.GET, value = "/{id:[0-9]*}", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> get(@PathVariable Integer id) {
        MirrorReference mirrorReference = this.mirrorReferenceRepo.findOne(id);
        if (mirrorReference == null) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(mirrorReference);
    }

    @ApiOperation(value = "Retrieve all mirrors registered", response = MirrorReference.class, responseContainer = "List")
    @RequestMapping(method = RequestMethod.GET, value = "", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> getAll() {
        return ResponseEntity.ok(Lists.newArrayList(this.mirrorReferenceRepo.findAll()));
    }

    @ApiOperation("Delete a specific mirror referenced by its id")
    @RequestMapping(method = RequestMethod.DELETE, value = "/{id:[0-9]*}", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> delete(@PathVariable Integer id) throws SchedulerException {
        MirrorReference mirrorReference = this.mirrorReferenceRepo.findOne(id);
        if (mirrorReference == null) {
            return ResponseEntity.notFound().build();
        }
        scheduler.deleteJob(new JobKey(MirrorJob.JOB_KEY_NAME + mirrorReference.getId(), MirrorJob.JOB_KEY_GROUP));
        this.mirrorReferenceRepo.delete(mirrorReference);
        return ResponseEntity.noContent().build();
    }

    @ApiOperation("Force the app to refresh all stories inside a specific mirror")
    @RequestMapping(method = RequestMethod.GET, value = "/{id:[0-9]*}/force-update", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> forceUpdate(@PathVariable Integer id) throws SchedulerException {
        MirrorReference mirrorReference = this.mirrorReferenceRepo.findOne(id);
        if (mirrorReference == null) {
            return ResponseEntity.notFound().build();
        }
        mirrorReference.setUpdatedAt(new Date(0L));
        this.mirrorReferenceRepo.save(mirrorReference);
        JobKey jobKey = new JobKey(MirrorJob.JOB_KEY_NAME + id, MirrorJob.JOB_KEY_GROUP);
        scheduler.triggerJob(jobKey);
        return ResponseEntity.accepted().build();
    }
}