Библиотеки, которые еще могут пригодиться

Некоторе время назад я задумался о том, чтобы выложить часть своих библиотек в общий доступ. И вот наконец дошли руки все подравнять и выложить на GitHub: RObject — интроспеция с помощью describeTypeJSON JsonMapper — типизированный JSON парсер As3Query — DSL и ORM для Sqlite FlexXB Mobile — оптимизированный xml-парсер FlexXB air-hid-usb — расширение для работы с HID устройствами RObjectВсем известно, что во флеше есть функция describeType. Ее главный минус это скорость работы, для приложения на Андроиде этой скорости явно не хватало, а лишать себя мелких приятностей не хотелось, поэтому я стал смотреть в сторону недокументированной avmplus.describeTypeJSON, которая, правда, работает только с инстансами объектов. Именно этот недостаток и исправляет RObject — она позволяет одинаково работать с классами, интерфейсами и объектами. var flags: int = R.VARIABLES | R.METADATA | R.TRAITS; var descriptor: Object = R.describe (test, flags); JsonMapper Тут все просто — типизированный JSON парсер.Мэппинг:

public class JsonVO { [Serialized (required=«true»)] public var id: String = null;

[Serialized (required=«false»)] public var name: String = null;

[Serialized] [ArrayElementType («converter.rest.vo.JsonVO»)] public var properties: Array;

[Serialized] [ArrayElementType («String»)] public var vector: Vector. = Vector.([«test», «test»]);

[Serialized] [ArrayElementType («converter.rest.vo.JsonVO»)] public var nested: Array = [];

[Serialized] [ArrayElementType («int»)] public var aCollection: ArrayCollection = new ArrayCollection ([1, 2, 3]); }

var mapper: JsonMapper = new JsonMapper (); mapper.registerClass (JsonVO); Парсинг: var result: JsonVO = new JsonDecoder (mapper).decode (message, JsonVO); As3Query Некоторое встроенное удобство в Air есть, но как это обычно бывает, хотелось большего. Был конечно Flex ORM, но на планшете он просто умирал, кроме того, хотелось использовать Promises/A+. Поддерживается автоматическое создание схемы.Мэппинг:

[Table (name=«test»)] [Index (name=«test_index_1», columns=«unsigned, bool»)] [Index (name=«test_index_2», columns=«str», unique=«true»)] public dynamic class TestEntity { [Column (primaryKey, nullable=«false»)] public var id: int;

[Column (default=»1»)] public var unsigned: uint;

[Column (unique=«true»)] public var date: Date;

[Column] public var xml: XML;

[Column] public var str: String;

[Column (foreignKey=«table (id)», options=«deferred»)] public var fk_table: String; }

var entityManager: EntityMapper = new EntityMapper (); entityManager.registerEntity (TestEntity); Автоматическое создание таблиц, сессия:

var connection: SQLConnection = new SQLConnection (); connection.open (file, SQLMode.CREATE); try { new CreateTables (connection, [TestEntity], mapper).call (); } finally { if (connection.connected) { connection.close (); } }

var session: Session = new Session (mapper); session.open (file.nativePath, SQLMode.UPDATE).then (function (): void{ trace ('ok') }); Запросы, транзакции, критерии:

//criteria session.criteria (TestEntity).by (Order.asc (TestEntity.ATTR_ID)).list.then (function (operation: ISQLOperation): void{ trace (operation.result); }); session.criteria (TestEntity).when (Restrictions.Eq (TestEntity.ATTR_ID, 1)).unique.then (function (operation: ISQLOperation): void{ trace (operation.result); }); session.criteria (TestEntity).when (Restrictions.Eq (TestEntity.ATTR_ID, 1)).count.then (function (count: int): void{ trace (count); });

//create or update session.save (testCriteriaEntity1).then (function (): void{ trace ('ok') });

//remove session.remove (testCriteriaEntity1).then (function (): void{ trace ('ok') });

//transactions var transaction: ITransaction = session.transaction;

transaction.insert (testCriteriaEntity1); transaction.remove (testCriteriaEntity1);

transaction.run.then (function (operation: ISQLOperation): void{ trace ('ok'); });

//raw query var query: IQuery = session.query; query.text = «update test set str=: str where str=: id»; query.parameters[»: id»] = «inserted2»; query.parameters[»: str»] = «inserted3»; query.run.then (function (operation: ISQLOperation): void{ trace ('ok'); }); FlexXB Mobile Переработанный FlexXB xml-парсер, лучший из известных мне парсеров, но очень медленный, удалось ускорить его в несколько раз.Пример:

[Bindable] [XmlClass (alias=«DynamicProperty»)] public class DynamicProperty { [XmlAttribute (alias=«value»)] public var value: int;

[XmlElement (alias=«property»)] public var property: Property;

[XmlAttribute (alias=«enabled»)] public var enabled: Boolean; } air-hid-usb Перехал на GitHub старый проект расширения для работы с HID-устройствами из Adobe Air. var manager: IHIDManager = HIDFactory.getHIDManager ();

var deviceInfos: Array = manager.getDeviceList (0×8001, 0xA00F);//0×8001, 0xA00F var wmouse: HidDeviceInfo; for each (var hidDeviceInfo: HidDeviceInfo in deviceInfos) { if (hidDeviceInfo.interface_number == 1) { wmouse = hidDeviceInfo; break; } } if (wmouse) { log.info («getDeviceByPath {0}», wmouse); var device: IHIDDevice = manager.getDeviceByPath (wmouse.path); if (device.open ()) { log.info («getManufacturerString: {0}», device.getManufacturerString ()); log.info («getProductString: {0}», device.getProductString ()); log.info («getSerialNumberString: {0}», device.getSerialNumberString ()); device.close (); } device.dispose (); } На этом все, спасибо за внимание.

© Habrahabr.ru