public class ParserRegistry extends Object
Keeps track of response parsers for each content type. Each parser
should should be a closure that accepts an HttpResponse
instance,
and returns whatever handler is appropriate for reading the response
data for that content-type. For example, a plain-text response should
probably be parsed with a Reader
, while an XML response
might be parsed by an XmlSlurper, which would then be passed to the
response closure.
Note that all methods in this class assume HttpResponse.getEntity()
return a non-null value. It is the job of the HTTPBuilder instance to ensure
a NullPointerException is not thrown by passing a response that contains no
entity.
You can see the list of content-type parsers that are built-in to the
ParserRegistry class in buildDefaultParserMap()
.
ContentType
Modifier and Type | Field and Description |
---|---|
protected static org.apache.xml.resolver.tools.CatalogResolver |
catalogResolver
This CatalogResolver is static to avoid the overhead of re-parsing
the catalog definition file every time.
|
static String |
DEFAULT_CHARSET
The default charset to use when no charset is given in the Content-Type
header of a response.
|
protected groovy.lang.Closure |
DEFAULT_PARSER
The default parser used for unregistered content-types.
|
protected static org.apache.commons.logging.Log |
log |
Constructor and Description |
---|
ParserRegistry() |
Modifier and Type | Method and Description |
---|---|
static void |
addCatalog(URL catalogLocation)
Add a new XML catalog definiton to the static XML resolver catalog.
|
protected Map<String,groovy.lang.Closure> |
buildDefaultParserMap()
Returns a map of default parsers.
|
groovy.lang.Closure |
getAt(Object contentType)
Retrieve a parser for the given response content-type string.
|
static org.apache.xml.resolver.tools.CatalogResolver |
getCatalogResolver()
Access the default catalog used by all HTTPBuilder instances.
|
static String |
getCharset(org.apache.http.HttpResponse resp)
Helper method to get the charset from the response.
|
static String |
getContentType(org.apache.http.HttpResponse resp)
Helper method to get the content-type string from the response
(no charset).
|
groovy.lang.Closure |
getDefaultParser()
Get the default parser used for unregistered content-types.
|
Iterator<Map.Entry<String,groovy.lang.Closure>> |
iterator()
Iterate over the entire parser map
|
Map<String,String> |
parseForm(org.apache.http.HttpResponse resp)
Default parser used to decode a URL-encoded response.
|
groovy.util.slurpersupport.GPathResult |
parseHTML(org.apache.http.HttpResponse resp)
Parse an HTML document by passing it through the NekoHTML parser.
|
Object |
parseJSON(org.apache.http.HttpResponse resp)
Default parser used to decode a JSON response.
|
InputStream |
parseStream(org.apache.http.HttpResponse resp)
Default parser used for binary data.
|
Reader |
parseText(org.apache.http.HttpResponse resp)
Default parser used to handle plain text data.
|
groovy.util.slurpersupport.GPathResult |
parseXML(org.apache.http.HttpResponse resp)
Default parser used to decode an XML response.
|
groovy.lang.Closure |
propertyMissing(Object key)
Alias for
getAt(Object) to allow property-style access. |
void |
propertyMissing(Object key,
groovy.lang.Closure value)
Alias for
putAt(Object, Closure) to allow property-style access. |
void |
putAt(Object contentType,
groovy.lang.Closure value)
Register a new parser for the given content-type.
|
static void |
setDefaultCharset(String charset)
Set the charset to use for parsing character streams when no charset
is given in the Content-Type header.
|
void |
setDefaultParser(groovy.lang.Closure defaultParser)
Set the default parser used for unregistered content-types.
|
protected final groovy.lang.Closure DEFAULT_PARSER
parseStream(HttpResponse)
, which is like a no-op that just
returns the unaltered response stream.public static final String DEFAULT_CHARSET
setDefaultCharset(String)
.protected static final org.apache.commons.logging.Log log
protected static org.apache.xml.resolver.tools.CatalogResolver catalogResolver
Catalog
class is technically not thread-safe, but as long as you
do not parse catalog files while using the resolver, it should be fine.public static void setDefaultCharset(String charset)
charset
- the charset to use, or null
to use
DEFAULT_CHARSET
public static String getCharset(org.apache.http.HttpResponse resp)
Reader reader = new InputStreamReader( resp.getEntity().getContent(), ParserRegistry.getCharset( resp ) );
resp
- public static String getContentType(org.apache.http.HttpResponse resp)
resp
- public InputStream parseStream(org.apache.http.HttpResponse resp) throws IOException
resp
- IllegalStateException
IOException
ContentType.BINARY
,
HttpEntity.getContent()
public Reader parseText(org.apache.http.HttpResponse resp) throws IOException
resp
- UnsupportedEncodingException
IllegalStateException
IOException
ContentType.TEXT
public Map<String,String> parseForm(org.apache.http.HttpResponse resp) throws IOException
resp
- IOException
ContentType.URLENC
public groovy.util.slurpersupport.GPathResult parseHTML(org.apache.http.HttpResponse resp) throws IOException, SAXException
resp
- HTTP response from which to parse contentGPathResult
from calling XmlSlurper.parse(Reader)
IOException
SAXException
ContentType.HTML
,
org.cyberneko.html.parsers.SAXParser
,
XmlSlurper.parse(Reader)
public groovy.util.slurpersupport.GPathResult parseXML(org.apache.http.HttpResponse resp) throws IOException, SAXException, ParserConfigurationException
resp
- HTTP response from which to parse contentGPathResult
from calling XmlSlurper.parse(Reader)
IOException
SAXException
ParserConfigurationException
ContentType.XML
,
XmlSlurper.parse(Reader)
public Object parseJSON(org.apache.http.HttpResponse resp) throws IOException
resp
- IOException
ContentType.JSON
protected Map<String,groovy.lang.Closure> buildDefaultParserMap()
Returns a map of default parsers. Override this method to change
what parsers are registered by default. A 'parser' is really just a
closure that acceipts an HttpResponse
instance and returns
some parsed data. You can of course call
super.buildDefaultParserMap()
and then add or remove
from that result as well.
Default registered parsers are:
public static void addCatalog(URL catalogLocation) throws IOException
catalogLocation
- URL of a catalog definition fileIOException
- if the given URL cannot be parsed or accessed for whatever reason.public static org.apache.xml.resolver.tools.CatalogResolver getCatalogResolver()
CatalogResolver
instancepublic groovy.lang.Closure getDefaultParser()
public void setDefaultParser(groovy.lang.Closure defaultParser)
defaultParser
- ifpublic groovy.lang.Closure getAt(Object contentType)
contentType
- public void putAt(Object contentType, groovy.lang.Closure value)
HttpResponse
argument and return a type suitable
to be passed as the 'parsed data' argument of a
response handler
closure.contentType
- content-type
stringvalue
- code that will parse the HttpResponse and return parsed
data to the response handler.public groovy.lang.Closure propertyMissing(Object key)
getAt(Object)
to allow property-style access.key
- content-type stringpublic void propertyMissing(Object key, groovy.lang.Closure value)
putAt(Object, Closure)
to allow property-style access.key
- content-type stringvalue
- parser closureCopyright © 2008–2018. All rights reserved.