Azkaban的Web Server源码探究系列5: XmlUserManager权限数据的初始化
Azkaban的Web Server源码探究系列5: XmlUserManager权限数据的初始化
强子哥哥 发表于2年前
Azkaban的Web Server源码探究系列5: XmlUserManager权限数据的初始化
  • 发表于 2年前
  • 阅读 179
  • 收藏 0
  • 点赞 1
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

上节讲到XmlUserManager的代码块,放在这里讲解

private void parseXMLFile() {//看到这里了

    File file = new File(xmlPath);//找到文件

    if (!file.exists()) {//校验是否存在

      throw new IllegalArgumentException("User xml file " + xmlPath

          + " doesn't exist.");

    }

 

    HashMap<String, User> users = new HashMap<String, User>();

    HashMap<String, String> userPassword = new HashMap<String, String>();

    HashMap<String, Role> roles = new HashMap<String, Role>();

    HashMap<String, Set<String>> groupRoles =

        new HashMap<String, Set<String>>();//初始化

    HashMap<String, Set<String>> proxyUserMap =

        new HashMap<String, Set<String>>();//初始化

 

    // Creating the document builder to parse xml.

    DocumentBuilderFactory docBuilderFactory =

        DocumentBuilderFactory.newInstance();//构造解析器

    DocumentBuilder builder = null;//初始化为null

    try {

      builder = docBuilderFactory.newDocumentBuilder();//实例化

    } catch (ParserConfigurationException e) {

      throw new IllegalArgumentException(

          "Exception while parsing user xml. Document builder not created.", e);

    }

    //继续

    Document doc = null;

    try {

      doc = builder.parse(file);//"conf/azkaban-users.xml"

 

    } catch (SAXException e) {

      throw new IllegalArgumentException("Exception while parsing " + xmlPath

          + ". Invalid XML.", e);

    } catch (IOException e) {

      throw new IllegalArgumentException("Exception while parsing " + xmlPath

          + ". Error reading file.", e);

    }

    //好,顺利解析到此

    // Only look at first item, because we should only be seeing

    // azkaban-users tag.

    NodeList tagList = doc.getChildNodes();

    Node azkabanUsers = tagList.item(0);

 

    NodeList azkabanUsersList = azkabanUsers.getChildNodes();//获取了用户列表

    for (int i = 0; i < azkabanUsersList.getLength(); ++i) {//遍历每个节点

      Node node = azkabanUsersList.item(i);//获取当前节点

      if (node.getNodeType() == Node.ELEMENT_NODE) {//节点类型是否是我们需要的?

        if (node.getNodeName().equals(USER_TAG)) {//用户节点

          parseUserTag(node, users, userPassword, proxyUserMap);

        } else if (node.getNodeName().equals(ROLE_TAG)) {

          parseRoleTag(node, roles);

        } else if (node.getNodeName().equals(GROUP_TAG)) {

          parseGroupRoleTag(node, groupRoles);

        }

      }

    }

 

    // Synchronize the swap. Similarly, the gets are synchronized to this.

    synchronized (this) {

      this.users = users;

      this.userPassword = userPassword;

      this.roles = roles;

      this.proxyUserMap = proxyUserMap;

      this.groupRoles = groupRoles;

    }

  }

可以看到,主要分3部分来解析

1)parseUserTag

 

