nl.surfnet.coin.teams.service.impl.TeamExternalGroupDaoImpl.java Source code

Java tutorial

Introduction

Here is the source code for nl.surfnet.coin.teams.service.impl.TeamExternalGroupDaoImpl.java

Source

/*
 * Copyright 2012 SURFnet bv, The Netherlands
 *
 * 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 nl.surfnet.coin.teams.service.impl;

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

import javax.annotation.Resource;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Component;

import nl.surfnet.coin.teams.domain.ExternalGroup;
import nl.surfnet.coin.teams.domain.TeamExternalGroup;
import nl.surfnet.coin.teams.service.TeamExternalGroupDao;

/**
 * SQL Implementation for {@link TeamExternalGroupDao}
 */
@Component("teamExternalGroupDao")
public class TeamExternalGroupDaoImpl implements TeamExternalGroupDao {

    private static final String IDENTIFIER = "identifier";
    private static final String DESCRIPTION = "description";
    private static final String NAME = "name";
    private static final String GROUP_PROVIDER = "group_provider";
    private static final String GROUPER_TEAM_ID = "grouper_team_id";

    @Resource(name = "teamsJdbcTemplate")
    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate tpl) {
        this.jdbcTemplate = tpl;
    }

    @Override
    public ExternalGroup getExternalGroupByIdentifier(String identifier) {
        Object[] args = { identifier };

        try {
            return this.jdbcTemplate.queryForObject("SELECT * FROM external_groups AS eg WHERE eg.identifier = ?",
                    args, new RowMapper<ExternalGroup>() {
                        @Override
                        public ExternalGroup mapRow(ResultSet rs, int rowNum) throws SQLException {

                            final ExternalGroup e = new ExternalGroup();
                            e.setId(rs.getLong("id"));
                            e.setIdentifier(rs.getString(IDENTIFIER));
                            e.setDescription(rs.getString(DESCRIPTION));
                            e.setName(rs.getString(NAME));
                            e.setGroupProviderIdentifier(rs.getString(GROUP_PROVIDER));
                            return e;
                        }
                    });
        } catch (EmptyResultDataAccessException er) {
            return null;
        }
    }

    @Override
    public List<TeamExternalGroup> getByTeamIdentifier(String identifier) {
        Object[] args = { identifier };

        try {
            String s = "SELECT teg.id AS teg_id, teg.grouper_team_id, eg.id AS eg_id, eg.identifier, eg.name, eg.description, eg.group_provider "
                    + "          FROM team_external_groups AS teg " + "          INNER JOIN external_groups AS eg "
                    + "          ON teg.external_groups_id = eg.id " + "          WHERE teg.grouper_team_id = ? ";
            return this.jdbcTemplate.query(s, args, new RowMapper<TeamExternalGroup>() {
                @Override
                public TeamExternalGroup mapRow(ResultSet rs, int rowNum) throws SQLException {
                    return mapRowToTeamExternalGroup(rs);
                }
            });
        } catch (EmptyResultDataAccessException er) {
            return null;
        }
    }

    @Override
    public List<TeamExternalGroup> getByExternalGroupIdentifier(String identifier) {
        Object[] args = { identifier };

        try {
            String s = "SELECT teg.id AS teg_id, teg.grouper_team_id, eg.id AS eg_id, eg.identifier, eg.name, eg.description, eg.group_provider "
                    + "          FROM team_external_groups AS teg " + "          INNER JOIN external_groups AS eg "
                    + "          ON teg.external_groups_id = eg.id " + "          WHERE eg.identifier = ? ";
            return this.jdbcTemplate.query(s, args, new RowMapper<TeamExternalGroup>() {
                @Override
                public TeamExternalGroup mapRow(ResultSet rs, int rowNum) throws SQLException {
                    return mapRowToTeamExternalGroup(rs);
                }
            });
        } catch (EmptyResultDataAccessException er) {
            return new ArrayList<TeamExternalGroup>();
        }
    }

    @Override
    public TeamExternalGroup getByTeamIdentifierAndExternalGroupIdentifier(String teamId,
            String externalGroupIdentifier) {
        Object[] args = { teamId, externalGroupIdentifier };
        String s = "SELECT teg.id AS teg_id, teg.grouper_team_id, eg.id AS eg_id, eg.identifier, eg.name, eg.description, eg.group_provider "
                + "          FROM team_external_groups AS teg " + "          INNER JOIN external_groups AS eg "
                + "          ON teg.external_groups_id = eg.id "
                + "          WHERE teg.grouper_team_id = ? AND eg.identifier = ?";
        try {
            return this.jdbcTemplate.queryForObject(s, args, new RowMapper<TeamExternalGroup>() {
                @Override
                public TeamExternalGroup mapRow(ResultSet rs, int rowNum) throws SQLException {
                    return mapRowToTeamExternalGroup(rs);
                }
            });
        } catch (EmptyResultDataAccessException er) {
            return null;
        }
    }

    private TeamExternalGroup mapRowToTeamExternalGroup(ResultSet rs) throws SQLException {
        ExternalGroup e = new ExternalGroup();
        e.setId(rs.getLong("eg_id"));
        e.setIdentifier(rs.getString(IDENTIFIER));
        e.setDescription(rs.getString(DESCRIPTION));
        e.setName(rs.getString(NAME));
        e.setGroupProviderIdentifier(rs.getString(GROUP_PROVIDER));

        TeamExternalGroup teg = new TeamExternalGroup();
        teg.setId(rs.getLong("teg_id"));
        teg.setGrouperTeamId(rs.getString(GROUPER_TEAM_ID));
        teg.setExternalGroup(e);
        return teg;
    }

    @Override
    public void saveOrUpdate(TeamExternalGroup teamExternalGroup) {
        final TeamExternalGroup storedTeg = getByTeamIdentifierAndExternalGroupIdentifier(
                teamExternalGroup.getGrouperTeamId(), teamExternalGroup.getExternalGroup().getIdentifier());
        if (storedTeg != null) {
            updateExternalGroupValues(storedTeg.getExternalGroup(), teamExternalGroup.getExternalGroup());
            return;
        }

        ExternalGroup storedEg = getExternalGroupByIdentifier(teamExternalGroup.getExternalGroup().getIdentifier());
        if (storedEg == null) {
            insertExternalGroup(teamExternalGroup.getExternalGroup());
        } else {
            updateExternalGroupValues(storedEg, teamExternalGroup.getExternalGroup());
        }
        storedEg = getExternalGroupByIdentifier(teamExternalGroup.getExternalGroup().getIdentifier());
        teamExternalGroup.setExternalGroup(storedEg);

        Object[] args = { teamExternalGroup.getGrouperTeamId(), teamExternalGroup.getExternalGroup().getId() };
        String s = "INSERT INTO team_external_groups(grouper_team_id, external_groups_id) VALUES (?, ?);";
        this.jdbcTemplate.update(s, args);
    }

    private void insertExternalGroup(ExternalGroup externalGroup) {
        Object[] args = { externalGroup.getDescription(), externalGroup.getGroupProviderIdentifier(),
                externalGroup.getIdentifier(), externalGroup.getName() };

        String s = "INSERT INTO external_groups (description, group_provider, identifier, name) VALUES (?, ?, ?, ?);";
        this.jdbcTemplate.update(s, args);
    }

    private void updateExternalGroupValues(ExternalGroup existing, ExternalGroup newEG) {
        Object[] newVals = { newEG.getName(), newEG.getDescription(), existing.getId() };
        this.jdbcTemplate.update("UPDATE external_groups SET name = ?, description = ? WHERE id = ?", newVals);
    }

    @Override
    public void delete(TeamExternalGroup teamExternalGroup) {
        Object[] args = { teamExternalGroup.getId() };
        final int deleted = this.jdbcTemplate.update("DELETE FROM team_external_groups WHERE id = ?;", args);

        if (deleted == 0) {
            return;
        }

        args[0] = teamExternalGroup.getExternalGroup().getId();

        final int linksToExternalGroup = this.jdbcTemplate
                .queryForInt("SELECT COUNT(id) FROM team_external_groups WHERE external_groups_id = ?;", args);
        if (linksToExternalGroup == 0) {
            this.jdbcTemplate.update("DELETE FROM external_groups WHERE id = ?;", args);
        }
    }

    /* (non-Javadoc)
     * @see nl.surfnet.coin.teams.service.TeamExternalGroupDao#getByExternalGroupIdentifiers(java.util.List)
     */
    @Override
    public List<TeamExternalGroup> getByExternalGroupIdentifiers(Collection<String> identifiers) {
        try {
            NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.jdbcTemplate);
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("identifiers", identifiers);
            String s = "SELECT teg.id AS teg_id, teg.grouper_team_id, eg.id AS eg_id, eg.identifier, eg.name, eg.description, eg.group_provider "
                    + "FROM team_external_groups AS teg " + "INNER JOIN external_groups AS eg "
                    + "ON teg.external_groups_id = eg.id " + "WHERE eg.identifier in (:identifiers) ";
            return template.query(s, params, new RowMapper<TeamExternalGroup>() {
                @Override
                public TeamExternalGroup mapRow(ResultSet rs, int rowNum) throws SQLException {
                    return mapRowToTeamExternalGroup(rs);
                }
            });
        } catch (EmptyResultDataAccessException er) {
            return new ArrayList<TeamExternalGroup>();
        }
    }
}