/**
  * Loads a database of users from an XML file.
  *
  * @param in - the InputStream containing the XML user file.
  */
 public void readUsers(InputStream in) {
   try {
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     DocumentBuilder db = dbf.newDocumentBuilder();
     Document doc = db.parse(in);
     Element rootElement = doc.getDocumentElement();
     NodeList nodes = rootElement.getChildNodes();
     HashMap userAssigns = new HashMap();
     HashMap roleAssigns = new HashMap();
     boolean isClearTextPassword = true;
     for (int i = 0; i < nodes.getLength(); i++) {
       Node item = nodes.item(i);
       if (item instanceof Element) {
         Element l = (Element) item;
         Map map = readMap(l);
         Set groups = (Set) map.remove(ROLE_ASSIGNMENT);
         if ("user".equals(l.getNodeName())) {
           String pwd = (String) map.get(UserEntries.FIELD_PASSWORD);
           String user = (String) map.get(UserEntries.FIELD_UID);
           if (user == null) {
             _log.warn("No id for user entry");
             continue;
           }
           if (_log.isDebugEnabled()) {
             _log.debug("Adding user " + user + " with password:"******"\\" + user, pwd);
           }
           map.put(UserEntries.FIELD_PASSWORD, pwd);
           _userCache.addUser(user, map);
           if (groups != null) {
             userAssigns.put(user, groups);
           }
         } else if ("role".equals(l.getNodeName())) {
           String role = (String) map.get(UserEntries.FIELD_RID);
           if (role == null) {
             if (_log.isWarnEnabled()) {
               _log.warn("No id for role entry");
             }
             continue;
           }
           _userCache.addRole(role, map);
           if (groups != null) {
             roleAssigns.put(role, groups);
           }
         } else if ("password".equals(l.getNodeName())) {
           String isClearText = (String) map.get(UserEntries.FIELD_IS_CLEAR_TEXT_PASSWORD);
           if (isClearText != null) {
             isClearTextPassword = Boolean.getBoolean(isClearText);
           }
         }
       }
     }
     Iterator assigns = userAssigns.entrySet().iterator();
     while (assigns.hasNext()) {
       Map.Entry entry = (Map.Entry) assigns.next();
       String user = (String) entry.getKey();
       Iterator iter = ((Set) entry.getValue()).iterator();
       while (iter.hasNext()) {
         String group = (String) iter.next();
         _userCache.assign(user, group);
       }
     }
     assigns = roleAssigns.entrySet().iterator();
     while (assigns.hasNext()) {
       Map.Entry entry = (Map.Entry) assigns.next();
       String role = (String) entry.getKey();
       Iterator iter = ((Set) entry.getValue()).iterator();
       while (iter.hasNext()) {
         String group = (String) iter.next();
         _userCache.addRoleToRole(role, group);
       }
     }
   } catch (ParserConfigurationException e) {
     _log.warn("Cannot parse user file: ", e);
   } catch (UserServiceException e) {
     _log.warn("Problem adding user or role from file: ", e);
   } catch (SAXException e) {
     _log.warn("Could not parse user file: ", e);
   } catch (IOException e) {
     _log.warn("Could not parse user file: ", e);
   }
 }