Package com.salas.bb.persistence.backend

Source Code of com.salas.bb.persistence.backend.HsqlReadingListsPM

// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: HsqlReadingListsPM.java,v 1.9 2006/05/30 08:25:27 spyromus Exp $
//

package com.salas.bb.persistence.backend;

import com.salas.bb.domain.StandardGuide;
import com.salas.bb.domain.ReadingList;
import com.salas.bb.domain.DirectFeed;
import com.salas.bb.persistence.PersistenceException;
import com.salas.bb.utils.i18n.Strings;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.MessageFormat;

/**
* HSQL manager of reading lists.
*/
final class HsqlReadingListsPM
{
    private static final Logger LOG = Logger.getLogger(HsqlReadingListsPM.class.getName());

    /** Persistence manager context. */
    private final HsqlPersistenceManager context;

    /** Reading list is already in database. */
    private static final String MSG_ALREADY_IN_DB = Strings.error("db.reading.list.is.already.in.database");
    /** Reading list is not in database yet. */
    private static final String MSG_NOT_IN_DB = Strings.error("db.reading.list.is.not.in.database");
    /** Reading list is not specified. */
    private static final String MSG_UNSPECIFIED = Strings.error("unspecified.reading.list");
    /** Reading list has no guide assigned and cannot be saved. */
    private static final String MSG_NO_GUIDE_ASSIGNED = Strings.error("db.no.guide.assigned.to.reading.list");
    /** Reading list has guide assigned which isn't in the database yet. */
    private static final String MSG_GUIDE_TRANSIENT = Strings.error("db.guide.is.transient");

    /**
     * Creates manager.
     *
     * @param aContext context used for communication back.
     */
    public HsqlReadingListsPM(HsqlPersistenceManager aContext)
    {
        context = aContext;
    }

    /**
     * Inserts reading list into database.
     *
     * @param list  reading list to insert.
     *
     * @throws NullPointerException if reading list isn't specified.
     * @throws IllegalStateException if reading list is already in database, if it has no
     *                               guide assigned, or the guide is transient.
     * @throws SQLException if database operation fails.
     */
    public void insertReadingList(ReadingList list)
        throws SQLException
    {
        if (list == null) throw new NullPointerException(MSG_UNSPECIFIED);
        if (list.getID() != -1) throw new IllegalStateException(MSG_ALREADY_IN_DB);

        StandardGuide guide = list.getParentGuide();
        if (guide == null) throw new IllegalStateException(MSG_NO_GUIDE_ASSIGNED);
        if (guide.getID() == -1) throw new IllegalStateException(MSG_GUIDE_TRANSIENT);

        PreparedStatement stmt = context.getPreparedStatement(
            "INSERT INTO READINGLISTS (GUIDEID, TITLE, URL, LASTPOLLTIME, LASTUPDATESERVERTIME," +
                "LASTSYNCTIME)" +
            " VALUES (?, ?, ?, ?, ?, ?)");

        try
        {
            stmt.setLong(1, guide.getID());
            stmt.setString(2, list.getTitle());
            stmt.setString(3, list.getURL().toString());
            stmt.setLong(4, list.getLastPollTime());
            stmt.setLong(5, list.getLastUpdateServerTime());
            stmt.setLong(6, list.getLastSyncTime());

            int rows = stmt.executeUpdate();
            if (rows == 0) throw new SQLException(Strings.error("db.failed.to.insert.row.for.reading.list"));

            list.setID(context.getInsertedID());
        } finally
        {
            stmt.close();
        }
    }

    /**
     * Removes reading list from database.
     *
     * @param list list to remove.
     *
     * @throws NullPointerException if list isn't specified.
     * @throws IllegalStateException if list is not in database.
     * @throws SQLException if database operation fails.
     */
    public void removeReadingList(ReadingList list)
        throws SQLException, PersistenceException
    {
        if (list == null) throw new NullPointerException(MSG_UNSPECIFIED);
        if (list.getID() == -1) throw new IllegalStateException(MSG_NOT_IN_DB);

        PreparedStatement stmt = context.getPreparedStatement(
            "DELETE FROM READINGLISTS WHERE ID=?");

        try
        {
            stmt.setLong(1, list.getID());
            int rows = stmt.executeUpdate();

            if (rows == 0) throw new SQLException(Strings.error("db.failed.to.remove.row.with.reading.list"));
        } finally
        {
            stmt.close();
        }

        // Clear ID's
        list.setID(-1);

        // Remove unlinked feeds
        DirectFeed[] feeds = list.getFeeds();
        for (int i = 0; i < feeds.length; i++)
        {
            DirectFeed feed = feeds[i];
            list.remove(feed);
            context.removeFeedIfNoRefs(feed);
        }
    }

    /**
     * Updates reading list information in database.
     *
     * @param list reading list to update.
     *
     * @throws NullPointerException if reading list isn't specified.
     * @throws IllegalStateException if reading list is not in database.
     * @throws SQLException if database operation fails.
     */
    public void updateReadingList(ReadingList list)
        throws SQLException
    {
        if (list == null) throw new NullPointerException(MSG_UNSPECIFIED);
        if (list.getID() == -1) throw new IllegalStateException(MSG_NOT_IN_DB);

        PreparedStatement stmt = context.getPreparedStatement(
                "UPDATE READINGLISTS SET TITLE=?, URL=?, LASTPOLLTIME=?, LASTSYNCTIME=?, " +
                    "LASTUPDATESERVERTIME=? WHERE ID=?");

        try
        {
            stmt.setString(1, list.getTitle());
            stmt.setString(2, list.getURL().toString());
            stmt.setLong(3, list.getLastPollTime());
            stmt.setLong(4, list.getLastSyncTime());
            stmt.setLong(5, list.getLastUpdateServerTime());
            stmt.setLong(6, list.getID());

            int rows = stmt.executeUpdate();
            if (rows == 0)
            {
                LOG.log(Level.SEVERE, MessageFormat.format(
                    Strings.error("db.hsql.updated.0.rows.at.readinglists.listid.0"),
                    new Object[] { new Long(list.getID()) }));
            }
        } finally
        {
            stmt.close();
        }
    }
}
TOP

Related Classes of com.salas.bb.persistence.backend.HsqlReadingListsPM

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.