/* * Copyright 2012 Esri. * * 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 com.esri.gpt.server.erosfeed; import com.esri.gpt.framework.context.RequestContext; import com.esri.gpt.framework.security.credentials.CredentialsDeniedException; import com.esri.gpt.framework.security.credentials.UsernameCredential; import com.esri.gpt.framework.security.identity.IdentityAdapter; import com.esri.gpt.framework.security.identity.IdentityException; import com.esri.gpt.framework.security.principal.User; import com.esri.gpt.framework.sql.ManagedConnection; import java.sql.*; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.naming.NamingException; /** * Finds email of the record owner. * Uses identity adapter (typically: LDAP) to find email of the user who owns * the record. */ public class ErosEmailFinder { private static final Logger LOGGER = Logger.getLogger(ErosEmailFinder.class.getCanonicalName()); private HashMap<String, String> emailCache = new HashMap<String, String>(); private RequestContext requestContext; private IdentityAdapter idAdapter; /** * Creates instance of the finder. * @param requestContext request context * @param idAdapter identity adapter */ public ErosEmailFinder(RequestContext requestContext, IdentityAdapter idAdapter) { this.requestContext = requestContext; this.idAdapter = idAdapter; } /** * Finds email of the owner of the record. * @param recordUuid record UUID * @return email address of the owner or empty string if user has no email */ public String findEmail(String recordUuid) { try { String owner = findRecordOwner(recordUuid); return !owner.isEmpty()? getUserEmail(owner): ""; } catch (Exception ex) { LOGGER.log(Level.WARNING, "Error finding record owner email.", ex); return ""; } } private String findRecordOwner(String recordUuid) throws SQLException { ManagedConnection managedConnection = requestContext.getConnectionBroker().returnConnection(""); Connection connection = null; PreparedStatement st = null; ResultSet rs = null; try { connection = managedConnection.getJdbcConnection(); st = connection.prepareStatement("select OWNER from GPT_RESOURCE where DOCUUID=?"); st.setString(1, recordUuid); rs = st.executeQuery(); if (rs.next()) { int ownerId = rs.getInt(1); close(rs); close(st); st = connection.prepareStatement("select USERNAME from GPT_USER where USERID=?"); st.setInt(1, ownerId); rs = st.executeQuery(); if (rs.next()) { return rs.getString(1); } } } finally { close(rs); close(st); requestContext.getConnectionBroker().closeConnection(managedConnection); } return ""; } private void close(ResultSet rs) { if (rs!=null) { try { rs.close(); } catch (SQLException ex) {}; } } private void close(Statement st) { if (st!=null) { try { st.close(); } catch (SQLException ex) {}; } } private String getUserEmail(String userName) throws SQLException, IdentityException, CredentialsDeniedException, NamingException { if (emailCache.containsKey(userName)) { return emailCache.get(userName); } else { UsernameCredential unCredential = new UsernameCredential(userName); User user = new User(); user.setCredentials(unCredential); idAdapter.authenticate(user); idAdapter.readUserProfile(user); String emailAddress = user.getProfile().getEmailAddress(); emailCache.put(userName, emailAddress); return emailAddress; } } }