View Javadoc

1   /*
2    * BNLPersistenceFactory.java
3    *
4    * Created on February 3, 2005, 9:52 AM
5    */
6   
7   package gov.bnl.gums;
8   
9   import gov.bnl.gums.hibernate.HibernatePersistenceFactory;
10  import java.util.ArrayList;
11  import java.util.Date;
12  import java.util.Enumeration;
13  import java.util.Iterator;
14  import java.util.List;
15  import java.util.Properties;
16  import java.util.StringTokenizer;
17  import org.apache.commons.logging.Log;
18  import org.apache.commons.logging.LogFactory;
19  import gov.bnl.gums.ldap.LDAPPersistenceFactory;
20  
21  /***
22   *
23   * @author carcassi
24   */
25  public class BNLPersistenceFactory implements PersistenceFactory {
26      
27      private Log log = LogFactory.getLog(BNLPersistenceFactory.class);
28      private HibernatePersistenceFactory mysql = new HibernatePersistenceFactory();
29      private LDAPPersistenceFactory ldap = new LDAPPersistenceFactory();
30      private String name;
31      private Properties properties;
32  
33      /***
34       * Holds value of property synchGroups.
35       */
36      private boolean synchGroups;
37  
38      public UserGroupDB retrieveUserGroupDB(String name) {
39          return mysql.retrieveUserGroupDB(name);
40      }
41  
42      public ManualUserGroupDB retrieveManualUserGroupDB(String name) {
43          return mysql.retrieveManualUserGroupDB(name);
44      }
45  
46      public ManualAccountMapperDB retrieveManualAccountMapperDB(String name) {
47          return mysql.retrieveManualAccountMapperDB(name);
48      }
49  
50      public AccountPoolMapperDB retrieveAccountPoolMapperDB(String name) {
51          StringTokenizer tokens = new StringTokenizer(name, ".");
52          if (!tokens.hasMoreTokens()) {
53              return mysql.retrieveAccountPoolMapperDB(name);
54          }
55          String pool = tokens.nextToken();
56          if (!tokens.hasMoreTokens()) {
57              return mysql.retrieveAccountPoolMapperDB(name);
58          }
59          String group = tokens.nextToken();
60          List secondaryGroups = new ArrayList();
61          while (tokens.hasMoreTokens()) {
62              secondaryGroups.add(tokens.nextToken());
63          }
64          return new BNLAccountPoolMapperDB(pool, group, secondaryGroups);
65      }
66      
67      private class BNLAccountPoolMapperDB implements AccountPoolMapperDB {
68          
69          private AccountPoolMapperDB mysqlDB;
70          private String group;
71          private List secondaryGroups;
72          
73          public BNLAccountPoolMapperDB(String poolname, String group, List secondaryGroups) {
74              this.group = group;
75              this.secondaryGroups = secondaryGroups;
76              mysqlDB = mysql.retrieveAccountPoolMapperDB(poolname);
77          }
78          
79          public void unassignUser(String user) {
80              mysqlDB.unassignUser(user);
81          }
82  
83          public String retrieveAccount(String userDN) {
84              String username = mysqlDB.retrieveAccount(userDN);
85              if (synchGroups) {
86                  assignGroups(username);
87              }
88              return username;
89          }
90          
91          private void assignGroups(String username) {
92              ldap.changeGroupID(username, group);
93              log.trace("Assigned '" + group + "' to '" + username);
94              Iterator iter = secondaryGroups.iterator();
95              while (iter.hasNext()) {
96                  String group = (String) iter.next();
97                  ldap.addToSecondaryGroup(username, group);
98                  log.trace("Assigned secondary group '" + group + "' to '" + username);
99              }
100         }
101 
102         public String assignAccount(String userDN) {
103             String username = mysqlDB.assignAccount(userDN);
104             if (username == null) return null;
105             log.trace("Assigned '" + username + "' to '" + userDN);
106             try {
107                 assignGroups(username);
108                 return username;
109             } catch (RuntimeException e) {
110                 log.trace("Group assignment failed: unassign user", e);
111                 unassignUser(username);
112                 log.trace("User unassigned");
113                 throw e;
114             }
115         }
116 
117         public void addAccount(String account) {
118             mysqlDB.addAccount(account);
119         }
120 
121         public List retrieveUsersNotUsedSince(Date date) {
122             return mysqlDB.retrieveUsersNotUsedSince(date);
123         }
124 
125         public java.util.Map retrieveAccountMap() {
126             return mysqlDB.retrieveAccountMap();
127         }
128         
129     }
130 
131     public String getName() {
132         return name;
133     }
134      
135     public void setName(String name) {
136         this.name = name;
137     }
138 
139     public Properties getProperties() {
140         return this.properties;
141     }
142 
143     public void setProperties(Properties properties) {
144         this.properties = properties;
145         mysql.setProperties(getMySQLProperties());
146         ldap.setProperties(getLDAPProperties());
147     }
148     
149     public Properties getMySQLProperties() {
150         return filterProperties("mysql.");
151     }
152     
153     private Properties filterProperties(String prefix) {
154         Properties filtered = new Properties();
155         Enumeration keys = properties.propertyNames();
156         while (keys.hasMoreElements()) {
157             String name = (String) keys.nextElement();
158             if (name.startsWith(prefix)) {
159                 filtered.setProperty(name.substring(prefix.length()), properties.getProperty(name));
160             }
161         }
162         return filtered;
163     }
164     
165     public Properties getLDAPProperties() {
166         return filterProperties("ldap.");
167     }
168 
169     /***
170      * Getter for property synchGroups.
171      * @return Value of property synchGroups.
172      */
173     public boolean isSynchGroups() {
174 
175         return this.synchGroups;
176     }
177 
178     /***
179      * Setter for property synchGroups.
180      * @param synchGroups New value of property synchGroups.
181      */
182     public void setSynchGroups(boolean synchGroups) {
183 
184         this.synchGroups = synchGroups;
185     }
186    
187 }