Используя реализацию синтаксического анализатора XML как сервис OSGi

Я разрабатываю приложение с помощью 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 с платформы.

Любая справка очень приветствовалась бы!

7
задан Manuel Bernhardt 21 July 2009 в 11:09
поделиться

2 ответа

Как правило, это не очень хорошая идея использовать 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
3
ответ дан 7 December 2019 в 18:45
поделиться
[

] Вы можете использовать Apache Xerces для разбора саксофонов. Подходящий пакет доступен в проекте []Eclipse Orbit []. Я не знаю, что в комплекте Xerces зарегистрирована служба SAXParserFactory, но вы можете добавить зависимость от комплекта и использовать Sax parser напрямую.[

].
-1
ответ дан 7 December 2019 в 18:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: