fi.foyt.fni.gamelibrary.PublicationController.java Source code

Java tutorial

Introduction

Here is the source code for fi.foyt.fni.gamelibrary.PublicationController.java

Source

package fi.foyt.fni.gamelibrary;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.enterprise.context.Dependent;
import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.Query;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.FullTextQuery;

import fi.foyt.fni.persistence.dao.gamelibrary.BookPublicationDAO;
import fi.foyt.fni.persistence.dao.gamelibrary.PublicationAuthorDAO;
import fi.foyt.fni.persistence.dao.gamelibrary.PublicationDAO;
import fi.foyt.fni.persistence.dao.gamelibrary.PublicationFileDAO;
import fi.foyt.fni.persistence.dao.gamelibrary.PublicationImageDAO;
import fi.foyt.fni.persistence.dao.gamelibrary.PublicationTagDAO;
import fi.foyt.fni.persistence.model.common.Language;
import fi.foyt.fni.persistence.model.forum.ForumTopic;
import fi.foyt.fni.persistence.model.gamelibrary.BookPublication;
import fi.foyt.fni.persistence.model.gamelibrary.GameLibraryTag;
import fi.foyt.fni.persistence.model.gamelibrary.Publication;
import fi.foyt.fni.persistence.model.gamelibrary.PublicationAuthor;
import fi.foyt.fni.persistence.model.gamelibrary.PublicationFile;
import fi.foyt.fni.persistence.model.gamelibrary.PublicationImage;
import fi.foyt.fni.persistence.model.gamelibrary.PublicationTag;
import fi.foyt.fni.persistence.model.users.User;
import fi.foyt.fni.utils.search.SearchResult;
import fi.foyt.fni.utils.servlet.RequestUtils;

@Dependent
public class PublicationController {

    @Inject
    private GameLibraryTagController gameLibraryTagController;

    @Inject
    private PublicationDAO publicationDAO;

    @Inject
    private PublicationTagDAO publicationTagDAO;

    @Inject
    private PublicationImageDAO publicationImageDAO;

    @Inject
    private BookPublicationDAO bookPublicationDAO;

    @Inject
    private PublicationFileDAO publicationFileDAO;

    @Inject
    private PublicationAuthorDAO publicationAuthorDAO;

    @Inject
    private FullTextEntityManager fullTextEntityManager;

    /* Publications */

    public Publication findPublicationById(Long id) {
        return publicationDAO.findById(id);
    }

    public Publication findPublicationByUrlName(String urlName) {
        return publicationDAO.findByUrlName(urlName);
    }

    public List<Publication> listAllPublications() {
        return publicationDAO.listAll();
    }

    public List<BookPublication> listBookPublicationsByPublishedAndTags(boolean includeUnpublished,
            String... tags) {
        List<GameLibraryTag> gameLibraryTags = new ArrayList<>();

        for (String tag : tags) {
            gameLibraryTags.add(gameLibraryTagController.findTagByText(tag));
        }

        return listBookPublicationsByPublishedAndTags(includeUnpublished, gameLibraryTags);
    }

    public List<BookPublication> listBookPublicationsByPublishedAndTags(boolean includeUnpublished,
            List<GameLibraryTag> gameLibraryTags) {
        List<BookPublication> result = new ArrayList<>();

        // TODO: Optimize this

        List<Publication> publications = publicationTagDAO.listPublicationsByGameLibraryTags(gameLibraryTags);
        if (includeUnpublished) {
            for (Publication publication : publications) {
                if (publication instanceof BookPublication) {
                    result.add((BookPublication) publication);
                }
            }

        } else {
            for (Publication publication : publications) {
                if (publication instanceof BookPublication && publication.getPublished()) {
                    result.add((BookPublication) publication);
                }
            }
        }

        return result;
    }

    public List<BookPublication> listRecentBookPublications(int maxRecentPublication) {
        return bookPublicationDAO.listByPublishedOrderByCreated(Boolean.TRUE, 0, maxRecentPublication);
    }

    public List<BookPublication> listUnpublishedBooks() {
        return bookPublicationDAO.listByPublishedOrderByName(Boolean.FALSE);
    }

    public List<BookPublication> listPublishedBooks() {
        return bookPublicationDAO.listByPublishedOrderByName(Boolean.TRUE);
    }

    public List<Publication> listPublishedPublicationsByCreator(User creator) {
        return publicationDAO.listByCreatorAndPublished(creator, Boolean.TRUE);
    }

