Skip to content
Snippets Groups Projects
ImageService.java 4.35 KiB
package NTNU.IDATT1002.service;
import NTNU.IDATT1002.models.*;
import NTNU.IDATT1002.repository.*;
import NTNU.IDATT1002.service.filters.ImageFilter;
import NTNU.IDATT1002.utils.ImageUtil;
import NTNU.IDATT1002.utils.MetaDataExtractor;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * Image service
 * @author Stian Mogen, Eirik Steira, madslun
 * @version 1.0 22.03.2020
 */

public class ImageService {

    private ImageRepository imageRepository;
    private MetadataRepository metadataRepository;
    private TagRepository tagRepository;
    private HistorgramRepository historgramRepository;
    private GeoLocatioRepository geoLocatioRepository;
    private MetaDataExtractor metaDataExtractor;

    /**
     * Inject entity manager instance to the repositories.
     */
    public ImageService() {
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication");
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        this.imageRepository = new ImageRepository(entityManager);
        this.metadataRepository = new MetadataRepository(entityManager);
        this.tagRepository = new TagRepository(entityManager);
        this.historgramRepository = new HistorgramRepository(entityManager);
        this.geoLocatioRepository = new GeoLocatioRepository(entityManager);
        this.metaDataExtractor = new MetaDataExtractor();

    }

    /**
     * Creates a new image from the input File
     *
     * @param user the user of the image
     * @param file the file uploaded
     * @return Optional containing the saved image
     */
    public Optional<Image> createImage(User user, File file, ArrayList<Tag> tags) {

        GeoLocation geoLocation = metaDataExtractor.getGeoLocation(file);
        Histogram histogram = metaDataExtractor.getHistogram(file);

        Image image = new Image();
        Metadata metadata = new Metadata();
        metadata.setImage(image);
        image.setMetadata(metadata);

        metadata.setGeoLocation(geoLocation);
        geoLocation.setMetadata(metadata);

        metadata.setHistogram(histogram);
        histogram.setMetadata(metadata);
        System.out.println(metadata.getGeoLocation().getLatitude());
        System.out.println(metadata.getHistogram().getData());

        byte[] bFile = ImageUtil.convertToBytes(file.getPath());

        //TODO: Add image tags and add image to imageAlbum
        image.setRawImage(bFile);
        image.setUser(user);
        image.setPath(file.getPath());
//        image.addTags(tags);
        return imageRepository.save(image);
    }

    /**
     * Finds each picture belonging to a specific user
     * @param user
     * @return a list with all pictures from a user
     */
    public List<Image> getImageFromUser(User user) {
        return imageRepository.findAllByUsername(user.getUsername());
    }

    /**
     * Retrieves all images.
     *
     * @return list of all images.
     */
    public List<Image> getAllImages() {
        return imageRepository.findAll();
    }

    /**
     *  Adds the given tag to the given image album.
     *
     * @param image the image album to add the tag to
     * @param tag the tag to add
     * @return the updated image album
     */

    public Optional<Image> addTagToImage(Image image, Tag tag) {
        Image foundImage = imageRepository.findById(image.getId())
                .orElseThrow(IllegalArgumentException::new);
        Tag foundTag = tagRepository.findOrCreate(tag)
                .orElseThrow(IllegalArgumentException::new);

        foundImage.addTag(foundTag);

        return imageRepository.save(foundImage);
    }

    /**
     * Search all images by tags specified in {@link ImageFilter#filter(String)}.
     *
     * @param query the query to filter by
     * @return list of images matching the query
     */

    //This search method is for futureproofing, when we will search using additional parameters than just tags
    public List<Image> searchImageAlbums(String query) {
        List<Image> allImages = imageRepository.findAll();
        return allImages.stream()
                .filter(ImageFilter.filter(query))
                .collect(Collectors.toList());
    }
}