/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.jbpm.services.task.identity;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.kie.api.task.model.Group;
import org.kie.api.task.model.OrganizationalEntity;
import org.kie.internal.task.api.TaskModelProvider;
import org.kie.internal.task.api.UserInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DBUserInfoImpl extends AbstractUserGroupInfo implements UserInfo {
private static final Logger logger = LoggerFactory.getLogger(DBUserInfoImpl.class);
protected static final String DEFAULT_PROPERTIES_NAME = "classpath:/jbpm.user.info.properties";
public static final String DS_JNDI_NAME = "db.ds.jndi.name";
public static final String NAME_QUERY = "db.name.query";
public static final String EMAIL_QUERY = "db.email.query";
public static final String LANG_QUERY = "db.lang.query";
public static final String HAS_EMAIL_QUERY = "db.has.email.query";
public static final String MEMBERS_QUERY = "db.group.mem.query";
private Properties config;
private DataSource ds;
//no no-arg constructor to prevent cdi from auto deploy
public DBUserInfoImpl(boolean activate) {
String propertiesLocation = System.getProperty("jbpm.user.info.properties");
config = readProperties(propertiesLocation, DEFAULT_PROPERTIES_NAME);
init();
}
public DBUserInfoImpl(Properties config) {
this.config = config;
init();
}
protected Connection getConnection() throws SQLException {
return ds.getConnection();
}
private void init() {
if (this.config == null || !this.config.containsKey(DS_JNDI_NAME) ||
!this.config.containsKey(NAME_QUERY) || !this.config.containsKey(EMAIL_QUERY)
|| !this.config.containsKey(MEMBERS_QUERY) || !this.config.containsKey(LANG_QUERY)) {
throw new IllegalArgumentException("All properties must be given ("+ DS_JNDI_NAME + ","
+ NAME_QUERY +"," + EMAIL_QUERY +"," + LANG_QUERY + "," + MEMBERS_QUERY +")");
}
String jndiName = this.config.getProperty(DS_JNDI_NAME, "java:/DefaultDS");
try {
InitialContext ctx = new InitialContext();
ds = (DataSource) ctx.lookup(jndiName);
} catch (Exception e) {
throw new IllegalStateException("Can get data source for DB usergroup callback, JNDI name: " + jndiName, e);
}
}
@Override
public String getDisplayName(OrganizationalEntity entity) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String displayName = null;
try {
conn = ds.getConnection();
ps = conn.prepareStatement(this.config.getProperty(NAME_QUERY));
ps.setString(1, entity.getId());
rs = ps.executeQuery();
if (rs.next()) {
displayName = rs.getString(1);
}
} catch (Exception e) {
logger.error("Error when checking roles in db, parameter: " + entity.getId(), e);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception ex) {
}
}
}
return displayName;
}
@Override
public Iterator<OrganizationalEntity> getMembersForGroup(Group group) {
List<OrganizationalEntity> roles = new ArrayList<OrganizationalEntity>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
ps = conn.prepareStatement(this.config.getProperty(MEMBERS_QUERY));
try {
ps.setString(1, group.getId());
} catch (ArrayIndexOutOfBoundsException ignore) {
}
rs = ps.executeQuery();
while (rs.next()) {
roles.add(TaskModelProvider.getFactory().newUser(rs.getString(1)));
}
} catch (Exception e) {
logger.error("Error when fetching members of a group from db, groups id: ", group.getId(), e);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception ex) {
}
}
}
return roles.iterator();
}
@Override
public boolean hasEmail(Group group) {
boolean result = false;
if (config.containsKey(HAS_EMAIL_QUERY)) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
ps = conn.prepareStatement(this.config.getProperty(HAS_EMAIL_QUERY));
ps.setString(1, group.getId());
rs = ps.executeQuery();
if (rs.next()) {
result = true;
}
} catch (Exception e) {
logger.error("Error when checking roles in db, parameter: " + group.getId(), e);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception ex) {
}
}
}
} else {
String email = getEmailForEntity(group);
if (email != null) {
return true;
}
}
return result;
}
@Override
public String getEmailForEntity(OrganizationalEntity entity) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String emailAddress = null;
try {
conn = ds.getConnection();
ps = conn.prepareStatement(this.config.getProperty(EMAIL_QUERY));
ps.setString(1, entity.getId());
rs = ps.executeQuery();
if (rs.next()) {
emailAddress = rs.getString(1);
}
} catch (Exception e) {
logger.error("Error when fetching email address from db for entity {}", entity.getId(), e);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception ex) {
}
}
}
return emailAddress;
}
@Override
public String getLanguageForEntity(OrganizationalEntity entity) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String language = null;
try {
conn = ds.getConnection();
ps = conn.prepareStatement(this.config.getProperty(LANG_QUERY));
ps.setString(1, entity.getId());
rs = ps.executeQuery();
if (rs.next()) {
language = rs.getString(1);
}
} catch (Exception e) {
logger.error("Error when fetching language for entity {} ", entity.getId(), e);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception ex) {
}
}
}
return language;
}
}