/*
 * Copyright (c) 2004 Brian McCallister. All Rights Reserved.
 */
package org.skife.gear.service.ojb;

import org.apache.ojb.broker.Identity;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.query.Criteria;
import org.apache.ojb.broker.query.Query;
import org.apache.ojb.broker.query.QueryFactory;
import org.skife.gear.User;
import org.skife.gear.ServiceException;
import org.skife.gear.service.UserDAO;
import org.skife.gear.service.Tx;
import org.skife.gear.service.TxRunner;

public class UserDAOImpl implements UserDAO
{
    private final TxRunner runner;

    public UserDAOImpl(final TxRunner runner)
    {
        this.runner = runner;
    }

    public User insert(final User user) throws ServiceException
    {
        final Tx tx = new Tx()
        {
            public Object execute(final PersistenceBroker broker)
            {
                broker.store(user);
                return null;
            }
        };
        try
        {
            runner.execute(tx);
        }
        catch (Exception e)
        {
            throw new ServiceException("Unable to insert user, " + user, e);
        }
        return user;
    }

    public User findUserById(final Integer id) throws ServiceException
    {
        final Tx tx = new Tx()
        {
            public Object execute(final PersistenceBroker broker)
            {
                final Identity identity = new Identity(User.class, User.class, new Object[] { id });
                return broker.getObjectByIdentity(identity);
            }
        };
        try
        {
            return (User) runner.execute(tx);
        }
        catch (Exception e)
        {
            throw new ServiceException("Unable to locate user", e);
        }
    }

    public User findUserByLogin(final String login) throws ServiceException
    {
        final Tx tx = new Tx()
        {
            public Object execute(final PersistenceBroker broker)
            {
                final Criteria criteria = new Criteria();
                criteria.addEqualTo("login", login);
                final Query query = QueryFactory.newQuery(User.class, criteria);
                return broker.getObjectByQuery(query);
            }
        };
        try
        {
            return (User) runner.execute(tx);
        }
        catch (Exception e)
        {
            throw new ServiceException("System Error Searching for User: " + login, e);
        }
    }
}
