com.alehuo.wepas2016projekti.controller.ImageController.java Source code

Java tutorial

Introduction

Here is the source code for com.alehuo.wepas2016projekti.controller.ImageController.java

Source

/*
 * Copyright (C) 2016 Pivotal Software, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.alehuo.wepas2016projekti.controller;

import com.alehuo.wepas2016projekti.domain.Image;
import com.alehuo.wepas2016projekti.domain.UserAccount;
import com.alehuo.wepas2016projekti.service.ImageService;
import com.alehuo.wepas2016projekti.service.UserService;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Kuvakontrolleri
 *
 * @author alehuo
 */
@Controller
@RequestMapping("img")
public class ImageController {

    /**
     * Logger
     */
    private static final Logger LOG = Logger.getLogger(ImageController.class.getName());

    @Autowired
    private ImageService imageService;

    @Autowired
    private UserService userService;

    /**
     * Hakee tietokannasta kuvan. Kuvan hakemisessa hydynnetn ETag
     * -otsaketta.
     *
     * @param a Autentikointi
     * @param imageUuid Kuvan UUID
     * @param ifNoneMatch If-None-Match -headeri vlimuistia varten
     * @return Kuva
     */
    @RequestMapping(value = "/{imageUuid}", method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<byte[]> getImage(Authentication a, @PathVariable String imageUuid,
            @RequestHeader(required = false, value = "If-None-Match") String ifNoneMatch) {
        if (ifNoneMatch != null) {
            //            LOG.log(Level.INFO, "Kuva ''{0}'' loytyy kayttajan selaimen valimuistista eika sita tarvitse ladata. Kuvaa pyysi kayttaja ''{1}''", new Object[]{imageUuid, a.getName()});
            //Jos If-None-Match -headeri lytyy, niin lhet NOT MODIFIED vastaus
            return new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
        }
        Image i = imageService.findOneImageByUuid(imageUuid);
        if (i != null && i.isVisible()) {
            //Luodaan ETag kuvalle
            final HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.parseMediaType(i.getContentType()));
            headers.setContentLength(i.getImageData().length);
            headers.setCacheControl("public");
            headers.setExpires(Long.MAX_VALUE);
            headers.setETag("\"" + imageUuid + "\"");
            //            LOG.log(Level.INFO, "Kuva ''{0}'' loytyi tietokannasta, ja sita pyysi kayttaja ''{1}''", new Object[]{imageUuid, a.getName()});
            //Palautetaan kuva uutena resurssina
            return new ResponseEntity<>(i.getImageData(), headers, HttpStatus.CREATED);
        } else {
            //Jos kuvaa ei lydy tietokannasta
            LOG.log(Level.WARNING, "Kuvaa ''{0}'' ei loytynyt tietokannasta, ja sita pyysi kayttaja ''{1}''",
                    new Object[] { imageUuid, a.getName() });
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    /**
     * Kuvasta tykkys
     *
     * @param a Autentikointi
     * @param imageUuid Kuvan UUID
     * @param redirect Uudelleenohjaus
     * @param req HTTP Request
     * @return Onnistuiko pyynt vai ei (sek sen tyyppi; unlike vai like).
     */
    @RequestMapping(value = "/like", method = RequestMethod.POST)
    public ResponseEntity<String> likeImage(Authentication a, @RequestParam String imageUuid,
            @RequestParam int redirect, HttpServletRequest req) {
        //Kyttjn autentikoiminen
        UserAccount u = userService.getUserByUsername(a.getName());
        final HttpHeaders h = new HttpHeaders();
        //Jos kyttjtili ei ole tyhj
        if (u != null) {
            //Haetaan kuva
            Image i = imageService.findOneImageByUuid(imageUuid);

            //Jos kuva ei ole tyhj
            if (i != null && i.isVisible()) {
                //Lis / poista tykkys tilanteen mukaan
                if (i.getLikedBy().contains(u)) {
                    LOG.log(Level.INFO, "Kayttaja ''{0}'' poisti tykkayksen kuvasta ''{1}''",
                            new Object[] { a.getName(), imageUuid });
                    i.removeLike(u);
                    imageService.saveImage(i);
                    h.add("LikeType", "unlike");
                } else {
                    i.addLike(u);
                    LOG.log(Level.INFO, "Kayttaja ''{0}'' tykkasi kuvasta ''{1}''",
                            new Object[] { a.getName(), imageUuid });
                    imageService.saveImage(i);
                    h.add("LikeType", "like");
                }
                //Uudelleenohjaus
                if (redirect == 1) {
                    h.add("Location", req.getHeader("Referer"));
                    return new ResponseEntity<>(h, HttpStatus.FOUND);
                }
                return new ResponseEntity<>(h, HttpStatus.OK);
            } else {
                //Jos kuvaa ei ole olemassa mutta yritetn silti tykt
                LOG.log(Level.WARNING, "Kayttaja ''{0}'' yritti tykata kuvaa, mita ei ole olemassa. ({1})",
                        new Object[] { a.getName(), imageUuid });
                return new ResponseEntity<>(h, HttpStatus.BAD_REQUEST);
            }
        }
        //Jos ei olla kirjauduttu sisn ja yritetn tykt kuvasta
        LOG.log(Level.WARNING, "Yritettiin tykata kuvaa kirjautumatta sisaan ({0})", a.getName());
        return new ResponseEntity<>(h, HttpStatus.UNAUTHORIZED);
    }
}