Бібліотеки, які ще можуть стати в нагоді

    Деякий час тому я задумався про те, щоб викласти частину своїх бібліотек в загальний доступ. І ось нарешті дійшли руки все підрівняти і викласти на 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();
              }

 
На цьому все, спасибі за увагу.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.