//
// KEHOME/java/tap/Qname.java
// Sep/8/2003


import edu.stanford.TAP.Abbrev;
import edu.stanford.TAP.XML;
import edu.stanford.TAP.NamespacedTag;

public class Qname
{

/**
*   Basic terminology (w denotes whitespace)
*
*   a la MKR view (except CycL constant)    ::= yes(w/\) no(#)
*   full name  <==> individual or concept   ::= yes(w/\) no(#)
*   view name  <==> context		    ::= yes(w) no(/\#)
*   local name <==> root name or base name  ::= yes(w/\) no(#)
*   base name  <==> local name tail	    ::= yes(w) no(/\#)
*   root name  <==> root-to-base name	    ::= yes(w/) no(\#) begin(/)
*   class name <==> base-to-root name	    ::= yes(w\) no(/#) end(\)
*   Vname      <==> view name:local name
*
*   a la XML namespace (except %20)	    ::= yes(/#) no(w\)
*   full name  <==> URI			    ::= yes(/#) no(w\) begin(http://)
*   URL        <==> URI head		    ::= yes(/#) no(w\) begin(http://)
*   tag name   <==> URI tail		    ::= no(w/\#)
*   label name <==> nickname for URI head   ::= no(w/\#)
*   Qname      <==> label name:tag name
*
*/

    public String label;
    public String tag;
    public Qname(String arglabel, String argtag)
    {
	label = arglabel;
	tag   = argtag;
    } // end Qname()

/*
*  example: "foaf:homepage" => new Qname("foaf","homepage")
*  example: "homepage"      => new Qname("","homepage")
*  example: "http://server/homepage" => new Qname("http://server/","homepage")
*/
    public static Qname GetQname(String name)
    {
    String debug = "no";
    int x;
    int n = name.length();
    if (name.startsWith("http://")) {
	NamespacedTag Uname = XML.SplitNamespace(name);
	return new Qname(Uname.url,Uname.tag);
    }
    for (x = 1; x < n; ++x) {
	if (!Character.isLetter(name.charAt(x))) {
	    // first non-letter
	    if (name.charAt(x) == ':') {
		// found label
		String arglabel = name.substring(0,x);
		String argtag = name.substring(x+1,n);
		if (debug == "yes") {
		    System.out.println("# arglabel = " + arglabel);
		    System.out.println("# argtag = " + argtag);
		}
		return new Qname(arglabel,argtag);
	    } else {
		return new Qname("",name);
	    }
	}
    }
    return new Qname("",name);
    } // end GetQname()

/*
*  example: "foaf:homepage" => foafuri + "homepage"
*  example: "homepage"      => tapuri  + "homepage"
*  example: "http://server/homepage" => "http://server/homepage"
*/
    public static String GetNameURI(String name)
    {
	String tapuri = "http://tap.stanford.edu/data/";
	Qname qname = Qname.GetQname(name);
	if (qname.label.startsWith("http://")) {
	    return name;
	} else if (qname.label == "") {
	    if (!Abbrev.IsStandardTag(name)) {
		return tapuri + name;
	    } else {
		return name;
	    }
	} else {
	    return Abbrev.GetStdLabelURL(qname.label) + qname.tag;
	}
    } // end GetNameURI()

} // end class Qname

//