package scala.xml
package factory
import javax.xml.parsers.SAXParserFactory
import parsing.{ FactoryAdapter, NoBindingFactoryAdapter }
import java.io.{ InputStream, Reader, StringReader, File, FileDescriptor, FileInputStream }
import java.net.URL
trait XMLLoader[T <: Node]
{
import scala.xml.Source._
def adapter: FactoryAdapter = new NoBindingFactoryAdapter()
def parser: SAXParser = {
val f = SAXParserFactory.newInstance()
f.setNamespaceAware(false)
f.newSAXParser()
}
def loadXML(source: InputSource, parser: SAXParser): T = {
val newAdapter = adapter
newAdapter.scopeStack push TopScope
parser.parse(source, newAdapter)
newAdapter.scopeStack.pop
newAdapter.rootElem.asInstanceOf[T]
}
def loadFile(file: File): T = loadXML(fromFile(file), parser)
def loadFile(fd: FileDescriptor): T = loadXML(fromFile(fd), parser)
def loadFile(name: String): T = loadXML(fromFile(name), parser)
def load(is: InputStream): T = loadXML(fromInputStream(is), parser)
def load(reader: Reader): T = loadXML(fromReader(reader), parser)
def load(sysID: String): T = loadXML(fromSysId(sysID), parser)
def load(source: InputSource): T = loadXML(source, parser)
def load(url: URL): T = loadXML(fromInputStream(url.openStream()), parser)
def loadString(string: String): T = loadXML(fromString(string), parser)
}