org.bisen.chatamari.service.BlogService.java Source code

Java tutorial

Introduction

Here is the source code for org.bisen.chatamari.service.BlogService.java

Source

/*
 * Copyright 2014 asikprad.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.bisen.chatamari.service;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.dbcp.BasicDataSource;
import org.bisen.chatamari.model.Blog;
import org.bisen.chatamari.model.BlogUser;
import org.bisen.chatamari.model.ElasticBlog;
import org.bisen.chatamari.repository.elasticsearch.ElasticBlogRepository;
import org.bisen.chatamari.repository.springdatajpa.BlogRepository;
import org.bisen.chatamari.repository.springdatajpa.UserRepository;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.base.Strings;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.highlight.HighlightBuilder;
import org.jooq.DSLContext;
import org.jooq.impl.DSL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.DefaultEntityMapper;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.EntityMapper;
import org.springframework.data.elasticsearch.core.FacetedPage;
import org.springframework.data.elasticsearch.core.FacetedPageImpl;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author asikprad
 */
@Service("blogService")
public class BlogService {

    @Autowired
    @Qualifier("blogRepository")
    private BlogRepository blogRepository;

    @Autowired
    @Qualifier("userRepository")
    private UserRepository userRepository;

    @Autowired(required = false)
    @Qualifier("elasticBlogRepository")
    private ElasticBlogRepository elasticBlogRepository;

    @Autowired
    DSLContext create;
    @Autowired
    @Qualifier("dataSource")
    private BasicDataSource dataSource;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Transactional(readOnly = true)
    public Blog find(int blogId) throws DataAccessException {
        return blogRepository.findOne(blogId);
    }

    @Transactional
    private Blog saveToDatabase(Blog blog) {
        return blogRepository.save(blog);
    }

    @Transactional
    private ElasticBlog saveToElastic(Blog blog) {
        return elasticBlogRepository.save(new ElasticBlog.Builder(blog).build());
    }

    public ElasticBlog save(Blog blog) throws DataAccessException {
        Blog databaseBlog = saveToDatabase(blog);
        return saveToElastic(databaseBlog);
    }

    @Transactional
    public BlogUser saveUser(BlogUser user) throws DataAccessException {
        return userRepository.save(user);
    }

    @Transactional(readOnly = true)
    public BlogUser findUser(String email) throws DataAccessException {
        String sql = create.select().from(DSL.tableByName("user")).where(DSL.fieldByName("email").eq(email))
                .getSQL();
        JdbcTemplate template = new JdbcTemplate(dataSource);
        BlogUser user = template.query(sql, new Object[] { email },
                (ResultSet rs) -> rs.next() ? new BlogUser(rs.getString("email"), rs.getString("full_name"))
                        : null);
        return user;
    }

    @Transactional(readOnly = true)
    public Page<ElasticBlog> findAll(Pageable pageable) throws DataAccessException {
        return elasticBlogRepository.findAll(pageable);
    }

    @Transactional(readOnly = true)
    public Page<ElasticBlog> moreLikeThis(String id) {
        MoreLikeThisQuery query = new MoreLikeThisQuery();
        query.setId(id);
        query.addFields("strippedContent");
        query.setMinDocFreq(1);
        return elasticsearchTemplate.moreLikeThis(query, ElasticBlog.class);

    }

    @Transactional(readOnly = true)
    public Page<ElasticBlog> search(String query, Pageable pageable) throws DataAccessException {

        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryString(query))
                .withPageable(pageable).withHighlightFields(new HighlightBuilder.Field("strippedContent"),
                        new HighlightBuilder.Field("title"))
                .build();
        Page<ElasticBlog> pageResult = elasticsearchTemplate.queryForPage(searchQuery, ElasticBlog.class,
                new SearchResultMapper() {

                    @Override
                    public <T> FacetedPage<T> mapResults(SearchResponse response, Class<T> clazz,
                            Pageable pageable) {
                        List<ElasticBlog> blogs = new ArrayList<>();
                        for (SearchHit hit : response.getHits()) {
                            if (response.getHits().getHits().length <= 0) {
                                return null;
                            }
                            ElasticBlog blog = new ElasticBlog();
                            blog.setId(Integer.parseInt(hit.getId()));
                            blog.setContent((String) hit.getSource().get("content"));
                            blog.setCreatedByEmail((String) hit.getSource().get("createdByEmail"));
                            blog.setCreatedDate(hit.getSource().get("createdDate") != null
                                    ? new Date((long) hit.getSource().get("createdDate"))
                                    : null);
                            blog.setLastModifiedByEmail((String) hit.getSource().get("createdModifiedEmail"));
                            blog.setLastModifiedDate(hit.getSource().get("lastModifiedDate") != null
                                    ? new Date((long) hit.getSource().get("lastModifiedDate"))
                                    : null);
                            blog.setTags((ArrayList<String>) hit.getSource().get("tags"));
                            blog.setTitle((String) hit.getSource().get("title"));
                            if (hit.getHighlightFields() != null) {
                                if (hit.getHighlightFields().get("strippedContent") != null) {
                                    blog.setHighlightedString(
                                            hit.getHighlightFields().get("strippedContent").fragments()[0]
                                                    .toString());
                                } else {
                                    blog.setHighlightedString(
                                            hit.getHighlightFields().get("title").fragments()[0].toString());
                                }

                            }

                            blogs.add(blog);
                        }
                        if (blogs.size() > 0) {
                            FacetedPage<T> page = new FacetedPageImpl<>((List<T>) blogs);
                            return page;
                        }
                        return null;
                    }
                });
        return pageResult;
    }

}