added a method to sniff XML encoding.

git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@3899 71c3de6d-444a-0410-be80-ed276b4c234a
This commit is contained in:
kohsuke committed 2007-07-29 17:17:26 +00:00
1 parent 7a12985f36
commit d13fe3cea2
1 file changed
+70
+70
View File
@@ -10,6 +10,8 @@ import hudson.util.AtomicFileWriter;
import hudson.util.IOException2;
import hudson.util.XStream2;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
@@ -18,6 +20,12 @@ import java.io.InputStreamReader;
import java.io.Reader;
import java.util.logging.Logger;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import org.xml.sax.Locator;
import org.xml.sax.Attributes;
import org.xml.sax.ext.Locator2;
/**
* Represents an XML data file that Hudson uses as a data file.
*
@@ -146,10 +154,72 @@ public final class XmlFile {
return file.toString();
}
/**
* Parses the beginning of the file and determines the encoding.
*
* @throws IOException
* if failed to detect encoding.
*/
public String sniffEncoding() throws IOException {
class Eureka extends SAXException {
final String encoding;
public Eureka(String encoding) {
this.encoding = encoding;
}
}
try {
JAXP.newSAXParser().parse(file,new DefaultHandler() {
private Locator loc;
public void setDocumentLocator(Locator locator) {
this.loc = locator;
}
public void startDocument() throws SAXException {
attempt();
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
attempt();
// if we still haven't found it at the first start element,
// there's something wrong.
throw new Eureka(null);
}
private void attempt() throws Eureka {
if(loc==null) return;
if (loc instanceof Locator2) {
Locator2 loc2 = (Locator2) loc;
String e = loc2.getEncoding();
if(e!=null)
throw new Eureka(e);
}
}
});
// can't reach here
throw new AssertionError();
} catch (Eureka e) {
if(e.encoding==null)
throw new IOException("Failed to detect encoding of "+file);
return e.encoding;
} catch (SAXException e) {
throw new IOException("Failed to detect encoding of "+file,e);
} catch (ParserConfigurationException e) {
throw new AssertionError(e); // impossible
}
}
/**
* {@link XStream} instance is supposed to be thread-safe.
*/
private static final XStream DEFAULT_XSTREAM = new XStream2();
private static final Logger LOGGER = Logger.getLogger(XmlFile.class.getName());
private static final SAXParserFactory JAXP = SAXParserFactory.newInstance();
static {
JAXP.setNamespaceAware(true);
}
}