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

от автора

Некоторе время назад я задумался о том, чтобы выложить часть своих библиотек в общий доступ. И вот наконец дошли руки все подравнять и выложить на 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.<String> = Vector.<String>(["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(TestCriteriaEntity);      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(0x8001, 0xA00F);//0x8001, 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();               } 

На этом все, спасибо за внимание.

ссылка на оригинал статьи http://habrahabr.ru/post/226305/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *