001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.kim.service.dao.impl;
017
018import org.kuali.rice.core.api.membership.MemberType;
019import org.kuali.rice.kew.api.KewApiConstants;
020import org.kuali.rice.kim.api.KimConstants;
021import org.kuali.rice.kim.api.group.Group;
022import org.kuali.rice.kim.api.identity.name.EntityName;
023import org.kuali.rice.krad.util.KRADConstants;
024import org.springframework.dao.DataAccessException;
025import org.springframework.jdbc.core.JdbcTemplate;
026import org.springframework.jdbc.core.PreparedStatementCallback;
027import org.springframework.jdbc.core.PreparedStatementCreator;
028import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
029import org.kuali.rice.kim.service.dao.UiDocumentServiceDAO;
030
031import javax.sql.DataSource;
032import java.sql.Connection;
033import java.sql.PreparedStatement;
034import java.sql.ResultSet;
035import java.sql.SQLException;
036import java.util.HashMap;
037import java.util.Map;
038
039/**
040 * Spring JdbcTemplate implementation of UiDocumentServiceDAO
041 *
042 * @author Kuali Rice Team (rice.collab@kuali.org)
043 *
044 */
045public class UiDocumentServiceDAOJdbcImpl implements UiDocumentServiceDAO {
046
047    public static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(UiDocumentServiceDAOJdbcImpl.class);
048
049    private DataSource dataSource;
050
051    public void setDataSource(DataSource dataSource) {
052        this.dataSource = new TransactionAwareDataSourceProxy(dataSource);
053    }
054
055    @Override
056    public Map<String, Group> findGroupsForRole(final String roleId) {
057        final Map<String, Group> roleGroupMembers = new HashMap<String, Group>();
058
059        JdbcTemplate template = new JdbcTemplate(dataSource);
060        Map<String, Group> results  = template.execute(new PreparedStatementCreator() {
061
062            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
063
064                String sql = " SELECT GRP_ID, GRP_NM, NMSPC_CD, KIM_TYP_ID, ACTV_IND" +
065                    " FROM KRIM_GRP_T G, KRIM_ROLE_MBR_T RM WHERE" +
066                    " G.GRP_ID = RM.MBR_ID AND GRP_ID IN" +
067                    " (SELECT MBR_ID FROM KRIM_ROLE_MBR_T WHERE MBR_TYP_CD = '" +
068                    MemberType.GROUP.getCode() + "' AND ROLE_ID = '" + roleId + "')";
069
070                    LOG.debug("Query to find Entity Names for role " + roleId + ":" + sql);
071
072                PreparedStatement statement = connection.prepareStatement(sql);
073                return statement;
074            }
075        }, new PreparedStatementCallback<Map<String,Group>>() {
076            public Map<String,Group> doInPreparedStatement(
077                PreparedStatement statement) throws SQLException, DataAccessException {
078                    ResultSet rs = statement.executeQuery();
079                    try {
080                        while (rs.next()) {
081
082                            String groupId = rs.getString(1);
083                            String groupName = rs.getString(2);
084                            String groupNameSpace = rs.getString(3);
085                            String kimTypeId = rs.getString(4);
086                            String activeInd = rs.getString(5);
087                            Group.Builder builder = Group.Builder.create(groupNameSpace, groupName, kimTypeId);
088                            builder.setId(groupId);
089                            builder.build();
090                            if (activeInd.equalsIgnoreCase(KewApiConstants.ACTIVE_CD)) {
091                                builder.setActive(true);
092                            }
093                            roleGroupMembers.put(groupId, builder.build());
094                        }
095                    } finally {
096                        if (rs != null) {
097                            rs.close();
098                        }
099                    }
100                    return roleGroupMembers;
101                }
102            }
103        );
104        return roleGroupMembers;
105    }
106
107    @Override
108    public Map<String, EntityName> findEntityNamesForRole(final String roleId) {
109        final Map<String, EntityName> entityNamesForPrincipals = new HashMap<String, EntityName>();
110
111        JdbcTemplate template = new JdbcTemplate(dataSource);
112        Map<String, EntityName> results  = template.execute(new PreparedStatementCreator() {
113            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
114
115                String sql = "SELECT EN.ENTITY_NM_ID, EN.ENTITY_ID, EN.FIRST_NM, EN.LAST_NM, EP.SUPPRESS_NM_IND FROM" +
116                    " KRIM_PRNCPL_T KP, KRIM_ENTITY_NM_T EN LEFT JOIN KRIM_ENTITY_PRIV_PREF_T EP" +
117                    " ON EN.ENTITY_ID = EP.ENTITY_ID" +
118                    " WHERE EN.ACTV_IND='" + KewApiConstants.ACTIVE_CD +
119                    "' AND EN.DFLT_IND='"+ KewApiConstants.ACTIVE_CD +
120                    "' AND EN.NM_TYP_CD='"+ KimConstants.NameTypes.PREFERRED +
121                    "' AND EN.ENTITY_ID = KP.ENTITY_ID " +
122                    " AND KP.PRNCPL_ID IN (SELECT MBR_ID FROM KRIM_ROLE_MBR_T WHERE ROLE_ID = '" + roleId + "')";
123                    LOG.debug("Query to find Entity Names for role " + roleId + ":" + sql);
124
125                PreparedStatement statement = connection.prepareStatement(sql);
126                return statement;
127            }
128        }, new PreparedStatementCallback<Map<String,EntityName>>() {
129            public Map<String,EntityName> doInPreparedStatement(
130                PreparedStatement statement) throws SQLException, DataAccessException {
131                    ResultSet rs = statement.executeQuery();
132                    try {
133                        while (rs.next()) {
134                            String id = rs.getString(1);
135                            String entityId = rs.getString(2);
136                            String firstName = rs.getString(3);
137                            String lastName = rs.getString(4);
138                            String suppressName = rs.getString(5);
139                            boolean suppressNameBoolean = false;
140                            if (KRADConstants.YES_INDICATOR_VALUE.equalsIgnoreCase(suppressName))  {
141                                suppressNameBoolean = true;
142                            }
143                            EntityName.Builder builder = EntityName.Builder.create(id, entityId, firstName, lastName, suppressNameBoolean);
144                            builder.setActive(true);
145                            builder.setDefaultValue(true);
146                            EntityName entityName = builder.build();
147                            entityNamesForPrincipals.put(entityName.getEntityId(), entityName);
148                        }
149                    } finally {
150                        if (rs != null) {
151                            rs.close();
152                        }
153                    }
154                        return entityNamesForPrincipals;
155                    }
156                }
157        );
158        return entityNamesForPrincipals;
159    }
160}