#include "ACEXML/common/NamespaceSupport.h"
#include "ace/OS_main.h"

int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACEXML_NamespaceSupport xmlns;
  if (xmlns.init() == -1)
    {
      ACE_DEBUG ((LM_DEBUG,
                  ACE_TEXT ("Error in initializing namespace support.")));
      return 1;
    }
  xmlns.pushContext();
  xmlns.declarePrefix(ACE_TEXT (""),
                      ACE_TEXT ("http://www.w3.org/1999/xhtml"));
  xmlns.declarePrefix(ACE_TEXT ("dc"),
                      ACE_TEXT ("http://www.purl.org/dc#"));
  xmlns.declarePrefix(ACE_TEXT ("xc"),
                      ACE_TEXT ("http://www.purl.org/dc#"));

  const ACEXML_Char *lName, *uri;
  const ACEXML_Char *n1 = ACE_TEXT ("p");

  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("*** Checking processName:\n")));
  if (xmlns.processName (n1, uri, lName, 0) != 0)
    ACE_DEBUG ((LM_ERROR,
                ACE_TEXT ("Fail to resolve namespace name %s\n"),
                n1));
  else
    ACE_DEBUG ((LM_DEBUG,
                ACE_TEXT ("Namespace URI: %s\nLocal name: %s\nRaw name: %s\n"),
                uri, lName, n1));

  const ACEXML_Char *n2 = ACE_TEXT ("dc:title");
  if (xmlns.processName(n2, uri, lName, 0) != 0)
    ACE_DEBUG ((LM_ERROR,
                ACE_TEXT ("Fail to resolve namespace name %S\n"),
                n2));
  else
    ACE_DEBUG ((LM_DEBUG,
                ACE_TEXT ("Namespace URI: %s\nLocal name: %s\nRaw name: %s\n"),
                uri, lName, n2));

  const ACEXML_Char *n3 = ACE_TEXT ("xml:title");
  if (xmlns.processName(n3, uri, lName, 0) != 0)
    ACE_DEBUG ((LM_ERROR,
                ACE_TEXT ("Fail to resolve namespace name %S\n"),
                n3));
  else
    ACE_DEBUG ((LM_DEBUG,
                ACE_TEXT ("Namespace URI: %s\nLocal name: %s\nRaw name: %s\n"),
                uri, lName, n3));

  ACE_DEBUG ((LM_DEBUG,
              ACE_TEXT ("\n*** Checking getDeclaredPrefixes\n")));

  ACEXML_STR_LIST prefixes;
  if (xmlns.getDeclaredPrefixes (prefixes) != 0)
    ACE_DEBUG ((LM_ERROR,
                ACE_TEXT ("Fail to get a list of declared prefixes\n")));
  else
    {
      ACEXML_STR_LIST::ITERATOR iter = prefixes.begin ();
      const ACEXML_Char **prefix = 0;

      for (; iter.next (prefix);iter.advance ())
        ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("prefix: \"%s\"\n"), *prefix));
    }

  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** Checking getPrefix\n")));
  const ACEXML_Char *prefix = 0;

  if ((prefix = xmlns.getPrefix (ACE_TEXT ("http://www.purl.org/dc#"))) == 0)
    ACE_DEBUG ((LM_ERROR,
                ACE_TEXT ("Fail to get prefix of http://www.purl.org/dc#\n")));
  else
    ACE_DEBUG ((LM_DEBUG,
                ACE_TEXT ("Prefix of http://www.purl.org/dc# is %s\n"),
                prefix));

  if ((prefix = xmlns.getPrefix (ACE_TEXT ("http://www.w3.org/1999/xhtml"))) == 0)
    ACE_DEBUG ((LM_DEBUG,
                ACE_TEXT ("Fail to get prefix of http://www.w3.org/1999/xhtml which is okay\n")));
  else
    ACE_DEBUG ((LM_ERROR,
                ACE_TEXT ("ERROR: Prefix of http://www.w3.org/1999/xhtml is %s\n"),
                prefix));

  if ((prefix = xmlns.getPrefix (ACE_TEXT ("http://www.w3.org/XML/1998/namespace"))) == 0)
    ACE_DEBUG ((LM_ERROR,
                ACE_TEXT ("Fail to get prefix of http://www.w3.org/XML/1998/namespace\n")));
  else
    ACE_DEBUG ((LM_DEBUG,
                ACE_TEXT ("Prefix of http://www.w3.org/XML/1998/namespace is %s\n"),
                prefix));

  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** Checking getPrefixes with known URI\n")));
  prefixes.reset ();

  if (xmlns.getPrefixes (ACE_TEXT ("http://www.purl.org/dc#"), prefixes) != 0)
    ACE_DEBUG ((LM_ERROR, ACE_TEXT ("Fail to getPrefixes based on known URI\n")));
  else
    {
      ACEXML_STR_LIST::ITERATOR iter = prefixes.begin ();
      const ACEXML_Char **prefix = 0;

      for (; iter.next (prefix);iter.advance ())
        ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("prefix: \"%s\"\n"), *prefix));
    }

  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** Checking getPrefixes\n")));
  prefixes.reset ();

  if (xmlns.getPrefixes (prefixes) != 0)
    ACE_DEBUG ((LM_ERROR, ACE_TEXT ("Fail to getPrefixes\n")));
  else
    {
      ACEXML_STR_LIST::ITERATOR iter = prefixes.begin ();
      const ACEXML_Char **prefix = 0;

      for (; iter.next (prefix);iter.advance ())
        ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("prefix: \"%s\"\n"), *prefix));
    }

  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** Checking getURI\n")));
  const ACEXML_Char *URI = 0;

  if ((URI = xmlns.getURI (ACE_TEXT ("dc"))) == 0)
    ACE_DEBUG((LM_ERROR, ACE_TEXT ("Fail to get URI for \"dc\"\n")));
  else
    ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("URI for \"dc\" is %s\n"), URI));
  if ((URI = xmlns.getURI (ACE_TEXT ("xc"))) == 0)
    ACE_DEBUG ((LM_ERROR, ACE_TEXT ("Fail to get URI for \"xc\"\n")));
  else
    ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("URI for \"xc\" is %s\n"), URI));
  if ((URI = xmlns.getURI (ACE_TEXT ("xml"))) == 0)
    ACE_DEBUG ((LM_ERROR, ACE_TEXT ("Fail to get URI for \"xml\"\n")));
  else
    ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("URI for \"xml\" is %s\n"), URI));
  if ((URI = xmlns.getURI (ACE_TEXT (""))) == 0)
    ACE_DEBUG ((LM_ERROR, ACE_TEXT ("Fail to get default namespace URI\n")));
  else
    ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("URI for default namespace is %s\n"), URI));

  xmlns.popContext();

  return 0;
}
