Я разрабатываю приложение с помощью OSGi (Платформа равноденствия), и один из пакетов должен проанализировать XML-файлы. До сих пор я реализовал это с SAX (javax.xml.parsers. SAXParserFactory) и я хотел бы получить SAXParserFactory с платформы.
Я видел, что стандарт OSGi предусматривает XMLParserActivator, чтобы позволить реализациям JAXP регистрировать себя (http://www.osgi.org/javadoc/r4v41/org/osgi/util/xml/XMLParserActivator.html), таким образом, мое предположение - то, что должны быть некоторые пакеты, которые предлагают SAXParserFactory как услуга.
Однако я не мог выяснить, какой пакет добавить как зависимость для нахождения сервиса, который предлагает SAXParserFactory. Я пытаюсь получить сервисное ссылочное использование
context.getServiceReferences(SAXParserFactory.class.getName(), "(&(parser.namespaceAware=true)(parser.validating=true))")
Учитывая, что парсинг XML является довольно общей вещью сделать, я предполагаю, что существуют реализации доступные, или другие средства для получения сервиса синтаксического анализатора XML с платформы.
Любая справка очень приветствовалась бы!
Как правило, это не очень хорошая идея использовать JAXP в OSGI (из-за механизма классов в первую очередь) и гораздо лучшее представление о заводе вроде работы.
Если вы используете Equinox, SaxParserFactory (используя JRE / JDK One One On включен) на самом деле предоставляется системной связью, что означает, что вам не нужны дополнительные пакеты:
{javax.xml.parsers .Saxparserfactory} = {service.id = 6} Зарегистрировано Bundle: System Bundle [0]
Если вы хотите написать код, который касается слоя жизненного цикла платформы OSGI, я бы предложил отслеживать ссылку, а не просматривать его напрямую. Для этого есть много подходов; Я написал об одном, я называю ServiceMediator здесь .
E.G. Для вашего случая (код находится под лицензией Apache 2, Coalevo Project):
import org.osgi.framework.*;
import javax.xml.parsers.SAXParserFactory;
import net.wimpi.telnetd.util.Latch;
/**
* Implements a mediator pattern class for services from the OSGi container.
* <p/>
*
* @author Dieter Wimberger (wimpi)
* @version @version@ (@date@)
*/
class ServiceMediator {
private BundleContext m_BundleContext;
private SAXParserFactory m_SAXParserFactory;
private Latch m_SAXParserFactoryLatch;
public SAXParserFactory getSAXParserFactory(long wait) {
try {
if (wait < 0) {
m_SAXParserFactoryLatch.acquire();
} else if (wait > 0) {
m_SAXParserFactoryLatch.attempt(wait);
}
} catch (InterruptedException e) {
e.printStackTrace(System.err);
}
return m_SAXParserFactory;
}//getSAXParserFactory
public boolean activate(BundleContext bc) {
//get the context
m_BundleContext = bc;
m_SAXParserFactoryLatch = createWaitLatch();
//prepareDefinitions listener
ServiceListener serviceListener = new ServiceListenerImpl();
//prepareDefinitions the filter
String filter = "(objectclass=" + SAXParserFactory.class.getName() + ")";
try {
//add the listener to the bundle context.
bc.addServiceListener(serviceListener, filter);
//ensure that already registered Service instances are registered with
//the manager
ServiceReference[] srl = bc.getServiceReferences(null, filter);
for (int i = 0; srl != null && i < srl.length; i++) {
serviceListener.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, srl[i]));
}
} catch (InvalidSyntaxException ex) {
ex.printStackTrace(System.err);
return false;
}
return true;
}//activate
public void deactivate() {
m_SAXParserFactory = null;
m_SAXParserFactoryLatch = null;
m_BundleContext = null;
}//deactivate
private Latch createWaitLatch() {
return new Latch();
}//createWaitLatch
private class ServiceListenerImpl
implements ServiceListener {
public void serviceChanged(ServiceEvent ev) {
ServiceReference sr = ev.getServiceReference();
Object o = null;
switch (ev.getType()) {
case ServiceEvent.REGISTERED:
o = m_BundleContext.getService(sr);
if (o == null) {
return;
} else if (o instanceof SAXParserFactory) {
m_SAXParserFactory = (SAXParserFactory) o;
m_SAXParserFactory.setValidating(false);
m_SAXParserFactory.setNamespaceAware(true);
m_SAXParserFactoryLatch.release();
} else {
m_BundleContext.ungetService(sr);
}
break;
case ServiceEvent.UNREGISTERING:
o = m_BundleContext.getService(sr);
if (o == null) {
return;
} else if (o instanceof SAXParserFactory) {
m_SAXParserFactory = null;
m_SAXParserFactoryLatch = createWaitLatch();
} else {
m_BundleContext.ungetService(sr);
}
break;
}
}
}//inner class ServiceListenerImpl
public static long WAIT_UNLIMITED = -1;
public static long NO_WAIT = 0;
}//class ServiceMediator
] Вы можете использовать Apache Xerces для разбора саксофонов. Подходящий пакет доступен в проекте []Eclipse Orbit []. Я не знаю, что в комплекте Xerces зарегистрирована служба SAXParserFactory, но вы можете добавить зависимость от комплекта и использовать Sax parser напрямую.[
].