Initial Version
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / aaLocal / SQLDirContext.java
1 import java.util.*;
2 import java.sql.*;
3 import javax.naming.*;
4 import javax.naming.directory.*;
5
6 public class SQLDirContext extends InitialDirContext{
7
8     Connection con;
9     String uid;
10     String guid;
11     Hashtable id2name;
12
13     public SQLDirContext(Hashtable env)
14         throws NamingException{
15
16         String url = (String)env.get(Context.PROVIDER_URL);
17         String driver = (String)env.get("SQL_DRIVER");
18         String user = (String)env.get("SECURITY_PRINCIPAL");
19         String passwd = (String)env.get("SECURITY_CREDENTIALS");
20         uid = (String)env.get("USER_IDENTIFIER");
21         if(url == null)
22             throw new NamingException("Context.PROVIDER_URL not provided");
23         if(driver == null)
24             throw new NamingException("SQL_DRIVER is required");
25         if(user == null)
26             throw new NamingException("SECURITY_PRINCIPAL is required");
27         if(passwd == null)
28             throw new NamingException("SECURITY_CREDENTIALS is required");
29         if(uid == null)
30             throw new NamingException("USER_IDENTIFIER is required");
31         id2name = new Hashtable();
32
33
34
35         try{
36             Class.forName(driver);
37             con = DriverManager.getConnection(url, user, passwd);
38             // get the small sql table and keep it as a hashtable for performance
39             Statement stmt = con.createStatement();
40             ResultSet rs = stmt.executeQuery("SELECT attr_id,attr_name from danr.person_attributes");       
41             while(rs.next()){
42                 int i = rs.getInt("attr_id");
43                 String n = rs.getString("attr_name");
44                 id2name.put(new Integer(i), n);
45             }
46
47             // find the guid from uid
48             String guidQ1 = "SELECT guid from danr.person_attrib WHERE attr_id = ";
49             String guidQ2 = "(SELECT attr_id from danr.person_attributes where attr_name = 'cmuAndrewId')";
50             String guidQ3 = " AND attr_value = '"+uid+"'";
51
52
53             rs = stmt.executeQuery(guidQ1+guidQ2+guidQ3);
54             rs.next();
55             guid = rs.getString("GUID");
56         }catch(Exception e){
57             throw new NamingException("Failed to create SQLDirContext: "+e);
58         }
59     }
60
61     public Attributes getAttributes(String name,
62                                     String[] attrIds)
63         throws NamingException {
64
65         long aTime = System.currentTimeMillis();
66         String q1 = "select attr_id,attr_value from danr.person_attrib where guid = '";
67         String q2 = "' and attr_id = (select attr_id from danr.person_attributes where attr_name ='";
68         String q3 = "')";
69         StringBuffer buf = new StringBuffer(q1+guid+q2);
70         BasicAttributes attrs = new BasicAttributes();
71         try{
72             int len = attrIds.length;
73
74             String[] attrNames = new String[len];
75             System.arraycopy(attrIds, 0, attrNames, 0, len);
76             Arrays.sort(attrNames);
77
78             for(int i=0; i <len-1; i++)
79                 buf.append(attrIds[i] + "' OR attr_name ='");
80             buf.append(attrIds[len-1]);
81             buf.append(q3);
82
83             Statement stmt = con.createStatement();
84             ResultSet rs = stmt.executeQuery(buf.toString());       
85
86             BasicAttribute[] attrArray = new BasicAttribute[len];
87             for(int i=0; i <len; i++)
88                 attrArray[i] = new BasicAttribute(attrIds[i]);
89
90             while(rs.next()){
91                 int anId = rs.getInt("attr_id");
92                 String aName = (String)id2name.get(new Integer(anId));
93                 Object value = rs.getObject("attr_value");
94                 int indx = Arrays.binarySearch(attrNames, aName);
95                 attrArray[indx].add(value);
96             }
97             
98             for(int i=0; i <len; i++)
99                 attrs.put(attrArray[i]);
100             System.out.print(" ("+(System.currentTimeMillis() - aTime)+" sec)");
101             return attrs;
102         }catch(Exception e){
103             throw new NamingException("Failed to get Attributes: "+e);
104         }
105     }
106 }