Некоторе время назад я задумался о том, чтобы выложить часть своих библиотек в общий доступ. И вот наконец дошли руки все подравнять и выложить на GitHub:
Всем известно, что во флеше есть функция describeType. Ее главный минус это скорость работы, для приложения на Андроиде этой скорости явно не хватало, а лишать себя мелких приятностей не хотелось, поэтому я стал смотреть в сторону недокументированной avmplus.describeTypeJSON, которая, правда, работает только с инстансами объектов. Именно этот недостаток и исправляет RObject — она позволяет одинаково работать с классами, интерфейсами и объектами.
Тут все просто — типизированный JSON парсер.
Мэппинг:
Парсинг:
Некоторое встроенное удобство в Air есть, но как это обычно бывает, хотелось большего. Был конечно Flex ORM, но на планшете он просто умирал, кроме того, хотелось использовать Promises/A+. Поддерживается автоматическое создание схемы.
Мэппинг:
Автоматическое создание таблиц, сессия:
Запросы, транзакции, критерии:
Переработанный FlexXB xml-парсер, лучший из известных мне парсеров, но очень медленный, удалось ускорить его в несколько раз.
Пример:
Перехал на GitHub старый проект расширения для работы с HID-устройствами из Adobe Air.
На этом все, спасибо за внимание.
- 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();
}
На этом все, спасибо за внимание.