1
2
3
4
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 }