package org.wyona.cms.ac;

import java.util.Vector;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import org.apache.xpath.XPathAPI;

/**
 * @author Michael Wechner
 * @created 1.12.22
 * @version 1.12.22
 */
public class Identity{
  private String username=null;
  private Vector groupnames=null;
  private static String ROOT="identity";
/**
 *
 */
  public static void main(String[] args){
    if(args.length != 1){
      System.err.println("Usage: org.wyona.cms.ac.Identity wyona.iml");
      return;
      }
    try{
      javax.xml.parsers.DocumentBuilderFactory dbf=javax.xml.parsers.DocumentBuilderFactory.newInstance();
      javax.xml.parsers.DocumentBuilder db=dbf.newDocumentBuilder();
      Document doc=db.parse(new java.io.FileInputStream(args[0]));
      Identity id=new Identity("dummy",doc);
      System.out.println(id);
      System.out.println(id.getPassword(doc));
      }
    catch(Exception e){
      System.err.println(".main(): "+e);
      }
    }
/**
 *
 */
  public Identity(String username){
    this.username=username;
    groupnames=new Vector();
    }
/**
 *
 */
  public Identity(String username,Document doc) throws Exception{
    this(username);
    NodeList groupNodes=XPathAPI.selectNodeList(doc,"/"+ROOT+"/groups/group");
    for(int i=0;i<groupNodes.getLength();i++){
      Node groupNode=groupNodes.item(i);
      addGroupname(groupNode.getFirstChild().getNodeValue());
      }
    }
/**
 *
 */
  public String getUsername(){
    return username;
    }
/**
 *
 */
  public static String getPassword(Document doc) throws Exception{
    Node passwordNode=XPathAPI.selectSingleNode(doc,"/"+ROOT+"/password");
    return passwordNode.getFirstChild().getNodeValue();
    }
/**
 *
 */
  public void addGroupname(String groupname){
    groupnames.addElement(groupname);
    }
/**
 *
 */
  public String[] getGroupnames(){
    String[] gn=new String[groupnames.size()];
    for(int i=0;i<gn.length;i++){
      gn[i]=(String)groupnames.elementAt(i);
      }
    return gn;
    }
/**
 *
 */
  public String toString(){
    String s="username="+username;
    for(int i=0;i<groupnames.size();i++){
      s=s+", groupname="+(String)groupnames.elementAt(i);
      }
    return s;
    }
  }