    public List<Publication> listPublicationsByAuthor(User author) {
        return publicationAuthorDAO.listPublicationsByAuthor(author);
    }

    public List<Publication> listPublishedPublicationsByAuthor(User author) {
        List<Publication> result = new ArrayList<>();
        List<Publication> publications = listPublicationsByAuthor(author);
        for (Publication publication : publications) {
            if (publication.getPublished()) {
                result.add(publication);
            }
        }

        return result;
    }

    public Long countUnpublishedPublicationsByCreator(User user) {
        return publicationDAO.countByCreatorAndPublished(user, Boolean.FALSE);
    }

    public List<SearchResult<Publication>> searchPublications(String text) throws ParseException {
        return searchPublications(text, null);
    }

    public List<SearchResult<Publication>> searchPublications(String text, Integer maxHits) throws ParseException {
        if (StringUtils.isBlank(text)) {
            return null;
        }

        List<SearchResult<Publication>> result = new ArrayList<>();

        String[] criterias = text.replace(",", " ").replaceAll("\\s+", " ").split(" ");

        StringBuilder queryStringBuilder = new StringBuilder();
        queryStringBuilder.append("+(");
        for (int i = 0, l = criterias.length; i < l; i++) {
            String criteria = QueryParser.escape(criterias[i]);
            queryStringBuilder.append(criteria);
            queryStringBuilder.append("*");
            if (i < l - 1)
                queryStringBuilder.append(' ');
        }
        queryStringBuilder.append(") AND +(published:true)");

        Analyzer analyzer = new StandardAnalyzer();
        QueryParser parser = new QueryParser("descriptionPlain", analyzer);
        Query luceneQuery = parser.parse(queryStringBuilder.toString());
        FullTextQuery query = (FullTextQuery) fullTextEntityManager.createFullTextQuery(luceneQuery,
                BookPublication.class);
        @SuppressWarnings("unchecked")
        List<Publication> searchResults = query.getResultList();
        for (Publication searchResult : searchResults) {
            String link = new StringBuilder().append("/gamelibrary/").append(searchResult.getUrlName()).toString();
            result.add(new SearchResult<Publication>(searchResult, searchResult.getName(), link, null, null, null));

            if (maxHits != null && result.size() >= maxHits) {
                return result;
            }
        }

        return result;
    }

    public Publication updatedModified(Publication publication, User modifier, Date modified) {
        publicationDAO.updateModified(publication, modified);
        publicationDAO.updateModifier(publication, modifier);

        return publication;
    }

    public BookPublication updateLicense(BookPublication publication, String licenseUrl) {
        return bookPublicationDAO.updateLicense(publication, licenseUrl);
    }

    public Publication updateDimensions(Publication publication, Integer width, Integer height, Integer depth) {
        publicationDAO.updateWidth(publication, width);
        publicationDAO.updateHeight(publication, height);
        publicationDAO.updateDepth(publication, depth);

        return publication;
    }

    public Publication updateWeight(Publication publication, Double weight) {
        return publicationDAO.updateWeight(publication, weight);
    }

    public Publication updatePublished(Publication publication, Boolean published) {
        return publicationDAO.updatePublished(publication, published);
    }

    public Publication updatePrice(Publication publication, Double price) {
        return publicationDAO.updatePrice(publication, price);
    }

    public Publication updateDescription(Publication publication, String description) {
        return publicationDAO.updateDescription(publication, description);
    }

    public Publication updatePublicationLanguage(Publication publication, Language language) {
        return publicationDAO.updateLanguage(publication, language);
    }

    public Publication updateName(Publication publication, String name) {
        if (!name.equals(publication.getName())) {
            String urlName = createUrlName(publication, name);
            publicationDAO.updateUrlName(publication, urlName);
            return publicationDAO.updateName(publication, name);
        }

        return publication;
    }

    public Publication updatePublicationAuthors(Publication publication, List<User> authors) {
        for (User author : authors) {
            if (publicationAuthorDAO.findByPublicationAndAuthor(publication, author) == null) {
                publicationAuthorDAO.create(publication, author);
            }
        }

        List<PublicationAuthor> removeAuthors = null;
        if (authors.size() > 0) {
            removeAuthors = publicationAuthorDAO.listByPublicationAndAuthorNotIn(publication, authors);
        } else {
            removeAuthors = publicationAuthorDAO.listByPublication(publication);
        }

        for (PublicationAuthor removeAuthor : removeAuthors) {
            publicationAuthorDAO.delete(removeAuthor);
        }

        return publication;
    }

