package scales.xml
import scales.utils.error
import scales.utils.{LeftLike, RightLike}
import impl.QNameCharUtils._
import scales.xml.impl.{FromParser, NotFromParser}
sealed trait QName {
val local : String
def namespace : UnderlyingNamespace
def prefix : Option[String]
def qNameVersion : XmlVersion =
if (validLocalName(local)(Xml10) &&
(prefix.map{p => validXmlPrefix(p)(Xml10)}.getOrElse(true)) &&
((namespace eq EmptyNamespace) ||
validXmlNamespace(namespace.uri)(Xml10) ))
Xml10
else
Xml11
def hasPrefix = prefix.isDefined
def qName =
if (prefix.isDefined)
prefix.get + ":" + local
else local
def pqName = if (prefix.isDefined) prefix.get +":" + qualifiedName else qualifiedName
def qualifiedName = "{" + namespace.uri + "}" + local
override def toString = qualifiedName
def ====( other : QName) =
if (this eq other) true
else
if (this =:= other) {
val hp = hasPrefix
val ohp = other.hasPrefix
if (hp && ohp)
prefix.get == other.prefix.get
else
(hp == ohp)
} else false
def =:=( other : QName) =
(other eq this) ||
(local == other.local && namespace.uri == other.namespace.uri)
override def equals( other : Any ) = other match {
case oq : QName => this =:= oq
case _ => false
}
override def hashCode() : Int = {
var hs = 1
hs = (hs * 31) + prefix.map(_.hashCode).getOrElse(1)
hs = (hs * 31) + local.hashCode
hs = (hs * 31) + namespace.hashCode
hs
}
}
trait CanHavePrefix {
val local : String
val namespace : Namespace
def prefix : Option[String]
def withPrefix( prefix : String )(implicit ver : XmlVersion, fromParser: FromParser) : PrefixedQName =
PrefixedQName( local , namespace.prefixed(prefix))
}
trait NoNamespaceQName extends QName with RightLike[PrefixedQName, NoNamespaceQName] {
final def prefix = None
final def namespace = impl.NamespaceDefaults.noNamespace
}
object NoNamespaceQName {
def apply(locali : String)(implicit ver: XmlVersion, fromParser : FromParser) = new NoNamespaceQName {
if (fromParser eq NotFromParser) {
validateLocalName(locali)
}
final val local = locali
}
def unapply(n : NoNamespaceQName) = Some((n.local))
}
trait PrefixedQName extends QName with CanHavePrefix with LeftLike[PrefixedQName, NoNamespaceQName]
object PrefixedQName {
def apply( locali : String, prefixedNamespace : PrefixedNamespace)(implicit ver: XmlVersion, fromParser : FromParser) = new PrefixedQName {
if (fromParser eq NotFromParser) {
validateLocalName(locali)
}
final val local = locali
final val prefix = Some(prefixedNamespace.prefix)
final val namespace = prefixedNamespace.ns
}
def unapply(n : PrefixedQName) = Some((n.local, n.prefix.get, n.namespace))
}
trait UnprefixedQName extends QName with CanHavePrefix {
def prefix = None
}
object UnprefixedQName {
def apply(locali : String, namespacei : Namespace)(implicit ver: XmlVersion, fromParser : FromParser) = new UnprefixedQName {
if (fromParser eq NotFromParser) {
validateLocalName(locali)
}
final val local = locali
final val namespace = namespacei
}
def unapply(n : UnprefixedQName) = Some((n.local, n.namespace))
}
<iframe src="https://scalesxml.github.io/scales-xml_2.10/0.5.0/api.sxr/scales/xml/QName.scala.html" width="1280" height="720" frameborder="0"> </iframe>