public class XMLParserActivator
extends java.lang.Object
implements org.osgi.framework.BundleActivator, org.osgi.framework.ServiceFactory
The services that this bundle activator enables a bundle to provide are:
javax.xml.parsers.SAXParserFactory
(SAXFACTORYNAME
)
javax.xml.parsers.DocumentBuilderFactory
(
DOMFACTORYNAME
)
The algorithm to find the implementations of the abstract parsers is derived from the JAR file specifications, specifically the Services API.
An XMLParserActivator assumes that it can find the class file names of the factory classes in the following files:
/META-INF/services/javax.xml.parsers.SAXParserFactory
is a
file contained in a jar available to the runtime which contains the
implementation class name(s) of the SAXParserFactory.
/META-INF/services/javax.xml.parsers.DocumentBuilderFactory
is a file contained in a jar available to the runtime which contains the
implementation class name(s) of the DocumentBuilderFactory
If either of the files does not exist, XMLParserActivator
assumes that the parser does not support that parser type.
XMLParserActivator
attempts to instantiate both the
SAXParserFactory
and the DocumentBuilderFactory
. It
registers each factory with the framework along with service properties:
PARSER_VALIDATING
- indicates if this factory supports validating
parsers. It's value is a Boolean
.
PARSER_NAMESPACEAWARE
- indicates if this factory supports
namespace aware parsers It's value is a Boolean
.
Individual parser implementations may have additional features, properties,
or attributes which could be used to select a parser with a filter. These can
be added by extending this class and overriding the
setSAXProperties
and setDOMProperties
methods.
Modifier and Type | Field and Description |
---|---|
private org.osgi.framework.BundleContext |
context
Context of this bundle
|
static java.lang.String |
DOMCLASSFILE
Fully qualified path name of DOM Parser Factory Class Name file
|
private static java.lang.String |
DOMFACTORYDESCRIPTION
DOM Factory Service Description
|
static java.lang.String |
DOMFACTORYNAME
Filename containing the DOM Parser Factory Class name.
|
private static java.lang.String |
FACTORYNAMEKEY
Key for parser factory name property - this must be saved in the parsers
properties hashtable so that the parser factory can be instantiated from
a ServiceReference
|
static java.lang.String |
PARSER_NAMESPACEAWARE
Service property specifying if factory is configured to support namespace
aware parsers.
|
static java.lang.String |
PARSER_VALIDATING
Service property specifying if factory is configured to support
validating parsers.
|
private static java.lang.String |
PARSERCLASSFILEPATH
Path to the factory class name files
|
static java.lang.String |
SAXCLASSFILE
Fully qualified path name of SAX Parser Factory Class Name file
|
private static java.lang.String |
SAXFACTORYDESCRIPTION
SAX Factory Service Description
|
static java.lang.String |
SAXFACTORYNAME
Filename containing the SAX Parser Factory Class name.
|
Constructor and Description |
---|
XMLParserActivator() |
Modifier and Type | Method and Description |
---|---|
private java.lang.Object |
getFactory(java.lang.String parserFactoryClassName)
Given a parser factory class name, instantiate that class.
|
private java.util.List |
getParserFactoryClassNames(java.net.URL parserUrl)
Given the URL for a file, reads and returns the parser class names.
|
protected java.net.URL |
getResourceURL(org.osgi.framework.Bundle parserBundle,
java.lang.String resname) |
java.lang.Object |
getService(org.osgi.framework.Bundle bundle,
org.osgi.framework.ServiceRegistration registration)
Creates a new XML Parser Factory object.
|
private void |
registerDOMParsers(java.util.List parserFactoryClassNames)
Register DOM Parser Factory Services with the framework.
|
private void |
registerSAXParsers(java.util.List parserFactoryClassNames)
Register SAX Parser Factory Services with the framework.
|
private void |
setDefaultDOMProperties(javax.xml.parsers.DocumentBuilderFactory factory,
java.util.Hashtable props,
int index)
Set the DOM parser service properties.
|
private void |
setDefaultSAXProperties(javax.xml.parsers.SAXParserFactory factory,
java.util.Hashtable props,
int index)
Set the SAX Parser Service Properties.
|
void |
setDOMProperties(javax.xml.parsers.DocumentBuilderFactory factory,
java.util.Hashtable props)
Set the customizable DOM Parser Service Properties.
|
void |
setSAXProperties(javax.xml.parsers.SAXParserFactory factory,
java.util.Hashtable properties)
Set the customizable SAX Parser Service Properties.
|
void |
start(org.osgi.framework.BundleContext context)
Called when this bundle is started so the Framework can perform the
bundle-specific activities necessary to start this bundle.
|
void |
stop(org.osgi.framework.BundleContext context)
This method has nothing to do as all active service registrations will
automatically get unregistered when the bundle stops.
|
void |
ungetService(org.osgi.framework.Bundle bundle,
org.osgi.framework.ServiceRegistration registration,
java.lang.Object service)
Releases a XML Parser Factory object.
|
private volatile org.osgi.framework.BundleContext context
public static final java.lang.String SAXFACTORYNAME
SERVICE_PID registration property.
public static final java.lang.String DOMFACTORYNAME
SERVICE_PID
registration property.private static final java.lang.String PARSERCLASSFILEPATH
public static final java.lang.String SAXCLASSFILE
public static final java.lang.String DOMCLASSFILE
private static final java.lang.String SAXFACTORYDESCRIPTION
private static final java.lang.String DOMFACTORYDESCRIPTION
public static final java.lang.String PARSER_VALIDATING
Boolean
.public static final java.lang.String PARSER_NAMESPACEAWARE
Boolean
.private static final java.lang.String FACTORYNAMEKEY
public void start(org.osgi.framework.BundleContext context) throws java.lang.Exception
This method must complete and return to its caller in a timely manner.
This method attempts to register a SAX and DOM parser with the Framework's service registry.
start
in interface org.osgi.framework.BundleActivator
context
- The execution context of the bundle being started.java.lang.Exception
- If this method throws an exception, this
bundle is marked as stopped and the Framework will remove this
bundle's listeners, unregister all services registered by this
bundle, and release all services used by this bundle.protected java.net.URL getResourceURL(org.osgi.framework.Bundle parserBundle, java.lang.String resname)
public void stop(org.osgi.framework.BundleContext context) throws java.lang.Exception
stop
in interface org.osgi.framework.BundleActivator
context
- The execution context of the bundle being stopped.java.lang.Exception
- If this method throws an exception, the
bundle is still marked as stopped, and the Framework will remove
the bundle's listeners, unregister all services registered by the
bundle, and release all services used by the bundle.private java.util.List getParserFactoryClassNames(java.net.URL parserUrl) throws java.io.IOException
parserUrl
- The URL of the service file containing the parser class
namesjava.io.IOException
- if there is a problem reading the URL input streamprivate void registerSAXParsers(java.util.List parserFactoryClassNames) throws javax.xml.parsers.FactoryConfigurationError
parserFactoryClassNames
- - a List
of
String
objects containing the names of the parser
Factory Classesjavax.xml.parsers.FactoryConfigurationError
- if thrown from getFactory
private void setDefaultSAXProperties(javax.xml.parsers.SAXParserFactory factory, java.util.Hashtable props, int index)
Set the SAX Parser Service Properties. By default, the following properties are set:
SERVICE_DESCRIPTION
SERVICE_PID
PARSER_VALIDATING
- instantiates a parser and queries
it to find out whether it is validating or not
PARSER_NAMESPACEAWARE
- instantiates a parser and
queries it to find out whether it is namespace aware or not
factory
- The SAXParserFactory
objectprops
- Hashtable
of service properties.public void setSAXProperties(javax.xml.parsers.SAXParserFactory factory, java.util.Hashtable properties)
Set the customizable SAX Parser Service Properties.
This method attempts to instantiate a validating parser and a namespace aware parser to determine if the parser can support those features. The appropriate properties are then set in the specified properties object.
This method can be overridden to add additional SAX2 features and properties. If you want to be able to filter searches of the OSGi service registry, this method must put a key, value pair into the properties object for each feature or property. For example, properties.put("http://www.acme.com/features/foo", Boolean.TRUE);
factory
- - the SAXParserFactory objectproperties
- - the properties object for the serviceprivate void registerDOMParsers(java.util.List parserFactoryClassNames) throws javax.xml.parsers.FactoryConfigurationError
parserFactoryClassNames
- - a List
of
String
objects containing the names of the parser
Factory Classesjavax.xml.parsers.FactoryConfigurationError
- if thrown from getFactory
private void setDefaultDOMProperties(javax.xml.parsers.DocumentBuilderFactory factory, java.util.Hashtable props, int index)
SERVICE_DESCRIPTION
SERVICE_PID
PARSER_VALIDATING
PARSER_NAMESPACEAWARE
factory
- The DocumentBuilderFactory
objectprops
- Hashtable
of service properties.public void setDOMProperties(javax.xml.parsers.DocumentBuilderFactory factory, java.util.Hashtable props)
Set the customizable DOM Parser Service Properties.
This method attempts to instantiate a validating parser and a namespace aware parser to determine if the parser can support those features. The appropriate properties are then set in the specified props object.
This method can be overridden to add additional DOM2 features and properties. If you want to be able to filter searches of the OSGi service registry, this method must put a key, value pair into the properties object for each feature or property. For example, properties.put("http://www.acme.com/features/foo", Boolean.TRUE);
factory
- - the DocumentBuilderFactory objectprops
- - Hashtable of service properties.private java.lang.Object getFactory(java.lang.String parserFactoryClassName) throws javax.xml.parsers.FactoryConfigurationError
parserFactoryClassName
- A String
object containing
the name of the parser factory classjavax.xml.parsers.FactoryConfigurationError
public java.lang.Object getService(org.osgi.framework.Bundle bundle, org.osgi.framework.ServiceRegistration registration)
A unique XML Parser Factory object is returned for each call to this method.
The returned XML Parser Factory object will be configured for validating and namespace aware support as specified in the service properties of the specified ServiceRegistration object. This method can be overridden to configure additional features in the returned XML Parser Factory object.
getService
in interface org.osgi.framework.ServiceFactory
bundle
- The bundle using the service.registration
- The ServiceRegistration
object for the
service.public void ungetService(org.osgi.framework.Bundle bundle, org.osgi.framework.ServiceRegistration registration, java.lang.Object service)
ungetService
in interface org.osgi.framework.ServiceFactory
bundle
- The bundle releasing the service.registration
- The ServiceRegistration
object for the
service.service
- The XML Parser Factory object returned by a previous call
to the getService
method.