    public Publication updateTags(Publication publication, List<GameLibraryTag> tags) {
        List<GameLibraryTag> addTags = new ArrayList<>(tags);

        Map<Long, PublicationTag> existingTagMap = new HashMap<Long, PublicationTag>();
        List<PublicationTag> existingTags = gameLibraryTagController.listPublicationTags(publication);
        for (PublicationTag existingTag : existingTags) {
            existingTagMap.put(existingTag.getTag().getId(), existingTag);
        }

        for (int i = addTags.size() - 1; i >= 0; i--) {
            GameLibraryTag addTag = addTags.get(i);

            if (existingTagMap.containsKey(addTag.getId())) {
                addTags.remove(i);
            }

            existingTagMap.remove(addTag.getId());
        }

        for (PublicationTag removeTag : existingTagMap.values()) {
            gameLibraryTagController.deletePublicationTag(removeTag);
        }

        for (GameLibraryTag gameLibraryTag : addTags) {
            publicationTagDAO.create(gameLibraryTag, publication);
        }

        return publication;
    }

    public Publication publishPublication(Publication publication) {
        return publicationDAO.updatePublished(publication, Boolean.TRUE);
    }

    public Publication unpublishPublication(Publication publication) {
        return publicationDAO.updatePublished(publication, Boolean.FALSE);
    }

    public Publication updatePublicationDefaultImage(Publication publication, PublicationImage publicationImage) {
        return publicationDAO.updateDefaultImage(publication, publicationImage);
    }

    public Publication updatePublicationForumTopic(Publication publication, ForumTopic forumTopic) {
        return publicationDAO.updateForumTopic(publication, forumTopic);
    }

    public void deletePublication(Publication publication) {
        publicationDAO.updateDefaultImage(publication, null);

        for (PublicationImage publicationImage : listPublicationImagesByPublication(publication)) {
            deletePublicationImage(publicationImage);
        }

        if (publication instanceof BookPublication) {
            deleteBookPublicationDownloableFile((BookPublication) publication);
            deleteBookPublicationPrintableFile((BookPublication) publication);
        }

        for (PublicationTag publicationTag : gameLibraryTagController.listPublicationTags(publication)) {
            gameLibraryTagController.deletePublicationTag(publicationTag);
        }

        List<PublicationAuthor> authors = publicationAuthorDAO.listByPublication(publication);
        for (PublicationAuthor author : authors) {
            publicationAuthorDAO.delete(author);
        }

        publicationDAO.delete(publication);
    }

    /* PublicationImages */

    public PublicationImage createPublicationImage(Publication publication, byte[] content, String contentType,
            User creator) {
        Date now = new Date();
        return publicationImageDAO.create(publication, content, contentType, now, now, creator, creator);
    }

    public PublicationImage findPublicationImageById(Long publicationImageId) {
        return publicationImageDAO.findById(publicationImageId);
    }

    public List<PublicationImage> listPublicationImagesByPublication(Publication publication) {
        return publicationImageDAO.listByPublication(publication);
    }

    public void deletePublicationImage(PublicationImage publicationImage) {
        publicationImageDAO.delete(publicationImage);
    }

    /* BookPublications */

    public BookPublication createBookPublication(User creator, String name, String description, Double price,
            Double authorsShare, PublicationImage defaultImage, Integer height, Integer width, Integer depth,
            Double weight, Integer numberOfPages, String license, List<GameLibraryTag> tags, Language language) {

        Date now = new Date();
        String urlName = createUrlName(name);

        BookPublication bookPublication = bookPublicationDAO.create(name, urlName, description, price, authorsShare,
                defaultImage, now, creator, now, creator, Boolean.FALSE, height, width, depth, weight,
                numberOfPages, license, null, language, 0l, 0l);

        if (tags != null) {
            for (GameLibraryTag tag : tags) {
                publicationTagDAO.create(tag, bookPublication);
            }
        }

        return bookPublication;
    }

    public BookPublication findBookPublicationById(Long id) {
        return bookPublicationDAO.findById(id);
    }

    public BookPublication findBookPublicationByUrlName(String urlName) {
        return bookPublicationDAO.findByUrlName(urlName);
    }

    public BookPublication updateNumberOfPages(BookPublication bookPublication, Integer numberOfPages) {
        return bookPublicationDAO.updateNumberOfPages(bookPublication, numberOfPages);
    }

    public BookPublication updateBookPublicationDownloadCount(BookPublication bookPublication, Long downloadCount) {
        return bookPublicationDAO.updateDownloadCount(bookPublication, downloadCount);
    }

    public BookPublication updateBookPublicationPrintCount(BookPublication bookPublication, Long printCount) {
        return bookPublicationDAO.updatePrintCount(bookPublication, printCount);
    }

    public BookPublication incBookPublicationDownloadCount(BookPublication bookPublication) {
        return updateBookPublicationDownloadCount(bookPublication, bookPublication.getDownloadCount() + 1);
    }

    public BookPublication incBookPublicationPrintCount(BookPublication bookPublication) {
        return updateBookPublicationPrintCount(bookPublication, bookPublication.getPrintCount() + 1);
    }

    public BookPublication deleteBookPublicationDownloableFile(BookPublication bookPublication) {
        PublicationFile downloadableFile = bookPublication.getDownloadableFile();
        if (downloadableFile != null) {
            bookPublicationDAO.updateDownlodableFile(bookPublication, null);
            deletePublicationFile(downloadableFile);
        }

        return bookPublication;
    }

    public BookPublication deleteBookPublicationPrintableFile(BookPublication bookPublication) {
        PublicationFile printableFile = bookPublication.getPrintableFile();
        if (printableFile != null) {
            bookPublicationDAO.updatePrintableFile(bookPublication, null);
            deletePublicationFile(printableFile);
        }

        return bookPublication;
    }

    /* PublicationFile */

    public PublicationFile createPublicationFile(byte[] content, String contentType) {
        return publicationFileDAO.create(content, contentType);
    }

    public void deletePublicationFile(PublicationFile publicationFile) {
        publicationFileDAO.delete(publicationFile);
    }

    public BookPublication setBookPublicationDownloadableFile(BookPublication bookPublication, byte[] content,
            String contentType, User creator) {
        PublicationFile downloadableFile = bookPublication.getDownloadableFile();
        if (downloadableFile == null) {
            downloadableFile = createPublicationFile(content, contentType);
            bookPublicationDAO.updateDownlodableFile(bookPublication, downloadableFile);
        } else {
            publicationFileDAO.updateContent(downloadableFile, content);
            publicationFileDAO.updateContentType(downloadableFile, contentType);
        }

        return (BookPublication) updatedModified(bookPublication, creator, new Date());
    }

    public BookPublication setBookPublicationPrintableFile(BookPublication bookPublication, byte[] content,
            String contentType, User creator) {
        PublicationFile printableFile = bookPublication.getPrintableFile();
        if (printableFile == null) {
            printableFile = createPublicationFile(content, contentType);
            bookPublicationDAO.updatePrintableFile(bookPublication, printableFile);
        } else {
            publicationFileDAO.updateContent(printableFile, content);
            publicationFileDAO.updateContentType(printableFile, contentType);
        }

        return (BookPublication) updatedModified(bookPublication, creator, new Date());
    }

    /* PublicationAuthor */

    public PublicationAuthor createPublicationAuthor(Publication publication, User author) {
        return publicationAuthorDAO.create(publication, author);
    }

    public PublicationAuthor findPublicationAuthorByPublicationAndAuthor(Publication publication, User author) {
        return publicationAuthorDAO.findByPublicationAndAuthor(publication, author);
    }

    public List<PublicationAuthor> listPublicationAuthors(Publication publication) {
        return publicationAuthorDAO.listByPublication(publication);
    }

    public void deletePublicationAuthor(PublicationAuthor publicationAuthor) {
        publicationAuthorDAO.delete(publicationAuthor);
    }

    private String createUrlName(String name) {
        return createUrlName(null, name);
    }

    private String createUrlName(Publication publication, String name) {
        int maxLength = 20;
        int padding = 0;
        do {
            String urlName = RequestUtils.createUrlName(name, maxLength);
            if (padding > 0) {
                urlName = urlName.concat(StringUtils.repeat('_', padding));
            }

            Publication existingPublication = publicationDAO.findByUrlName(urlName);
            if (existingPublication == null) {
                return urlName;
            }

            if (publication != null && existingPublication.getId().equals(existingPublication.getId())) {
                return urlName;
            }

            if (maxLength < name.length()) {
                maxLength++;
            } else {
                padding++;
            }
        } while (true);
    }

}