evgs / BombusLime

Xmpp client for Android devices
http://bombus.im/lime/nightlies
GNU General Public License v2.0
15 stars 1 forks source link

Another XMPP parser #52

Closed ugnich closed 12 years ago

ugnich commented 12 years ago

Пожалуйста, рассмотрите возможность использования другого парсера XMPP. В Android присутствует встроенный pull parser, который вполне можно использовать.

Предлагаю свой проект https://github.com/juick/com.juick.xmpp - эта библиотека для работы с XMPP используется на серверной стороне juick.com, работает стабильно и быстро.

evgs commented 12 years ago

Я рассматривал разные парсеры и всё-таки решил остановиться на гибридном SAX+DOM парсере. Основной плюс такого парсера, по сравнению с pull-моделью - модульность:

  1. Обработчики станз абсолютно независимы друг от друга, за исключением порядка их вызова (приоритета).
  2. Возможность динамического подключения/отключения обработчиков. Классы более неиспользуемых обработчиков могут быть выгружены системой из памяти.
  3. Читаемость кода обработчиков.
  4. Отказоустойчивость. Ошибка в модуле обработчика не приводит к прерыванию разбора потока XML. Минусы:
  5. Выше требования к памяти - станза перед передачей обработчикам должна быть полностью распарсена.
  6. Уязвимость для DOS-атаки переполнением памяти при получении огромной станзы.

На данный момент выгоды от перелопачивания кода в пользу другого парсера для меня слишком сомнительны.

ugnich commented 12 years ago

Спасибо за подробный ответ.

Из списка плюсов соглашусь только с отказоустойчивостью. Да, у pull парсера действительно есть такая проблема, но она решается простейшим тестированием.

Если посмотрите мою библиотеку, увидите, что парсеры каждого типа станз выделены в отдельные классы (пакет extensions) и совершенно независимы. В динамическом подключении/отключении обработчиков я особого смысла не вижу, потому как их немного и они маленькие, а с памятью у современных смартфонов проблемы особой нет. Но, при желании, можно сделать.

Главный акцент при разработке я делал на отделении парсинга от логики приложения и максимальном упрощении библиотеки. У вас же, насколько я могу судить, бегло взглянув на код, всё немного более запутанно.

Выгода в том, чтобы объединить усилия и освободить ресурсы, сосредоточиться на главном: логике приложения и интерфейсе.