private void parseUserTag(Node node, HashMap<String, User> users,

      HashMap<String, String> userPassword,

      HashMap<String, Set<String>> proxyUserMap) {

  //解析user节点

    NamedNodeMap userAttrMap = node.getAttributes();

    Node userNameAttr = userAttrMap.getNamedItem(USERNAME_ATTR);//解析出username的属性值

    if (userNameAttr == null) {

      throw new RuntimeException("Error loading user. The '" + USERNAME_ATTR

          + "' attribute doesn't exist");

    }

 

    Node passwordAttr = userAttrMap.getNamedItem(PASSWORD_ATTR);//解析出password的值

    if (passwordAttr == null) {

      throw new RuntimeException("Error loading user. The '" + PASSWORD_ATTR

          + "' attribute doesn't exist");

    }

    //2个属性都拿到了

    // Add user to the user/password map

    String username = userNameAttr.getNodeValue();//转换成字符串

    String password = passwordAttr.getNodeValue();//转换成字符串

    userPassword.put(username, password);//存起来

    // Add the user to the node

    User user = new User(userNameAttr.getNodeValue());

    users.put(username, user);

    logger.info("Loading user " + user.getUserId());//简单

 

    Node roles = userAttrMap.getNamedItem(ROLES_ATTR);//roles

    if (roles != null) {

      String value = roles.getNodeValue();

      String[] roleSplit = value.split("\\s*,\\s*");

      for (String role : roleSplit) {

        user.addRole(role);

      }

    }//解析出值,存入user.roles

 

    Node proxy = userAttrMap.getNamedItem(PROXY_ATTR);//proxy

    if (proxy != null) {

      String value = proxy.getNodeValue();

      String[] proxySplit = value.split("\\s*,\\s*");

      for (String proxyUser : proxySplit) {

        Set<String> proxySet = proxyUserMap.get(username);

        if (proxySet == null) {

          proxySet = new HashSet<String>();

          proxyUserMap.put(username, proxySet);

        }

 

        proxySet.add(proxyUser);

      }

    }

    //继续阅读

    Node groups = userAttrMap.getNamedItem(GROUPS_ATTR);//groups

    if (groups != null) {

      String value = groups.getNodeValue();

      String[] groupSplit = value.split("\\s*,\\s*");

      for (String group : groupSplit) {

        user.addGroup(group);//加到groups里

      }

    }

    //解析email

    Node emailAttr = userAttrMap.getNamedItem(EMAIL_ATTR);//"email";

    if (emailAttr != null) {

      user.setEmail(emailAttr.getNodeValue());

    }

  }

 2)parseRoleTag

 

private void parseRoleTag(Node node, HashMap<String, Role> roles) {

    NamedNodeMap roleAttrMap = node.getAttributes();//提取属性值

    Node roleNameAttr = roleAttrMap.getNamedItem(ROLENAME_ATTR);//"name";

    if (roleNameAttr == null) {

      throw new RuntimeException(

          "Error loading role. The role 'name' attribute doesn't exist");

    }//校验

    Node permissionAttr = roleAttrMap.getNamedItem(ROLEPERMISSIONS_ATTR);//"permissions";

    if (permissionAttr == null) {//校验

      throw new RuntimeException(

          "Error loading role. The role 'permissions' attribute doesn't exist");

    }

 

    String roleName = roleNameAttr.getNodeValue();//获取值

    String permissions = permissionAttr.getNodeValue();//获取值

 

    String[] permissionSplit = permissions.split("\\s*,\\s*");

 

    Permission perm = new Permission();//构造Permission对象

    for (String permString : permissionSplit) {

      try {

        Permission.Type type = Permission.Type.valueOf(permString);

        perm.addPermission(type);//加入

      } catch (IllegalArgumentException e) {

        logger.error("Error adding type " + permString

            + ". Permission doesn't exist.", e);

      }

    }

    //继续

    Role role = new Role(roleName, perm);//构造role对象

    roles.put(roleName, role);

  }

 最后保留引用

    // Synchronize the swap. Similarly, the gets are synchronized to this.

    synchronized (this) {//全部保存引用

      this.users = users;

      this.userPassword = userPassword;

      this.roles = roles;

      this.proxyUserMap = proxyUserMap;

      this.groupRoles = groupRoles;

    }

解析完毕! 

 

 

 

标签: azkaban
共有 人打赏支持
强子哥哥
粉丝 836
博文 686
码字总数 713911
作品 8
×
强子哥哥
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: