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

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


    На этом все, спасибо за внимание.
    • +13
    • 7.9k
    • 4
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 4

      0
      Ого, сколько лет использую Flex, но многое тут для меня в новинку. Может и литературу подскажете? :)
        0
        Литература по флексу осталась на уровне «как поменять цвет границы» и вряд ли это уже изменится, так что если читать, то только какие-то блоги или смотреть код.

        Еще одна вещь, которую очень хочется — вменяемый редактор проперти-файлов(почему они сделали структуру отличную от java?), где можно перекидывать ключи из файла в файл претаскиванием, где есть подсветка ошибок, недостающих ключей, импорт и тп. Может быть допишу, если запал не угаснет.

        www.bytearray.org/ — внезапно переключился на Swift 0_o.
          0
          про уровень литературы — это я заметил. С JavaScript в 2004 году так же было.
        0
        Кому-нибудь эта статья помогла?

        Only users with full accounts can post comments. Log in, please.