/*
   *get collaboration information based on organisation - returns a collaborationList.
   */
  public HashMap<Integer, CollaborationList> getCollaborations_org(
      String id, TreeMap<Integer, Collaborator> network) {
    HashMap<Integer, CollaborationList> collaborations =
        new java.util.HashMap<Integer, CollaborationList>();

    // reset the iterator
    Set<Integer> networkKeys = network.keySet();
    Iterator<Integer> networkKeyIterator = networkKeys.iterator();
    Integer networkKey = null;

    CollaborationList collaborationList;

    // loop through the list of keys
    while (networkKeyIterator.hasNext()) {

      // get the key
      networkKey = (Integer) networkKeyIterator.next();

      // get the list of collaborations for this user
      collaborationList = getCollaborationList_org(id, networkKey.toString());

      // add the collaborationList object to the list
      collaborations.put(networkKey, collaborationList);
    }

    return collaborations;
  }
  @SuppressWarnings("unchecked")
  public Document toGraphMLDOM_org(Document egoDom, String id, int radius, String graphType) {

    Collaborator collaborator = null;

    if (db.connect() == false) {
      throw new RuntimeException("Unable to connect to the database");
    }

    // add the graph element
    Element rootElement = egoDom.getDocumentElement();
    rootElement = createHeaderElements(egoDom, rootElement, graphType);

    Element graph = egoDom.createElement("graph");
    graph.setAttribute("id", "Contributor Network for organisation:" + " ( " + id + " )");
    graph.setAttribute("edgedefault", graphType);
    rootElement.appendChild(graph);

    network = getRawCollaboratorData_org(id, radius);

    if (network != null) {
      // add some additional required information for contributors
      collaborators = getCollaborators(network, "0");

      // get collaboration List
      collaborations = getCollaborations_org(id, network);
    } else return egoDom;

    // create node element in DOM
    for (int i = 0; i < collaborators.size(); i++) {
      Element node = createNodeElement(egoDom, i);
      graph.appendChild(node);
    }

    // we have a list of collaborations.
    // loop through the list, for each - create a collaboration
    //								  - create edge.

    // 1.iterate through the collaboration hashmap
    Iterator contributorIter = collaborations.values().iterator();
    int edgeIndex = 0;
    // collabCheck used to ensure no doubling up of collaborations. (pretty quick hack, ideally this
    // issue would be sorted before this point)
    Vector collabCheck = new Vector();

    while (contributorIter.hasNext()) {
      CollaborationList list = (CollaborationList) contributorIter.next();
      // get the actual collaborations
      if (list != null) {

        Iterator collaborationIter = list.getCollaborations().values().iterator();
        //	loop through the hashmap of collaborations
        while (collaborationIter.hasNext()) {

          Collaboration collaboration = (Collaboration) collaborationIter.next();

          if (!collabCheck.contains(
              collaboration.getPartner() + "-" + collaboration.getCollaborator())) {
            // create an edge for each of them
            Element edge =
                createEdgeElement(
                    egoDom,
                    collaboration,
                    Integer.parseInt(collaboration.getCollaborator()),
                    Integer.parseInt(collaboration.getPartner()),
                    edgeIndex);
            graph.appendChild(edge);
            //	add the collaboration to the list for checking.
            collabCheck.add(collaboration.getCollaborator() + "-" + collaboration.getPartner());
            edgeIndex++;
          }
        }
      }
    }

    return egoDom;
  }
  /*
   * add some of the additional required information for collaborator
   */
  public ArrayList<Collaborator> getCollaborators(
      TreeMap<Integer, Collaborator> network, String id) {

    // declare helper variables
    java.util.ArrayList<Collaborator> collaborators = new java.util.ArrayList<Collaborator>();

    // define a SPARQL query to get details about a collaborator
    String sparqlQuery =
        "PREFIX foaf:       <"
            + FOAF.NS
            + ">"
            + "PREFIX ausestage:  <"
            + AuseStage.NS
            + "> "
            + "SELECT ?collabName ?function ?gender ?nationality  "
            + "WHERE {  "
            + "       @ a foaf:Person ; "
            + "           foaf:name ?collabName. "
            + "OPTIONAL {@ ausestage:function ?function} "
            + "OPTIONAL {@ foaf:gender ?gender} "
            + "OPTIONAL {@ ausestage:nationality ?nationality} "
            + "} ";

    String queryToExecute = null;

    ResultSet results = null;
    QuerySolution row = null;
    Collaborator collaborator = null;

    // loop through the list of collaborators and get additional information
    Collection networkKeys = network.keySet();
    Iterator networkKeyIterator = networkKeys.iterator();
    Integer networkKey = null;
    Integer centreId = Integer.parseInt(id);

    // loop through the list of keys
    while (networkKeyIterator.hasNext()) {

      // get the key for this collaborator
      networkKey = (Integer) networkKeyIterator.next();

      // create a new collaborator object
      collaborator = new Collaborator(networkKey.toString());

      // build the query
      queryToExecute =
          sparqlQuery.replaceAll(
              "@", "<" + AusStageURI.getContributorURI(collaborator.getId()) + ">");

      // execute the query
      results = rdf.executeSparqlQuery(queryToExecute);

      // add details to this contributor
      while (results.hasNext()) {
        // loop though the resulset
        // get a new row of data
        row = results.nextSolution();

        // add the data to the collaborator
        collaborator.setName(row.get("collabName").toString());
        if (row.get("function") != null) {
          collaborator.setFunction(row.get("function").toString());
        }

        if (row.get("gender") != null) {
          collaborator.setGender(row.get("gender").toString());
        }

        if (row.get("nationality") != null) {
          collaborator.setNationality(row.get("nationality").toString());
        }

        collaborator.setUrl(AusStageURI.getContributorURL(collaborator.getId()));
      }

      // play nice and tidy
      rdf.tidyUp();
      results = null;

      // add the collaborator to the list
      collaborators.add(collaborator);
    }

    return collaborators;
  }