/*
* Copyright (C) 2004-2008 Jive Software. All rights reserved.
*
* 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.jivesoftware.xmpp.workgroup.spi.dispatcher;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.util.NotFoundException;
import org.jivesoftware.xmpp.workgroup.UnauthorizedException;
import org.jivesoftware.xmpp.workgroup.UserAlreadyExistsException;
import org.jivesoftware.xmpp.workgroup.Workgroup;
import org.jivesoftware.xmpp.workgroup.dispatcher.BasicDispatcherInfo;
import org.jivesoftware.xmpp.workgroup.dispatcher.DispatcherInfo;
import org.jivesoftware.xmpp.workgroup.dispatcher.DispatcherInfoProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>The Jive default implementation of dispatch info provider relying on any standard
* JDBC database.</p>
*
* @author Derek DeMoro
*/
public class DbDispatcherInfoProvider implements DispatcherInfoProvider {
private static final Logger Log = LoggerFactory.getLogger(DbDispatcherInfoProvider.class);
private static final String INSERT_DISPATCHER =
"INSERT INTO fpDispatcher (name, description, offerTimeout, requestTimeout, queueID) VALUES (?,?,?,?,?)";
private static final String LOAD_DISPATCHER_BY_ID =
"SELECT name, description, offerTimeout, requestTimeout FROM fpDispatcher WHERE queueID=?";
private static final String UPDATE_DISPATCHER =
"UPDATE fpDispatcher SET name=?, description=?, offerTimeout=?, requestTimeout=? WHERE queueID=?";
private static final String DELETE_DISPATCHER =
"DELETE FROM fpDispatcher WHERE queueID=?";
public DbDispatcherInfoProvider() {
}
/**
* Returns the Dispatcher to be used for the given queue.
*
* @param workgroup the owning workgroup.
* @param queueID the id of the queue this dispatcher belongs to.
* @return the Dispatcher.
* @throws NotFoundException thrown if no dispatcher was found.
*/
public DispatcherInfo getDispatcherInfo(Workgroup workgroup, long queueID) throws NotFoundException {
BasicDispatcherInfo userInfo = null;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(LOAD_DISPATCHER_BY_ID);
pstmt.setLong(1, queueID);
rs = pstmt.executeQuery();
if (!rs.next()) {
throw new NotFoundException();
}
userInfo = new BasicDispatcherInfo(workgroup,
queueID,
rs.getString(1), // name
rs.getString(2), // description
rs.getInt(3), // offer timeout
rs.getInt(4)); // request timeout
}
catch (SQLException e) {
throw new NotFoundException("Failed to read dispatcher " + queueID + " from database. " + e.getMessage());
}
catch (NumberFormatException nfe) {
Log.error("WARNING: There was an error parsing the dates " +
"returned from the database. Ensure that they're being stored " +
"correctly.");
throw new NotFoundException("Dispatcher with id "
+ queueID + " could not be loaded from the database.");
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
return userInfo;
}
/**
* Updates a RequestQueues dispatcher.
* @param queueID the id of the queue to update.
* @param info the new DispatcherInfo.
* @throws NotFoundException
* @throws UnauthorizedException
*/
public void updateDispatcherInfo(long queueID, DispatcherInfo info) throws NotFoundException, UnauthorizedException {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(UPDATE_DISPATCHER);
pstmt.setString(1, info.getName());
pstmt.setString(2, info.getDescription());
pstmt.setInt(3, (int)info.getOfferTimeout());
pstmt.setInt(4, (int)info.getRequestTimeout());
pstmt.setLong(5, queueID);
pstmt.executeUpdate();
}
catch (SQLException e) {
Log.error(LocaleUtils.getLocalizedString("admin.error"), e);
throw new UnauthorizedException();
}
finally {
DbConnectionManager.closeConnection(pstmt, con);
}
}
/**
* Adds a new DispathcerInfo to the requestQueue.
* @param queueID the id of the queue to add the Dispatcher to.
* @param info the DispatcherInfo to add.
* @throws UserAlreadyExistsException
* @throws UnauthorizedException
*/
public void insertDispatcherInfo(long queueID, DispatcherInfo info) throws UserAlreadyExistsException, UnauthorizedException {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(INSERT_DISPATCHER);
pstmt.setString(1, info.getName());
pstmt.setString(2, info.getDescription());
pstmt.setInt(3, (int)info.getOfferTimeout());
pstmt.setInt(4, (int)info.getRequestTimeout());
pstmt.setLong(5, queueID);
pstmt.executeUpdate();
}
catch (SQLException e) {
Log.error(LocaleUtils.getLocalizedString("admin.error"), e);
throw new UnauthorizedException();
}
finally {
DbConnectionManager.closeConnection(pstmt, con);
}
}
/**
* Deletes the DispatcherInfo Object from the given RequestQueue.
* @param queueID the id of the RequestQueue.
* @throws UnauthorizedException thrown if the user is not allowed to delete from the db.
*/
public void deleteDispatcherInfo(long queueID) throws UnauthorizedException {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(DELETE_DISPATCHER);
pstmt.setLong(1, queueID);
pstmt.executeUpdate();
}
catch (SQLException e) {
Log.error(LocaleUtils.getLocalizedString("admin.error"), e);
throw new UnauthorizedException();
}
finally {
DbConnectionManager.closeConnection(pstmt, con);
}
}
}