com.jagornet.dhcp.db.JdbcDhcpOptionDAO.java Source code

Java tutorial

Introduction

Here is the source code for com.jagornet.dhcp.db.JdbcDhcpOptionDAO.java

Source

/*
 * Copyright 2009-2014 Jagornet Technologies, LLC.  All Rights Reserved.
 *
 * This software is the proprietary information of Jagornet Technologies, LLC. 
 * Use is subject to license terms.
 *
 */

/*
 *   This file JdbcDhcpOptionDAO.java is part of Jagornet DHCP.
 *
 *   Jagornet DHCP 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 3 of the License, or
 *   (at your option) any later version.
 *
 *   Jagornet DHCP 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 Jagornet DHCP.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package com.jagornet.dhcp.db;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

/**
 * The JdbcDhcpOptionDAO implementation class for DhcpOptionDAO interface.
 * 
 * @author A. Gregory Rabil
 */
public class JdbcDhcpOptionDAO extends JdbcDaoSupport implements DhcpOptionDAO {
    private static Logger log = LoggerFactory.getLogger(JdbcDhcpOptionDAO.class);

    /* (non-Javadoc)
     * @see com.jagornet.dhcpv6.db.DhcpOptionDAO#create(com.jagornet.dhcpv6.db.DhcpOption)
     */
    public void create(DhcpOption option) {
        SimpleJdbcInsert insertOption = new SimpleJdbcInsert(getDataSource()).withTableName("dhcpoption")
                .usingGeneratedKeyColumns("id");

        Long iaId = option.getIdentityAssocId();
        Long iaAddrId = option.getIaAddressId();
        Long iaPrefixId = option.getIaPrefixId();

        if ((iaId == null) && (iaAddrId == null) && (iaPrefixId == null)) {
            throw new IllegalStateException("DhcpOption must reference either an IdentityAssoc, an IaAddress");
        }
        if ((iaId != null) && (iaAddrId != null)) {
            throw new IllegalStateException("DhcpOption cannot reference both an IdentityAssoc and an IaAddress");
        }
        if ((iaId != null) && (iaPrefixId != null)) {
            throw new IllegalStateException("DhcpOption cannot reference both an IdentityAssoc and an IaPrefix");
        }
        if ((iaAddrId != null) && (iaPrefixId != null)) {
            throw new IllegalStateException("DhcpOption cannot reference both an IaAddress and an IaPrefix");
        }

        Map<String, Object> parameters = new HashMap<String, Object>(3);
        parameters.put("code", option.getCode());
        parameters.put("value", option.getValue());
        // TODO: verify that the option has only one foreign key
        if (iaId != null) {
            parameters.put("identityassoc_id", iaId);
            insertOption.usingColumns("code", "value", "identityassoc_id");
        } else if (iaAddrId != null) {
            parameters.put("iaaddress_id", iaAddrId);
            insertOption.usingColumns("code", "value", "iaaddress_id");
        } else if (iaPrefixId != null) {
            parameters.put("iaprefix_id", iaAddrId);
            insertOption.usingColumns("code", "value", "iaprefix_id");
        }
        /**
         * Note: see https://issues.apache.org/jira/browse/DERBY-3609
         * "Formally, Derby does not support getGeneratedKeys since 
         * DatabaseMetaData.supportsGetGeneratedKeys() returns false. 
         * However, Statement.getGeneratedKeys() is partially implemented,
         * ... since it will only return a meaningful result when an single 
         * row insert is done with INSERT...VALUES"
         * 
         * Spring has thus provided a workaround as described here:
         * http://jira.springframework.org/browse/SPR-5306
         */
        Number newId = insertOption.executeAndReturnKey(parameters);
        if (newId != null) {
            option.setId(newId.longValue());
        }
    }

    /* (non-Javadoc)
     * @see com.jagornet.dhcpv6.db.DhcpOptionDAO#update(com.jagornet.dhcpv6.db.DhcpOption)
     */
    public void update(DhcpOption option) {
        getJdbcTemplate().update("update dhcpoption set value=? where id=?",
                new Object[] { option.getValue(), option.getId() });
    }

    /* (non-Javadoc)
     * @see com.jagornet.dhcpv6.db.DhcpOptionDAO#deleteById(java.lang.Long)
     */
    public void deleteById(Long id) {
        getJdbcTemplate().update("delete from dhcpoption where id = ?", id);
    }

    /* (non-Javadoc)
     * @see com.jagornet.dhcpv6.db.DhcpOptionDAO#getById()
     */
    public DhcpOption getById(Long id) {
        try {
            return getJdbcTemplate().queryForObject("select * from dhcpoption where id = ?", new OptionRowMapper(),
                    id);
        } catch (EmptyResultDataAccessException ex) {
            log.warn("DhcpOption not found for ID=" + id + ": " + ex);
            return null;
        }
    }

    /* (non-Javadoc)
     * @see com.jagornet.dhcpv6.db.DhcpOptionDAO#findAllByIdentityAssocId(long)
     */
    public List<DhcpOption> findAllByIdentityAssocId(long identityAssocId) {
        return getJdbcTemplate().query("select * from dhcpoption where identityassoc_id = ? order by code",
                new OptionRowMapper(), identityAssocId);
    }

    /* (non-Javadoc)
     * @see com.jagornet.dhcpv6.db.DhcpOptionDAO#findAllByIaAddressId(long)
     */
    public List<DhcpOption> findAllByIaAddressId(long iaAddressId) {
        return getJdbcTemplate().query("select * from dhcpoption where iaaddress_id = ? order by code",
                new OptionRowMapper(), iaAddressId);
    }

    /* (non-Javadoc)
     * @see com.jagornet.dhcpv6.db.DhcpOptionDAO#findAllByIaPrefixId(long)
     */
    public List<DhcpOption> findAllByIaPrefixId(long iaPrefixId) {
        return getJdbcTemplate().query("select * from dhcpoption where iaprefix_id = ? order by code",
                new OptionRowMapper(), iaPrefixId);
    }

    /**
     * The Class OptionRowMapper.
     */
    protected class OptionRowMapper implements RowMapper<DhcpOption> {

        /* (non-Javadoc)
         * @see org.springframework.jdbc.core.simple.RowMapper#mapRow(java.sql.ResultSet, int)
         */
        public DhcpOption mapRow(ResultSet rs, int rowNum) throws SQLException {
            DhcpOption option = new DhcpOption();
            option.setId(rs.getLong("id"));
            option.setCode(rs.getInt("code"));
            option.setValue(rs.getBytes("value"));
            option.setIdentityAssocId(rs.getLong("identityassoc_id"));
            option.setIaAddressId(rs.getLong("iaaddress_id"));
            option.setIaPrefixId(rs.getLong("iaprefix_id"));
            return option;
        }
    }
}