RoadmapThis is the current roadmap for Otis library. It contains features which are needed, as well as features which are fun. Some of them will probably never be implemented. It could also be changed at any time. Feel free to suggest anything you think might be missing, or boo anything that you consider wrong, broken, stupid or useless. Version 0.1- Configuration via attributes and XML
- XML sources: standalone file, embedded resource
- Standard expression mapping
- IList to/from Array
- XML schema to support intellisense in Visual Studio
- Custom configuration providers
- Assembler generation: in-memory, on the file system, source code only
- Helper functions for custom conversions
- Expression formatting
- Null Value handling
Version 0.2- Aggregate functions
- Simplified string expressions
- Projections: constant -> constant (e.g. enum -> enum, enum->string, constant->enum, ...)
Version 0.2.34.1- this is a nightly build which fixes some bugs and adds some minor features
- new aggregate function: concat
- support for complex path items in aggregates: $Projects/Name -> $Projects/Name.Length
- performance improvements
- fixed: issue #3 : automatically add assemblies for base types/interfaces (in version 0.2.17)
- fixed: issue #5 - NullValue handling
Version 0.2.68.1 (Available for download)Version 0.3 (in work)- Easier sub-component mapping (like "component" in NHibernate)
- Factories, factory methods
- Better default/null value handling (also for value types)
- Preprocessing helper functions (like existing helpers, but called before transformation) (implemented as of 06.03.08)
- Injectable Code Generators to implement Custom Assemblers
- Injectable Namespace Name Provider
- Injectable Assembler Name Providers
- Performance improvements (ideally to 10% margin of hand written assemblers performance) (implemented as of 07.03.08, currently ~35% slower)
Version 0.4- NHibernate uninitialized collections and references
- Events for hooking into conversion process
- Inheritance issues
- Better debugging support
- Aggregate function parameters: [Map("concat':$Documents/Name")]
Version 0.5- Move all strings to resources
- Localization (e.g. for DateTime conversions)
Future versions- Reverse (bidirectional) conversion
- Tool for generation of XML mapping from attributes
- Standalone assembly/source code generator (can be used as a part of an automated build)
- Object->map transformation: user.FirstName -> userMap["FirstName"]
- Filtering: [Map("$Projects/Tasks", Filter = "$Duration > 3"]
- Statistics
- Contexts
- Type safe mapping via delegates: something like [Map({(User u) => u.First + " " + u.Last})] in C#3.0
|
Excellent work !
Would the current release work with (non collection) types that are lazy loaded with Nhibernate?
-Ahmed
Thanks, Ahmed.
This is planned for version 0.4. I hope it will be available in May/June
Is it possible to browse the Otis subversion repository? The Google code subversion repository for Otis seems to be empty.
-Ahmed
Not currently, i plan to do it around version 0.4/0.5. However, you can download the source from the downloads page.
I think this is a great project. Do you still think that your 0.3 release will happen yet this month?
thanks llamaboy. I believe that there is ~50% chance that 0.3 will be released until the end of the month, but currently a combination of some business trips and rock concerts are conspiring against my free time :)
Good work, this is realy a useful project. I'm ver excited about next releases and ready for help in project!
First of all, thanks for putting this out there. We are using Otis to map a deeply nested target to a fairly flat source object. Can you tell me if it is possible to map the following situation using XML map definition:
ClassTargetRoot? -> ClassSourceRoot?
I think there should be no problems with it. I will try to post a sample tonight.
Ok, sooner than i thought: there is a new post on Wiki page: MappingNestedTargets
Hi, you made a very complex and interesting work here. I observe your project for a very long time. Are you still working on it? Unfortunaly, since nearly 9 months i see no changes on it. Maybe you need some support from outside. I'm interested in helding you, if you want.
Thank you, M. Wolff
hi Marco,
thanks for interest in Otis. I have no intention to stop working on it, but unfortunately life doesn't care about my intentions :) lots of thing happened both on professional (much more work to do) and personal (baby coming) plan.
however, I would like to at least implement all of the 0.3 features, and any help is welcome, especially bug fixing (e.g. issue #7 craves for patch) and documentation writing. Feel free to send any patches to me and i will review and integrate them.
@zdeslav
Who do I contact about submitting patches? Additionally I am unable to browse the source via Subversion so can't really make patches.
I have made a slue of changes to the .68 release that you may or may not be interested in and was just hoping to talk to you about it.
Thanks, Joe
hi Joe,
thanks a lot for your effort.
of course, i am very interested in your patches, you can send them to me and I will integrate them. I plan to commit source to SVN when some additional issues are fixed (that would probably match version 0.3), but it may happen sooner.
thanks again, zdeslav
The changes are pretty extensive so far and I'm still working on the bulk of them, perhaps you would like to chat about them first. My email is username at gmail.
Great project guys! Quick question...
Would it be possible to add the ability to call instance methods of the source class?
Something similar to this: expression="$instance.GetValue(['MyValue'])
sure, try this: expression="$GetValue(parameters)
'$' actually means the same as 'source.' Please not that quote escaping (string'?) works in a different way. You have to escape the whole expression, not just the string part, so in your case it would look like this: expression="$instance.GetValue('MyValue')?"
see examples: otis\src\Otis.Tests\XmlMappings\mappings.xml otis\src\Otis.Sample\Mappings\mappings.otis.xml
ok, formatting got screwed up. What I meant about escaping was this:
expression="[$instance.GetValue('MyValue')]
That makes perfect sense now that I look at the syntax more closely.
Thank you for the help and the quick response and keep up the good work!
Just wanted to say that it works very nicely and that for future reference to anyone else looking here, the expression looks like this:
expression="[(string)$GetValue('MyValue')]"