View Javadoc
1   package org.argeo.maintenance;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   import java.util.Map;
6   
7   import javax.naming.InvalidNameException;
8   import javax.naming.ldap.LdapName;
9   import javax.transaction.UserTransaction;
10  
11  import org.apache.commons.logging.Log;
12  import org.apache.commons.logging.LogFactory;
13  import org.osgi.service.useradmin.Role;
14  import org.osgi.service.useradmin.UserAdmin;
15  
16  /**
17   * Register one or many roles via a user admin service. Does nothing if the role
18   * is already registered.
19   */
20  public class SimpleRoleRegistration implements Runnable {
21  	private final static Log log = LogFactory.getLog(SimpleRoleRegistration.class);
22  
23  	private String role;
24  	private List<String> roles = new ArrayList<String>();
25  	private UserAdmin userAdmin;
26  	private UserTransaction userTransaction;
27  
28  	@Override
29  	public void run() {
30  		try {
31  			userTransaction.begin();
32  			if (role != null && !roleExists(role))
33  				newRole(toDn(role));
34  
35  			for (String r : roles)
36  				if (!roleExists(r))
37  					newRole(toDn(r));
38  			userTransaction.commit();
39  		} catch (Exception e) {
40  			try {
41  				userTransaction.rollback();
42  			} catch (Exception e1) {
43  				log.error("Cannot rollback", e1);
44  			}
45  			throw new IllegalArgumentException("Cannot add roles", e);
46  		}
47  	}
48  
49  	private boolean roleExists(String role) {
50  		return userAdmin.getRole(toDn(role).toString()) != null;
51  	}
52  
53  	protected void newRole(LdapName r) {
54  		userAdmin.createRole(r.toString(), Role.GROUP);
55  		log.info("Added role " + r + " required by application.");
56  	}
57  
58  	public void register(UserAdmin userAdminService, Map<?, ?> properties) {
59  		this.userAdmin = userAdminService;
60  		run();
61  	}
62  
63  	protected LdapName toDn(String name) {
64  		try {
65  			return new LdapName("cn=" + name + ",ou=roles,ou=node");
66  		} catch (InvalidNameException e) {
67  			throw new IllegalArgumentException("Badly formatted role name " + name, e);
68  		}
69  	}
70  
71  	public void setRole(String role) {
72  		this.role = role;
73  	}
74  
75  	public void setRoles(List<String> roles) {
76  		this.roles = roles;
77  	}
78  
79  	public void setUserAdmin(UserAdmin userAdminService) {
80  		this.userAdmin = userAdminService;
81  	}
82  
83  	public void setUserTransaction(UserTransaction userTransaction) {
84  		this.userTransaction = userTransaction;
85  	}
86  
87  }