import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.util.*;

public class DependantHandler extends DefaultHandler {

    // temporary storage:
	private String firstName, lastName, id;
	// flags
	boolean visitingFirstName = false, visitingLastName = false;

	private Map<String, String> members = new Hashtable<String, String>();
	private Map<String, String> dependants = new Hashtable<String, String>();

    // merge tables
	public Map<String, String> getSponsors() {
		Map<String, String> result = new Hashtable<String, String>();
		Set<String> dependantNames = dependants.keySet();
		for(String dn: dependantNames) {
			String sponsorName = members.get(dependants.get(dn));
			result.put(dn, sponsorName);
		}
		return result;
	}

    // for testing:
	public void displaySponsors() {
		Map<String, String> sponsors = getSponsors();
		Set<String> dependantNames = sponsors.keySet();
		for(String dn: dependantNames) {
			String sponsorName = sponsors.get(dn);
			System.out.println(dn + " sponsor = " + sponsorName);
		}
	}


	public void startElement(
	  String namespaceURI,
	  String localName,
	  String qName,
	  Attributes attrs) throws SAXException {

		  if (qName.equals("member")) {
			  id = attrs.getValue("id");
			  return;
		  }

		  if (qName.equals("firstName")) {
			  visitingFirstName = true;
			  firstName = "";
			  return;
		  }

		  if (qName.equals("lastName")) {
			  visitingLastName = true;
			  lastName = "";
			  return;
		  }

		  if (qName.equals("sponsor")) {
			  id = attrs.getValue("id");
			  return;
		  }
	  }


	  public void endElement(String uri, String localName, String qName) {



		if (qName.equals("member")) {
			members.put(id, firstName + " " + lastName);
			return;
		}

		if (qName.equals("dependant")) {
			dependants.put(firstName + " " + lastName, id);
			return;
		}

		if (qName.equals("firstName")) {
			visitingFirstName = false;
			return;
		}

		if (qName.equals("lastName")) {
			visitingLastName = false;
			return;
		}


	}

	public void characters(char buf[], int offset, int len) throws SAXException {

		String text = new String(buf, offset, len);

		if (visitingFirstName) {
			firstName += text;
			return;
		}

		if (visitingLastName) {
			lastName += text;
			return;
		}

	}

  }