ru.org.linux.spring.dao.MsgbaseDao.java Source code

Java tutorial

Introduction

Here is the source code for ru.org.linux.spring.dao.MsgbaseDao.java

Source

/*
 * Copyright 1998-2016 Linux.org.ru
 *    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 ru.org.linux.spring.dao;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Map;

@Repository
public class MsgbaseDao {
    /**
     * ?  ??   bbcode ? ??
     */
    private static final String QUERY_MESSAGE_TEXT = "SELECT message, markup FROM msgbase WHERE id=?";
    private static final String QUERY_MESSAGE_TEXT_FROM_WIKI = "    select jam_topic_version.version_content "
            + "    from jam_topic, jam_topic_version "
            + "    where jam_topic.current_version_id = jam_topic_version.topic_version_id "
            + "    and jam_topic.topic_id = ?";

    private JdbcTemplate jdbcTemplate;
    private NamedParameterJdbcTemplate namedJdbcTemplate;

    private SimpleJdbcInsert insertMsgbase;

    @Autowired
    public void setDataSource(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
        namedJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);

        insertMsgbase = new SimpleJdbcInsert(dataSource);
        insertMsgbase.setTableName("msgbase");
        insertMsgbase.usingColumns("id", "message");
    }

    @Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
    public void saveNewMessage(String message, int msgid) {
        insertMsgbase.execute(ImmutableMap.<String, Object>of("id", msgid, "message", message));
    }

    public String getMessageTextFromWiki(int topicId) {
        return jdbcTemplate.queryForObject(QUERY_MESSAGE_TEXT_FROM_WIKI, String.class, topicId);
    }

    public MessageText getMessageText(int msgid) {
        return jdbcTemplate.queryForObject(QUERY_MESSAGE_TEXT, new RowMapper<MessageText>() {
            @Override
            public MessageText mapRow(ResultSet resultSet, int i) throws SQLException {
                String text = resultSet.getString("message");
                String markup = resultSet.getString("markup");
                boolean lorcode = !"PLAIN".equals(markup);

                return new MessageText(text, lorcode);
            }
        }, msgid);
    }

    public Map<Integer, MessageText> getMessageText(Collection<Integer> msgids) {
        if (msgids.isEmpty()) {
            return ImmutableMap.of();
        }

        final Map<Integer, MessageText> out = Maps.newHashMapWithExpectedSize(msgids.size());

        namedJdbcTemplate.query("SELECT message, markup, id FROM msgbase WHERE id IN (:list)",
                ImmutableMap.of("list", msgids), new RowCallbackHandler() {
                    @Override
                    public void processRow(ResultSet resultSet) throws SQLException {
                        String text = resultSet.getString("message");
                        String markup = resultSet.getString("markup");
                        boolean lorcode = !"PLAIN".equals(markup);

                        out.put(resultSet.getInt("id"), new MessageText(text, lorcode));
                    }
                });

        return out;
    }

    public void updateMessage(int msgid, String text) {
        namedJdbcTemplate.update("UPDATE msgbase SET message=:message WHERE id=:msgid",
                ImmutableMap.of("message", text, "msgid", msgid));
    }

    public void appendMessage(int msgid, String text) {
        jdbcTemplate.update("UPDATE msgbase SET message=message||? WHERE id=?", text, msgid);
    }
}