+ // POSIX
+ /** Generate path for a new user home */
+ protected String generateHomeDirectory(String username) {
+ String base = homeDirectoryBase;
+ int atIndex = username.indexOf('@');
+ if (atIndex > 0) {
+ String domain = username.substring(0, atIndex);
+ String name = username.substring(atIndex + 1);
+ return base + '/' + firstCharsToPath(domain, 2) + '/' + domain
+ + '/' + firstCharsToPath(name, 2) + '/' + name;
+ } else if (atIndex == 0 || atIndex == (username.length() - 1)) {
+ throw new ArgeoException("Unsupported username " + username);
+ } else {
+ return base + '/' + firstCharsToPath(username, 2) + '/' + username;
+ }
+ }
+
+ protected long max(String attr) {
+ long max;
+ try {
+ List<DirectoryUser> users = doGetRoles(FrameworkUtil
+ .createFilter("(" + attr + "=*)"));
+ max = 1000;
+ for (DirectoryUser user : users) {
+ long uid = Long.parseLong(user.getAttributes().get(attr).get()
+ .toString());
+ if (uid > max)
+ max = uid;
+ }
+ } catch (Exception e) {
+ throw new UserDirectoryException("Cannot get max of " + attr, e);
+ }
+ return max;
+ }
+
+ /**
+ * Creates depth from a string (typically a username) by adding levels based
+ * on its first characters: "aBcD",2 => a/aB
+ */
+ public static String firstCharsToPath(String str, Integer nbrOfChars) {
+ if (str.length() < nbrOfChars)
+ throw new ArgeoException("String " + str
+ + " length must be greater or equal than " + nbrOfChars);
+ StringBuffer path = new StringBuffer("");
+ StringBuffer curr = new StringBuffer("");
+ for (int i = 0; i < nbrOfChars; i++) {
+ curr.append(str.charAt(i));
+ path.append(curr);
+ if (i < nbrOfChars - 1)
+ path.append('/');
+ }
+ return path.toString();
+ }
+