Eclipse EDT - EGL Inner Workings - June 2011


Published on

See for more details.

Published in: Technology
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide
  • Author Notes: This is the PowerPoint template for the Innovate 2011 Track Sessions ALL FINAL FILES MUST BE CONVERTED TO LOTUS SYMPHONY. Learn more here: Additional IBM Rational presentation resources can be found on Rational’s Managing the Brand W3 Intranet site: Third party material cannot be used in a presentation without written permission (this includes product and Web page screen shots). Images must be acquired from a ‘royalty-free to use’ source such as: Microsoft Clip Art library http:// / IBMers can use images from: IBM image library:,2#_Section3 Royalty free images in Marketing Asset Manager database (you will need to register to access this site) :
  • Eclipse EDT - EGL Inner Workings - June 2011

    1. 1. The Inner Workings of EGL: a Solution to the Complexities of Modern Application Development Tim W Wilson STSM & EGL Chief Architect, IBM [email_address]
    2. 2. Agenda <ul><li>Motivation for an Open EGL </li></ul><ul><li>Structure of EGL language </li></ul><ul><li>Extending the EGL language </li></ul><ul><ul><li>Adding abstract concepts </li></ul></ul><ul><ul><li>Extending Code Generation </li></ul></ul><ul><li>Demo </li></ul><ul><ul><li>Extended Java code generation for native Android application </li></ul></ul>
    3. 3. Evolution of Language Abstraction Hardware OS Runtime Platform Assembler C, COBOL Java EGL One One One One One One One Many Many Many One Single Machine Multiple Machine Future One Many Evolution of Execution Environment Evolution of Programming Languages Range of Deployment Options
    4. 4. Model Driven Development (MDD) and Platform Independence <ul><li>MDD uses UML to define Platform Independent Models (PIMs) </li></ul><ul><li>Model Compilers read these models and ‘compile’ them to Platform Specific Models (PSMs) </li></ul><ul><ul><li>Abstract concepts mapped to concrete implementations for a given platform </li></ul></ul><ul><li>If all programming can stay at the PIM level then one can say that the programming language is Platform Independent </li></ul><ul><li>UML is just another programming language when used to program an entire application without ever dropping down into the generated code </li></ul><ul><ul><li>Why should it be the only programming language that does this? </li></ul></ul>
    5. 5. EGL Compiler as Model Compiler <ul><li>EGL is a programming language mixed together with a modeling mechanism and extensible model compiler </li></ul><ul><ul><li>Designed with the intention of expressing precise execution semantics </li></ul></ul><ul><li>What is an Extensible Model Compiler? </li></ul><ul><ul><li>New concepts added to programming model </li></ul></ul><ul><ul><ul><li>e.g. Entity, UI programming model, new Datatypes (i.e. ZonedUnicodeDecimal) </li></ul></ul></ul><ul><ul><li>Existing compiler extended to map instances of new concepts used in the code to appropriate runtime </li></ul></ul><ul><ul><li>Very high fidelity interleaving of new extended code generation into existing code generation </li></ul></ul><ul><ul><ul><li>Can override/extend any aspect down to low level Expressions </li></ul></ul></ul><ul><li>The term ‘Extension’ in the context of EGL means anything added in the programming model that requires the code generation be extended to implement the specified semantics of the extensions </li></ul>
    6. 6. Motivation for Open EGL: EGL Development Tools on Eclipse (EDT) <ul><li>EGL can target diverse platforms for the same code because it models everything in a platform independent way </li></ul><ul><ul><li>Platform specifics are stated as input to model compiler </li></ul></ul><ul><li>IBM has been the only one able to define new abstractions and transformations </li></ul><ul><li>General interest in this approach can only occur if others can do the same thing </li></ul><ul><li>The purpose of EDT is to provide others the ability to: </li></ul><ul><ul><li>create domain specific extensions, i.e. UI programming, DB IO, etc </li></ul></ul><ul><ul><li>create new or extend existing transforms to make concrete the new extensions </li></ul></ul><ul><ul><li>have development environment (IDE) able to use these extended compilers </li></ul></ul><ul><ul><ul><li>i.e. debug at EGL source code level for java and javascript target environments </li></ul></ul></ul>
    7. 7. Agenda <ul><li>Motivation for an Open EGL </li></ul><ul><li>Structure of EGL language </li></ul><ul><li>Extending the EGL language </li></ul><ul><ul><li>Adding abstract concepts </li></ul></ul><ul><ul><li>Extending Code Generation </li></ul></ul><ul><li>Demo </li></ul><ul><ul><li>Extended Java code generation for native Android application </li></ul></ul>
    8. 8. EGL Basic Concepts <ul><li>Various component types that programmers can define </li></ul><ul><ul><li>Data Item – Creates a Type alias from extended data declaration </li></ul></ul><ul><ul><li>Record - aggregate of typed fields into new type </li></ul></ul><ul><ul><li>Program - Main program starts run unit – used for batch processing </li></ul></ul><ul><ul><li>Library – Static set of data and functions – local to run-unit </li></ul></ul><ul><ul><li>Service – Remotable set of functions </li></ul></ul><ul><ul><li>Interface – Abstract definition of a Service </li></ul></ul><ul><ul><li>Handler – Object-based component containing instance data and functions </li></ul></ul><ul><ul><li>ExternalType – Abstract type definition of a type implementation that exists outside of EGL </li></ul></ul><ul><li>Annotations and Stereotypes </li></ul><ul><ul><li>Meta data applied to program elements </li></ul></ul><ul><ul><li>Drives transformations as well as tooling </li></ul></ul><ul><li>Abstract Statements meant to be extended </li></ul><ul><ul><li>get, add, delete, replace, close, call, etc. </li></ul></ul>
    9. 9. EGL Syntactic Structure All type definitions are in a package Imports of types outside current package Declaration of a program Data and Function declarations Statements and Expressions Extensible IO Statement Function invocation
    10. 10. Extending EGL <ul><li>Extension means: </li></ul><ul><ul><li>Any addition that requires the compiler be extended to map the extension to an appropriate runtime </li></ul></ul><ul><li>Categories of Extension </li></ul><ul><ul><li>Native Types </li></ul></ul><ul><ul><ul><li>Type definitions that are abstract only and depend on the compiler to map them to appropriate runtime type </li></ul></ul></ul><ul><ul><li>Simple Types - types that have no internal structure </li></ul></ul><ul><ul><ul><li>Is a special kind of native type </li></ul></ul></ul><ul><ul><li>Stereotypes, Annotations - metadata applied to types and members </li></ul></ul><ul><ul><li>Extensible Action Statements </li></ul></ul><ul><ul><ul><li>Statements sensitive to the Stereotype metadata associated with its operands </li></ul></ul></ul>
    11. 11. EGL Extensions: Simple Types <ul><li>There are no built-in ‘primitive types’ in EGL </li></ul><ul><li>All types have an explicit definition </li></ul><ul><li>Simple types highlighted as keywords are aliases for some explicit type definition </li></ul><ul><li>Types aliases are configurable </li></ul><ul><li>All valid operators are defined on each type </li></ul><ul><li>Valid conversions between types defined explicitly </li></ul>decimal  egl.lang.AnyDecimal string  egl.lang.AnyString
    12. 12. Simple Type Example: egl.lang.AnyDecimal <ul><li>All Simple Types are externaltype declarations </li></ul><ul><ul><li>External types denote the implementation is outside of EGL </li></ul></ul><ul><ul><li>The type declaration signifies to the compiler how the type can be used </li></ul></ul><ul><ul><li>Code generation will map the use of these types to appropriate runtime </li></ul></ul>Previous code example
    13. 13. EGL Extensions: Native Types <ul><li>Native types are abstract definitions that represent some native implementation </li></ul><ul><li>The compiler is responsible for mapping uses of a given type to an implementation </li></ul><ul><li>SysLib is a Native Type </li></ul><ul><li>The function writeStdOut () is mapped to platform specific implementation </li></ul><ul><ul><li>Java: System.out.println() </li></ul></ul><ul><ul><li>COBOL: DISPLAY… </li></ul></ul><ul><li>Native types allow modeling of platform independent concepts </li></ul><ul><li>Extensible code generation allows the use of these types to be folded into an existing compiler </li></ul>
    14. 14. Native Type Example: egl.lang.SysLib Completely abstract API – concrete implementations dependent on target platform
    15. 15. EGL Extensions: Stereotypes and Annotations <ul><li>Stereotypes allow typed metadata to be applied to any type </li></ul><ul><li>Annotations allow typed metadata to be applied to any member (field, function…) </li></ul>
    16. 16. EGL Extensions: Extensible Action Statements <ul><li>EGL contains a set of abstract ‘Action’ statements </li></ul><ul><ul><li>add, close, delete, get, open, replace, etc </li></ul></ul><ul><li>Action statements have an abstract execution specification that is made concrete by the metadata associated with the given operands </li></ul><ul><ul><li>get – read an object from a data source </li></ul></ul><ul><ul><li>add – add an object to a data source </li></ul></ul><ul><li>This example shows the use of a variable in which its type has the ‘ Entity ’ stereotype applied </li></ul><ul><li>The abstract semantic of GET plus the supplied metadata of ‘ Entity ’ allows a concrete specification </li></ul><ul><li>Code generator extended to implement the GET as an SQL SELECT statement </li></ul><ul><ul><li>Entity metadata supplied the necessary mapping to the database tables </li></ul></ul>
    17. 17. EDT – Code compilation process Java EGL Source Code EGL Compiler Model Extensible Code Generation Framework Java JavaScript C/C++ .Net … Pluggable Generators Eclipse JEE Dojo Pluggable Extension Examples Possible Android COBOL CICS/IMS
    18. 18. EGL Structure: The EGL Model
    19. 19. EGL Model So – how are all these classes defined?
    20. 20. EGL Program Definition: Detail <ul><li>All EGL Model Classes are a subclass of Element </li></ul><ul><li>All EGL Model Classes are instances of EClass as denoted by the <<EClass>> stereotyping in the diagram </li></ul><ul><li>What is an EClass? </li></ul>
    21. 21. The MOF (Meta Object Framework) Model
    22. 22. EDT MOF Framework <ul><li>All values are instances of EObject – including EClass </li></ul><ul><li>All EObject values have a reference to their EClass instance </li></ul><ul><li>Dynamic interface for manipulating EObjects </li></ul><ul><ul><li>e.g. myEObject.eGet( “field1” ) </li></ul></ul><ul><li>Serialization to Binary or XML form </li></ul><ul><ul><li>Abstracted such that other serializations possible </li></ul></ul><ul><ul><li>Replaces Intermediate Representation (IR) files seen in RBD today </li></ul></ul><ul><li>Java Class generator for creating specific java classes for each EClass </li></ul><ul><ul><li>High performance </li></ul></ul><ul><ul><li>Easier programming </li></ul></ul><ul><li>Transformation framework </li></ul><ul><ul><li>Initial java class implementations of each EClass generated using this framework </li></ul></ul><ul><ul><li>All EGL code generators based off same framework </li></ul></ul>
    23. 23. The EDT Modeling Framework: org.eclipse.edt.mof <ul><li>MOF (Meta Object Framework) Model </li></ul><ul><ul><li>Meta model used to create other models </li></ul></ul><ul><ul><li>Used to create the EGL Model </li></ul></ul><ul><li>EGL Model </li></ul><ul><ul><li>Meta model used by compiler to create EGL elements </li></ul></ul><ul><ul><li>Program, Record, Expression, etc </li></ul></ul><ul><li>EGL syntax can be used to define both MOF and EGL model elements </li></ul><ul><ul><li>EGL Compiler can create instances of either model </li></ul></ul><ul><ul><li>EGL can therefore be used to define arbitrary models </li></ul></ul>MOF Model EGL Model
    24. 24. Using EGL to define a Model <ul><li>EGL Meta Model defined by EGL itself </li></ul><ul><li>Special Stereotype MofClass tells compiler to create EClass instances instead of ExternalType instances </li></ul>Compiler creates EClass instance because of MofClass Stereotype Compiler creates normal Externaltype instance
    25. 25. XML Serialization of EClass - StructPart This object is an instance of org.eclipse.edt.mof.EClass Instances of org.eclipse.edt.mof.egl.Field
    26. 26. XML Serialization of ExternalType - Customer This object is an instance of org.eclipse.edt.mof.egl.ExternalType Instances of org.eclipse.edt.mof.egl.Field
    27. 27. Agenda <ul><li>Motivation for an Open EGL </li></ul><ul><li>Structure of EGL language </li></ul><ul><li>Extending the EGL language </li></ul><ul><ul><li>Adding abstract concepts </li></ul></ul><ul><ul><li>Extending Code Generation </li></ul></ul><ul><li>Demo </li></ul><ul><ul><li>Extended Java code generation for native Android application </li></ul></ul>
    28. 28. Module Structure of EDT: org.eclipse.edt org.eclipse.edt.ide org.eclipse.edt.core org.eclipse.edt.gen
    29. 29. Extensible Model Compilers: org.eclipse.edt.gen <ul><li>Core Model Transformation framework </li></ul><ul><ul><li>Model to Model, i.e. EDT MOF model to EMF model </li></ul></ul><ul><ul><li>Model to Text, i.e. EGL Model model to Java </li></ul></ul><ul><li>All EDT code generation based upon this framework </li></ul><ul><li>Simple and lightweight and highly extensible </li></ul><ul><li>Extensibility comes from configurable ‘Templates’ </li></ul><ul><ul><li>A Template is simply a java Class </li></ul></ul><ul><ul><li>Each model element has a Template associated with it </li></ul></ul><ul><ul><li>Each Template implements methods that perform some transformation on its given model element </li></ul></ul><ul><ul><li>All template method invocation follows the inheritance hierarchy of the given model </li></ul></ul><ul><ul><ul><li>If a given template method does not exist in the specific template of the model element method lookup will go up the super type chain </li></ul></ul></ul><ul><ul><li>Extending an existing transformation is simply a matter of adding and replacing templates with new ones that: </li></ul></ul><ul><ul><ul><li>Add new </li></ul></ul></ul><ul><ul><ul><li>Replace the original </li></ul></ul></ul><ul><ul><ul><li>Extend the original </li></ul></ul></ul>
    30. 30. Content of a Generator <ul><li>The purpose of a ‘Generator’ is to transform instances of some model into either text or instances of some other model </li></ul><ul><li>A ‘Generator’ is composed of a set of ‘Templates’ </li></ul><ul><ul><li>Each Template is a simple Java class </li></ul></ul><ul><ul><li>Each model class has an associated Template </li></ul></ul><ul><ul><li>All transformations handled in the templates </li></ul></ul><ul><ul><ul><li>Validation </li></ul></ul></ul><ul><ul><ul><li>Model to Model transformation (M2M) </li></ul></ul></ul><ul><ul><ul><li>Model to Text (M2T) </li></ul></ul></ul><ul><li>Extending a Generator means: </li></ul><ul><ul><li>Adding new templates </li></ul></ul><ul><ul><li>Overriding existing templates </li></ul></ul><ul><ul><ul><li>Complete override </li></ul></ul></ul><ul><ul><ul><li>Pre/post processing with invocation of super class methods </li></ul></ul></ul>
    31. 31. The EDT Code Generation Framework: org.eclipse.edt.mof.codegen.api <ul><li>Framework composed of two basic classes </li></ul><ul><ul><li>org.eclipse.edt.mof.codegen.api.Template </li></ul></ul><ul><ul><ul><li>Transformation/validation implementation </li></ul></ul></ul><ul><ul><ul><li>Usually one Template class per Model class that needs transformation </li></ul></ul></ul><ul><ul><li>org.eclipse.edt.mof.codegen.api.Context </li></ul></ul><ul><ul><ul><li>Contains the global state of a transformation </li></ul></ul></ul><ul><ul><ul><li>Implements dynamic template method Invocation </li></ul></ul></ul><ul><li>Context implements dynamic invocation of methods on Templates </li></ul><ul><ul><li>Object invoke (String methodName, Object object, Object…args) </li></ul></ul><ul><ul><li>Object invokeSuper (String methodName, Object object, Object…args) </li></ul></ul><ul><li>Dynamic invocation means: </li></ul><ul><ul><li>Look up the template associated with Class of the second parameter - Object object </li></ul></ul><ul><ul><li>Look up the method with the given method name methodName and signature based on the args Object…args </li></ul></ul><ul><ul><li>Invoke method on the template passing object and args </li></ul></ul>
    32. 32. EGL Model to Template Associations <ul><li>Each Model Class has associated Template </li></ul><ul><li>Each Template implements sets of methods for various purposes </li></ul><ul><ul><li>Analysis, Validation, Code generation </li></ul></ul><ul><ul><li>Methods in each set implement a particular API clients invoke for particular situations </li></ul></ul><ul><li>Templates themselves do NOT follow inheritance of the model </li></ul><ul><ul><li>Dynamic template method invocation follows the inheritance chain of the model </li></ul></ul><ul><ul><li>Allows for easy overriding of Template classes </li></ul></ul><ul><ul><ul><li>Replacing Template classes does not interfere with any Template hierarchy </li></ul></ul></ul>ProgramTemplate ClassTemplate StructTemplate ClassifierTemplate NamedElementTemplate ElementTemplate
    33. 33. Mapping File of EDT Core Java Generator EGL Model type signature=Template java class type signature
    34. 34. Dynamic Template Method Invocation Example: Java Generation of Program <ul><li>Appropriate Template looked up based on Class of part argument </li></ul><ul><ul><li>Program  ProgramTemplate </li></ul></ul><ul><li>genPart() method lookup in ProgramTemplate </li></ul><ul><ul><li>If not found go up the super type chain of Program and look for the genPart() method in the associated Template for that super type </li></ul></ul><ul><ul><ul><li>EGLClass  ClassTemplate </li></ul></ul></ul><ul><li>If not found continue up the chain until found </li></ul><ul><li>Invoke genPart(part, context, out) </li></ul>This approach allows one to think about transformation implementation as if the methods were actually implemented in the model classes themselves
    35. 35. Dynamic Invocation Example: Field Template Lookup starts at Field but moves up to NamedElement <ul><li>FieldTemplate </li></ul><ul><li>genDeclaration () </li></ul><ul><li>MemberTemplate </li></ul><ul><li>genDeclaration () </li></ul><ul><li>NamedElementTemplate </li></ul><ul><li>genName() </li></ul>ElementTemplate
    36. 36. EDT Core Generators <ul><li>EDT will provide ‘core’ generators for Java and JavaScript </li></ul><ul><li>A ‘core’ generator is one that implements a transformation to a target runtime technology that adheres to the semantics of the ‘Core’ EGL Language </li></ul><ul><li>EGL Core will be the EGL specification containing: </li></ul><ul><ul><li>Syntax and semantics for declaring EGL definitions </li></ul></ul><ul><ul><li>Execution semantics for statements and expressions </li></ul></ul><ul><ul><li>Semantic descriptions for extensible IO statements </li></ul></ul><ul><ul><ul><li>GET, ADD, etc. with no description for specifics like SQL access </li></ul></ul></ul><ul><li>EGL Core will not specify any metadata specifications except for those necessary to define other metadata </li></ul><ul><ul><li>Annotation and Stereotype are types themselves known to the compiler </li></ul></ul>Core generators
    37. 37. EDT Extended Generators <ul><li>An Extended Generator contains: </li></ul><ul><ul><li>Specific set of metadata types, i.e. SQLRecord, TextProgram, etc </li></ul></ul><ul><ul><li>Extension to a core generator with new templates built for new set of metadata types </li></ul></ul><ul><ul><li>Runtime support libraries if necessary </li></ul></ul><ul><li>EDT will also provide a set of extended generators to support common platforms </li></ul><ul><li>JEE Generator extends core Java generator </li></ul><ul><ul><li>Support of Web Services, JPA, etc. </li></ul></ul><ul><li>Core JavaScript Generator extended to handle current RUI programming model </li></ul>Extended generators
    38. 38. Android Generator: an example
    39. 39. UI Programming Model Example: Define Native Types <ul><li>Abstract concepts derived from concepts common across UI frameworks </li></ul><ul><ul><li>Window – deployable UI unit </li></ul></ul><ul><ul><ul><li>Android – Activity </li></ul></ul></ul><ul><ul><ul><li>Web – HTML Page </li></ul></ul></ul><ul><ul><li>View – Super type of all UI controls </li></ul></ul><ul><ul><ul><li>Android – View </li></ul></ul></ul><ul><ul><ul><li>SWT – Widget </li></ul></ul></ul><ul><ul><li>ViewGroup – contains View children </li></ul></ul><ul><ul><ul><li>Android – ViewGroup </li></ul></ul></ul><ul><ul><ul><li>Dojo – Container </li></ul></ul></ul><ul><ul><li>TableLayout – kind of ViewGroup for Tables </li></ul></ul>Window View ViewGroup TableLayout 1 contentView * children
    40. 40. UI Programming Model Example: Define Native Types in EGL Abstract concepts defined using Externaltype with AbstractType stereotype Event handlers modeled as Delegates Inheritance modeled directly Externaltype declarations allow for full Class modeling
    41. 41. UI Programming Model Example: Define Concepts in EGL Core UI Concepts Stereotypes for implementation Concrete Widgets
    42. 42. UI Programming Model Example: Define Stereotypes for Implementation <ul><li>Native Types by definition are abstract and have no specific EGL implementation </li></ul><ul><li>Stereotypes allow EGL implementation definitions to be part of an object model introduced with the native types. </li></ul><ul><li>defaultSuperType setting means that any handler stereotyped by WindowHandler will subclass the Window native type </li></ul><ul><li>Allows abstract API of Window to be accessed anywhere within a handler stereotyped by WindowHandler </li></ul><ul><li>Extended Generator will fold in appropriate implementation for the abstract API anywhere in the code it is accessed </li></ul>
    43. 43. Example Usage: Mortgage Calculator Event handler declaration Stereotype used to implement a Window Similar conceptually to RUIHandler Invocation of the Amortize Service Declaration of Widgets and properties
    44. 44. Mapping to Target Platform: Android and Dojo <ul><li>Abstract concepts need concrete mapping to intended runtime platform </li></ul><ul><li>Native Android is a Java framework </li></ul><ul><ul><li>Android generator would be an extension of the core EDT Java generator </li></ul></ul><ul><li>Dojo is a JavaScript framework </li></ul><ul><ul><li>Dojo generator would be an extension of the core EDT JavaScript generator </li></ul></ul><ul><li>This example shows a simple mapping to Android platform </li></ul><ul><ul><li>Use of widgets and layout </li></ul></ul><ul><ul><li>Calling a web service </li></ul></ul>
    45. 45. Mapping File of EDT Core Java Generator EGL Model type signature=Template java class type signature
    46. 46. Map Android Model to Android Templates Mapping of model classes to their templates Overrides of EGL Core Java Templates
    47. 47. Create Necessary Templates Override existing method from Template from Base Java Generator Template method invocation
    48. 48. Android Mortgage Calculator Example
    49. 49. Android Mortgage Calculator Detail Native type abstract API access
    50. 50. Mapping Native Types to Runtime Types EGL native type type signature = Runtime java class type signature
    51. 51. Native Type Template Example: TextViewTemplate <ul><li>All native type API access handled in the template associated with particular native type </li></ul><ul><li>Native type templates understand the mapping of the model to the runtime </li></ul><ul><ul><li>Will use the runtime java class API </li></ul></ul><ul><li>Delegation will occur for the following Expression types: </li></ul><ul><ul><li>Assignment </li></ul></ul><ul><ul><li>Name, MemberAccess </li></ul></ul><ul><ul><li>FunctionInvocation </li></ul></ul>aTextView.text = “123”; aTextView.setText(“123”); EGL Generated Java aStr = aTextView.text; aStr = aTextView.getText();
    52. 52. Create the AndroidGenerator Command Line Tool Android generator extends core Java generator Adds command line parameters as necessary Define where the configuration is for adding and overriding code generation templates Define where the configuration is for mapping native types to concrete classes in the runtime
    53. 53. Plugging Android Generator into the IDE <ul><li>Implement a few simple classes in an IDE plug-in </li></ul><ul><ul><li>GeneratorProvider </li></ul></ul><ul><ul><li>TabProvider </li></ul></ul><ul><ul><li>Extension of the command line generator to be invoked by EGL builder </li></ul></ul><ul><li>Example Android IDE plug-in classes </li></ul><ul><ul><li> </li></ul></ul><ul><ul><li> </li></ul></ul><ul><ul><li> </li></ul></ul>
    54. 54. Workspace Preferences: EGL Compiler <ul><li>Multiple EGL Compilers in the IDE </li></ul><ul><li>Each compiler can have multiple generators associated with it </li></ul><ul><li>Workspace preference defines default settings for EGL Compiler for a new EGL Project </li></ul><ul><li>Project specific settings can override these defaults for each EGL Project </li></ul>
    55. 55. For more information visit our project page <ul><li>Project schedules </li></ul><ul><ul><li>Including detailed 0.7.0 iteration/milestone plans </li></ul></ul><ul><li>Downloadable builds and source </li></ul><ul><li>Committers and status </li></ul><ul><li>New and noteworthy </li></ul><ul><li>Documentation </li></ul><ul><li>Presentations </li></ul><ul><li>Access to bugs and requirements </li></ul> EDT 0.7.0 M1 now available!
    56. 56. Thank You