SlideShare a Scribd company logo
1 of 65
Download to read offline
Modeling Industry Data
          with
Eclipse Modeling Project
       Sven Efftinge (itemis AG)
     Dr. Jan Koehnlein (itemis AG)
Eclipse Banking Day
Frameworks and Tools
used to design, use and process
Domain-Specific Languages
EMF
GMF

      EMF
GMF         TMF

      EMF
GMF         TMF

      EMF

M2M
GMF         TMF

      EMF

M2M         M2T
Experiences made in
 a real world project
Initial Situation




• DB-Application
• Oracle DB
• Oracle Forms
Goal


• Oracle DB
• Java Rich Client
• JPA
• Spring
• Swing / JGoodies Forms
Quantities
• 1722 tables
Quantities
• 1722 tables
• 19572 columns
Quantities
• 1722 tables
• 19572 columns
• over 300 Forms
Quantities
• 1722 tables
• 19572 columns
• over 300 Forms

Our job
Quantities
• 1722 tables
• 19572 columns
• over 300 Forms

Our job
• Find suitable abstractions
Quantities
• 1722 tables
• 19572 columns
• over 300 Forms

Our job
• Find suitable abstractions
• Simplify code
Domain Model
@SuppressWarnings(quot;serialquot;)
@Entity
 Entity
@Table(name = quot;BUCHUNGSKREISE_Fquot;)
               BUCHUNGSKREISE_F
public class BuchungskreiseF extends AbstractEntity implements Serializable {
	

	   @SuppressWarnings(quot;unusedquot;)
	   @Id
     Id
	   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = quot;bkrIdSeqquot;)
	   @SequenceGenerator(name = quot;bkrIdSeqquot;, sequenceName = quot;BKR_SEQquot;, allocationSize = 1)
                                                          BKR_SEQ
	   @Column(name = quot;BKR_IDquot;, nullable = false
                    BKR_ID              false)
	   private Long bkrId
                 bkrId;

	   public Long getBkrId() {
	   	   return bkrId;
	   }

	   public void setBkrId(final Long bkrId) {
	   	   this.bkrId = bkrId;
	   }

	   @Column(name = quot;KONTO_NRquot;, nullable = false length = 45
                    KONTO_NR              false,         45)
	   private String kontoNr;
                   kontoNr

	   public String getKontoNr() {
	   	   return kontoNr;
	   }

	   public void setKontoNr(final String kontoNr) {
	   	   String oldValue = this.kontoNr;
	   	   this.kontoNr = kontoNr;
	   	   firePropertyChangeEvent(quot;kontoNrquot;, oldValue, this.kontoNr);
	   }
@SuppressWarnings(quot;serialquot;)
@Entity
 Entity
@Table(name = quot;BUCHUNGSKREISE_Fquot;)
               BUCHUNGSKREISE_F
public class BuchungskreiseF extends AbstractEntity implements Serializable {
	

	   @SuppressWarnings(quot;unusedquot;)
	   @Id
     Id
	   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = quot;bkrIdSeqquot;)
	   @SequenceGenerator(name = quot;bkrIdSeqquot;, sequenceName = quot;BKR_SEQquot;, allocationSize = 1)
                                                          BKR_SEQ
	   @Column(name = quot;BKR_IDquot;, nullable = false
                    BKR_ID              false)
	   private Long bkrId
                 bkrId;

	   public Long getBkrId() {
	   	   return bkrId;
	   }

	   public void setBkrId(final Long bkrId) {
	   	   this.bkrId = bkrId;
	   }

	   @Column(name = quot;KONTO_NRquot;, nullable = false length = 45
                    KONTO_NR              false,         45)
	   private String kontoNr;
                   kontoNr

	   public String getKontoNr() {
	   	   return kontoNr;
	   }

	   public void setKontoNr(final String kontoNr) {
	   	   String oldValue = this.kontoNr;
	   	   this.kontoNr = kontoNr;
	   	   firePropertyChangeEvent(quot;kontoNrquot;, oldValue, this.kontoNr);
	   }
External DSL with TMF Xtext

entity BuchungskreiseF
  (id=bkrId sequenceName=BKR_SEQ) {

    String kontoNr (notNull, length=45)

    Long rgNrBkrIdentifikator (notNull, length=1)

    String referenzcodeKontoNr (notNull, length=45)

}
External DSL with TMF Xtext

entity BuchungskreiseF
  (id=bkrId sequenceName=BKR_SEQ) {

    String kontoNr

    Long rgNrBkrIdentifikator

    String referenzcodeKontoNr

}
External DSL with TMF Xtext
                          BUCHUNGSKREISE_F

entity BuchungskreiseF
  (id=bkrId sequenceName=BKR_SEQ) {

    String kontoNr
                                 RG_NR_BKR_IDENTIFIKATOR

    Long rgNrBkrIdentifikator

    String referenzcodeKontoNr

}
entity BuchungskreiseF
  (id=bkrId sequenceName=BKR_SEQ) {
}
entity BuchungskreiseF
              (id=bkrId sequenceName=BKR_SEQ) {
            }




                              TABLE BUCHUNGSKREISE_F
                                                                                  ID      NAME    PROP1    DATE    ATTR1
ID        NAME   PROP1        DATE   ATTR1


                                          ID      NAME    PROP1       DATE        ATTR1




                         ID     NAME    PROP1     DATE        ATTR1




                                                                             ID        NAME      PROP1    DATE    ATTR1



     ID      NAME    PROP1       DATE     ATTR1



                                                         ID      NAME   PROP1          DATE      ATTR1


                    ID        NAME     PROP1    DATE     ATTR1




                                                                                                                           Database Schema
Eclipse Banking Day
Number of Characters (Domain model DSL)
                           30.000 (DSL)
                         + 50.000 (code generator)
 With DSL
                         + 170 / Entity
                             7000 / Entity
 Without DSL
300 TZ

240 TZ

               11 Entities
180 TZ

120 TZ

 60 TZ

  0 TZ
         0                    20                     40
Views
Eclipse Banking Day
public class PersonenForm extends
Form<Personen> {
public class PersonenForm extends
Form<Personen> {
public class PersonenForm extends
     Form<Personen> {




    public class PersonenHauptSubForm extends
SubForm<Personen> {
public class PersonenForm extends
Form<Personen> {




                                        public class PersonenHauptSubForm extends
                                    SubForm<Personen> {
public class PersonenForm extends
   Form<Personen> {




                                           public class PersonenHauptSubForm extends
                                       SubForm<Personen> {




private JComponent
vornameTextField;
public class PersonenForm extends
Form<Personen> {




                                                             public class PersonenHauptSubForm extends
                                                         SubForm<Personen> {




                                    private JComponent
                                    vornameTextField;
public class PersonenForm extends
        Form<Personen> {




                                                                     public class PersonenHauptSubForm extends
                                                                 SubForm<Personen> {




    @Override
    protected void initComponents() {
       ...
       vornameTextField =
       builder.createTextField(desc.vorname(),
                                            private JComponent
                                            vornameTextField;




           Editable.PROPERTY_DEFAULT,
           MANDATORY);
	   	 gepardBuilder.setNoLeadingBlanks
           (vornameTextField);
public class PersonenForm extends
Form<Personen> {




                                                                                  public class PersonenHauptSubForm extends
                                                                              SubForm<Personen> {




                                                             @Override
                                                             protected void initComponents() {
                                                                ...
                                                                vornameTextField =
                                    private JComponent
                                                                builder.createTextField(desc.vorname(),
                                    vornameTextField;
                                                                    Editable.PROPERTY_DEFAULT,
                                                                    MANDATORY);
                                                         	   	 gepardBuilder.setNoLeadingBlanks
                                                                    (vornameTextField);
public class PersonenForm extends
        Form<Personen> {




                                                                                          public class PersonenHauptSubForm extends
                                                                                      SubForm<Personen> {




    @Override
	   protected JComponent buildPanel() {
       TwoColumnsPanelBuilder builder =                              @Override
                                                                     protected void initComponents() {
                                                                        ...



           TwoColumnsPanelBuilder.instance(getBuilderFactory(),
                                                                        vornameTextField =
                                            private JComponent
                                                                        builder.createTextField(desc.vorname(),
                                            vornameTextField;
                                                                            Editable.PROPERTY_DEFAULT,
                                                                            MANDATORY);
                                                                 	   	 gepardBuilder.setNoLeadingBlanks



              getResourceMap());
                                                                            (vornameTextField);




       ...
       builder.add(quot;vornamequot;, vornameTextField);
public class PersonenForm extends
Form<Personen> {




                                                                                   public class PersonenHauptSubForm extends
                                                                               SubForm<Personen> {




                                                             @Override
                                                             protected void initComponents() { @Override
                                                                ...                        	 protected JComponent buildPanel() {
                                                                                                  TwoColumnsPanelBuilder builder =
                                                                vornameTextField =
                                    private JComponent
                                                                builder.createTextField(desc.vorname(),
                                                                                                      TwoColumnsPanelBuilder.instance(getBuilderFactory(),
                                    vornameTextField;
                                                                                                         getResourceMap());
                                                                    Editable.PROPERTY_DEFAULT,
                                                                    MANDATORY);                   ...
                                                                                                  builder.add(quot;vornamequot;, vornameTextField);
                                                         	   	 gepardBuilder.setNoLeadingBlanks
                                                                    (vornameTextField);
Why not GUI-Builder?
         •   No control over generated
             code

         •   Too many details

         •   Do not directly leverage
             information from the domain
             models
Graphical GUI-DSL with GMF
Graphical GUI-DSL with GMF
ID          NAME    PROP1    DATE    ATTR1
ID        NAME   PROP1        DATE   ATTR1




                                                                                                                                                     Referencing
                                          ID      NAME    PROP1           DATE        ATTR1




                         ID     NAME    PROP1     DATE        ATTR1




                                                                                 ID      NAME        PROP1    DATE    ATTR1



     ID      NAME    PROP1       DATE     ATTR1



                                                         ID      NAME       PROP1         DATE       ATTR1


                    ID        NAME     PROP1    DATE     ATTR1



                                                                           model : gepard;
                                                                           import quot;platform:/resource/com.affichage.it21.gp.dao/src/main/model/types.daoquot;

                                                                           com.affichage.it21.gp.dao {

                                                                      	                 flaechen       {
                                                                      	                 	              readOnly entity WaehrungF (id =(rvLowValue)) {
                                                                      	                 	              }
                                                                      	                 	              readOnly entity GepardVerwendungPvF (id =(pvOid)) {
                                                                      	                 	              	        temporal manyToOne GeschpartnerAllBsF geschpartner (joinColum
                                                                      	                 	              }
                                                                      	                 }
                                                                      	
                                                                      	                 verkauf       {
                                                                      	                 	              readOnly       entity GepardVerwendungKdvtF (id =(kdvtId)) {
                                                                      	                 	              	              temporal notNull manyToOne GeschpartnerAllBsF geschpartner (j
                                                                      	                 	              	              notNull Number istLangfrist (castTo=Boolean)
                                                                      	                 	              	              notNull Number istLokaldispo (castTo=Boolean)
                                                                      	                 	              }
                                                                      	                 }

                                                                      	                 gepard {
                                                                      	                 	        readOnly entity AbcKundenF (id = (rvLowValue)) {
Validation
Eclipse Banking Day
addValidator(new Validator<Institutionen>() {
	 	 	 @Override
	 	 	 public ValidationResult validate(final Institutionen institution) {
	 	 	 	 final ValidationResult result = new ValidationResult();
	 	 	 	 if (institution != null
                  && institution.getEsrNr() != null
					              && !CheckUtils.checkPcKontoNrPruefziffer(
                        Long.parseLong(institution.getEsrNr())) {
	 	 	 	 	 result.add(new SimpleValidationMessage(
                        getResourceMap().getString(quot;validation.esr.msgquot;),
                        Severity.ERROR, getModel(Institutionen.DESC.esrNr())));
				}
	 	 	 	 return result;
			}
	 	 });
Eliminate framework code




addValidator(new Validator<Institutionen>() {
	 	 	 @Override
	 	 	 public ValidationResult validate(final Institutionen institution) {
	 	 	 	 final ValidationResult result = new ValidationResult();
	 	 	 	 if (institution != null
                  && institution.getEsrNr() != null
					              && !CheckUtils.checkPcKontoNrPruefziffer(
                        Long.parseLong(institution.getEsrNr())) {
	 	 	 	 	 result.add(new SimpleValidationMessage(
                        getResourceMap().getString(quot;validation.esr.msgquot;),
                        Severity.ERROR, getModel(Institutionen.DESC.esrNr())));
				}
	 	 	 	 return result;
			}
	 	 });
Eliminate framework code
Avoid repetitive null pointer checks



addValidator(new Validator<Institutionen>() {
	 	 	 @Override
	 	 	 public ValidationResult validate(final Institutionen institution) {
	 	 	 	 final ValidationResult result = new ValidationResult();
	 	 	 	 if (institution != null
                  && institution.getEsrNr() != null
					              && !CheckUtils.checkPcKontoNrPruefziffer(
                        Long.parseLong(institution.getEsrNr())) {
	 	 	 	 	 result.add(new SimpleValidationMessage(
                        getResourceMap().getString(quot;validation.esr.msgquot;),
                        Severity.ERROR, getModel(Institutionen.DESC.esrNr())));
				}
	 	 	 	 return result;
			}
	 	 });
Eliminate framework code
Avoid repetitive null pointer checks
Use static imports

addValidator(new Validator<Institutionen>() {
	 	 	 @Override
	 	 	 public ValidationResult validate(final Institutionen institution) {
	 	 	 	 final ValidationResult result = new ValidationResult();
	 	 	 	 if (institution != null
                  && institution.getEsrNr() != null
					              && !CheckUtils.checkPcKontoNrPruefziffer(
                        Long.parseLong(institution.getEsrNr())) {
	 	 	 	 	 result.add(new SimpleValidationMessage(
                        getResourceMap().getString(quot;validation.esr.msgquot;),
                        Severity.ERROR, getModel(Institutionen.DESC.esrNr())));
				}
	 	 	 	 return result;
			}
	 	 });
Eliminate framework code
Avoid repetitive null pointer checks
Use static imports
Use and define library methods
addValidator(new Validator<Institutionen>() {
	 	 	 @Override
	 	 	 public ValidationResult validate(final Institutionen institution) {
	 	 	 	 final ValidationResult result = new ValidationResult();
	 	 	 	 if (institution != null
                  && institution.getEsrNr() != null
					              && !CheckUtils.checkPcKontoNrPruefziffer(
                        Long.parseLong(institution.getEsrNr())) {
	 	 	 	 	 result.add(new SimpleValidationMessage(
                 error(quot;validation.esr.msgquot;, desc.esrNr());
                        getResourceMap().getString(quot;validation.esr.msgquot;),
                        Severity.ERROR, getModel(Institutionen.DESC.esrNr())));
				}
	 	 	 	 return result;
			}
	 	 });
Internal DSL in Java
	   @Check
    void checkEsrMsg() {
	   	 if (!checkKontoNrPruefziffer(parseLong(_this.getEsrNr())))
	   	 	 error(quot;validation.esr.msgquot;,desc.esrNr());
	   }


       • Junit-like
       • catches null pointer exceptions
Why do we want to

abstract?
Software Life-Cycle Costs (Schach 2002)




                            Requirements
                            Specification
                            Design
                            Coding
                            Unit Testing
                            Integration
                            Maintenance
Software Life-Cycle Costs (Schach 2002)


         2%

                            Requirements
                            Specification
                            Design
                            Coding
                            Unit Testing
                            Integration
                            Maintenance
Software Life-Cycle Costs (Schach 2002)


         2% 5%

                            Requirements
                            Specification
                            Design
                            Coding
                            Unit Testing
                            Integration
                            Maintenance
Software Life-Cycle Costs (Schach 2002)


         2% 5%
                 6%
                            Requirements
                            Specification
                            Design
                            Coding
                            Unit Testing
                            Integration
                            Maintenance
Software Life-Cycle Costs (Schach 2002)


         2% 5%
                 6%
                            Requirements
                      5%
                            Specification
                            Design
                            Coding
                            Unit Testing
                            Integration
                            Maintenance
Software Life-Cycle Costs (Schach 2002)


         2% 5%
                 6%
                            Requirements
                      5%
                            Specification
                            Design
                       7%

                            Coding
                            Unit Testing
                            Integration
                            Maintenance
Software Life-Cycle Costs (Schach 2002)


         2% 5%
                 6%
                            Requirements
                      5%
                            Specification
                            Design
                       7%

                            Coding
                       8%   Unit Testing
                            Integration
                            Maintenance
Software Life-Cycle Costs (Schach 2002)


         2% 5%
                 6%
                            Requirements
                      5%
                            Specification
                            Design
                       7%

                            Coding
                       8%   Unit Testing
                            Integration
 67%

                            Maintenance
Software maintenance - proportional costs
Software maintenance - proportional costs
Software Rots
Finance related applications
    of Eclipse Modeling
Questions ?

More Related Content

What's hot

Pragmatic metaprogramming
Pragmatic metaprogrammingPragmatic metaprogramming
Pragmatic metaprogrammingMårten Rånge
 
The art of readable code (ch1~ch4)
The art of readable code (ch1~ch4)The art of readable code (ch1~ch4)
The art of readable code (ch1~ch4)Ki Sung Bae
 
Introduction à dart
Introduction à dartIntroduction à dart
Introduction à dartyohanbeschi
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Pythonkwatch
 
2 introduction toentitybeans
2 introduction toentitybeans2 introduction toentitybeans
2 introduction toentitybeansashishkirpan
 
The Art Of Readable Code
The Art Of Readable CodeThe Art Of Readable Code
The Art Of Readable CodeBaidu, Inc.
 
F# Eye For The C# Guy - Seattle 2013
F# Eye For The C# Guy - Seattle 2013F# Eye For The C# Guy - Seattle 2013
F# Eye For The C# Guy - Seattle 2013Phillip Trelford
 
A Critical Look at Fixtures
A Critical Look at FixturesA Critical Look at Fixtures
A Critical Look at FixturesActsAsCon
 
Embedding Languages Without Breaking Tools
Embedding Languages Without Breaking ToolsEmbedding Languages Without Breaking Tools
Embedding Languages Without Breaking ToolsLukas Renggli
 
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFrom java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFabio Collini
 

What's hot (19)

Clean code
Clean codeClean code
Clean code
 
Pragmatic metaprogramming
Pragmatic metaprogrammingPragmatic metaprogramming
Pragmatic metaprogramming
 
Clean code
Clean codeClean code
Clean code
 
Clean code
Clean codeClean code
Clean code
 
The art of readable code (ch1~ch4)
The art of readable code (ch1~ch4)The art of readable code (ch1~ch4)
The art of readable code (ch1~ch4)
 
Lecture21
Lecture21Lecture21
Lecture21
 
Introduction à dart
Introduction à dartIntroduction à dart
Introduction à dart
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 
2 introduction toentitybeans
2 introduction toentitybeans2 introduction toentitybeans
2 introduction toentitybeans
 
The Art Of Readable Code
The Art Of Readable CodeThe Art Of Readable Code
The Art Of Readable Code
 
F# Eye For The C# Guy - Seattle 2013
F# Eye For The C# Guy - Seattle 2013F# Eye For The C# Guy - Seattle 2013
F# Eye For The C# Guy - Seattle 2013
 
SOLID PRINCIPLES
SOLID PRINCIPLESSOLID PRINCIPLES
SOLID PRINCIPLES
 
A Critical Look at Fixtures
A Critical Look at FixturesA Critical Look at Fixtures
A Critical Look at Fixtures
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
OOP in PHP
OOP in PHPOOP in PHP
OOP in PHP
 
Embedding Languages Without Breaking Tools
Embedding Languages Without Breaking ToolsEmbedding Languages Without Breaking Tools
Embedding Languages Without Breaking Tools
 
Portfolio Martin Roy
Portfolio Martin RoyPortfolio Martin Roy
Portfolio Martin Roy
 
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFrom java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
 
Clean code
Clean codeClean code
Clean code
 

Viewers also liked

Challenges In Dsl Design
Challenges In Dsl DesignChallenges In Dsl Design
Challenges In Dsl DesignSven Efftinge
 
Xtend - A Language Made for Java Developers
Xtend - A Language Made for Java DevelopersXtend - A Language Made for Java Developers
Xtend - A Language Made for Java DevelopersSebastian Zarnekow
 
Introduction to Xbase
Introduction to XbaseIntroduction to Xbase
Introduction to XbaseHolger Schill
 
Dependency Injection for Eclipse developers
Dependency Injection for Eclipse developersDependency Injection for Eclipse developers
Dependency Injection for Eclipse developersSven Efftinge
 
Language Engineering With Xtext
Language Engineering With XtextLanguage Engineering With Xtext
Language Engineering With XtextSven Efftinge
 

Viewers also liked (8)

Gwt and Xtend
Gwt and XtendGwt and Xtend
Gwt and Xtend
 
Challenges In Dsl Design
Challenges In Dsl DesignChallenges In Dsl Design
Challenges In Dsl Design
 
Xtend - A Language Made for Java Developers
Xtend - A Language Made for Java DevelopersXtend - A Language Made for Java Developers
Xtend - A Language Made for Java Developers
 
Eclipse Xtend
Eclipse XtendEclipse Xtend
Eclipse Xtend
 
Introduction to Xbase
Introduction to XbaseIntroduction to Xbase
Introduction to Xbase
 
Getting rid of backtracking
Getting rid of backtrackingGetting rid of backtracking
Getting rid of backtracking
 
Dependency Injection for Eclipse developers
Dependency Injection for Eclipse developersDependency Injection for Eclipse developers
Dependency Injection for Eclipse developers
 
Language Engineering With Xtext
Language Engineering With XtextLanguage Engineering With Xtext
Language Engineering With Xtext
 

Similar to Eclipse Banking Day

Clean code _v2003
 Clean code _v2003 Clean code _v2003
Clean code _v2003R696
 
Demoiselle 2.0 no JavaOne Brasil 2010
Demoiselle 2.0 no JavaOne Brasil 2010Demoiselle 2.0 no JavaOne Brasil 2010
Demoiselle 2.0 no JavaOne Brasil 2010Cleverson Sacramento
 
Best of build 2021 - C# 10 & .NET 6
Best of build 2021 -  C# 10 & .NET 6Best of build 2021 -  C# 10 & .NET 6
Best of build 2021 - C# 10 & .NET 6Moaid Hathot
 
Creating a Facebook Clone - Part XXXI - Transcript.pdf
Creating a Facebook Clone - Part XXXI - Transcript.pdfCreating a Facebook Clone - Part XXXI - Transcript.pdf
Creating a Facebook Clone - Part XXXI - Transcript.pdfShaiAlmog1
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokusHamletDRC
 
Having issues with passing my values through different functions aft.pdf
Having issues with passing my values through different functions aft.pdfHaving issues with passing my values through different functions aft.pdf
Having issues with passing my values through different functions aft.pdfrajkumarm401
 
Struts 2 + Spring
Struts 2 + SpringStruts 2 + Spring
Struts 2 + SpringBryan Hsueh
 
Ast transformations
Ast transformationsAst transformations
Ast transformationsHamletDRC
 
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)James Titcumb
 
Using DAOs without implementing them
Using DAOs without implementing themUsing DAOs without implementing them
Using DAOs without implementing thembenfante
 
Embedded Typesafe Domain Specific Languages for Java
Embedded Typesafe Domain Specific Languages for JavaEmbedded Typesafe Domain Specific Languages for Java
Embedded Typesafe Domain Specific Languages for JavaJevgeni Kabanov
 
Querydsl fin jug - june 2012
Querydsl   fin jug - june 2012Querydsl   fin jug - june 2012
Querydsl fin jug - june 2012Timo Westkämper
 

Similar to Eclipse Banking Day (20)

Clean code _v2003
 Clean code _v2003 Clean code _v2003
Clean code _v2003
 
Ejb3 Dan Hinojosa
Ejb3 Dan HinojosaEjb3 Dan Hinojosa
Ejb3 Dan Hinojosa
 
Demoiselle 2.0 no JavaOne Brasil 2010
Demoiselle 2.0 no JavaOne Brasil 2010Demoiselle 2.0 no JavaOne Brasil 2010
Demoiselle 2.0 no JavaOne Brasil 2010
 
Best of build 2021 - C# 10 & .NET 6
Best of build 2021 -  C# 10 & .NET 6Best of build 2021 -  C# 10 & .NET 6
Best of build 2021 - C# 10 & .NET 6
 
Creating a Facebook Clone - Part XXXI - Transcript.pdf
Creating a Facebook Clone - Part XXXI - Transcript.pdfCreating a Facebook Clone - Part XXXI - Transcript.pdf
Creating a Facebook Clone - Part XXXI - Transcript.pdf
 
Kick Start Jpa
Kick Start JpaKick Start Jpa
Kick Start Jpa
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
 
C# 7.0, 7.1, 7.2
C# 7.0, 7.1, 7.2C# 7.0, 7.1, 7.2
C# 7.0, 7.1, 7.2
 
TechTalk - Dotnet
TechTalk - DotnetTechTalk - Dotnet
TechTalk - Dotnet
 
Os Leonard
Os LeonardOs Leonard
Os Leonard
 
Having issues with passing my values through different functions aft.pdf
Having issues with passing my values through different functions aft.pdfHaving issues with passing my values through different functions aft.pdf
Having issues with passing my values through different functions aft.pdf
 
Classes and Inheritance
Classes and InheritanceClasses and Inheritance
Classes and Inheritance
 
Clean coding-practices
Clean coding-practicesClean coding-practices
Clean coding-practices
 
Struts 2 + Spring
Struts 2 + SpringStruts 2 + Spring
Struts 2 + Spring
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
 
Using DAOs without implementing them
Using DAOs without implementing themUsing DAOs without implementing them
Using DAOs without implementing them
 
Embedded Typesafe Domain Specific Languages for Java
Embedded Typesafe Domain Specific Languages for JavaEmbedded Typesafe Domain Specific Languages for Java
Embedded Typesafe Domain Specific Languages for Java
 
Domain Driven Design 101
Domain Driven Design 101Domain Driven Design 101
Domain Driven Design 101
 
Querydsl fin jug - june 2012
Querydsl   fin jug - june 2012Querydsl   fin jug - june 2012
Querydsl fin jug - june 2012
 

More from Sven Efftinge

Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With XtextSven Efftinge
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendSven Efftinge
 
Functional programming with Xtend
Functional programming with XtendFunctional programming with Xtend
Functional programming with XtendSven Efftinge
 
Codegeneration With Xtend
Codegeneration With XtendCodegeneration With Xtend
Codegeneration With XtendSven Efftinge
 
Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)Sven Efftinge
 
Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Sven Efftinge
 
This Is Not Your Father's Java
This Is Not Your Father's JavaThis Is Not Your Father's Java
This Is Not Your Father's JavaSven Efftinge
 
Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Sven Efftinge
 
Xtext at MDD Day 2010
Xtext at MDD Day 2010Xtext at MDD Day 2010
Xtext at MDD Day 2010Sven Efftinge
 
Code Generation in Agile Projects
Code Generation in Agile ProjectsCode Generation in Agile Projects
Code Generation in Agile ProjectsSven Efftinge
 
Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)Sven Efftinge
 
Xtext @ Profict Summer Camp
Xtext @ Profict Summer CampXtext @ Profict Summer Camp
Xtext @ Profict Summer CampSven Efftinge
 
Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)Sven Efftinge
 

More from Sven Efftinge (18)

Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With Xtext
 
Future of Xtext
Future of XtextFuture of Xtext
Future of Xtext
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with Xtend
 
Functional programming with Xtend
Functional programming with XtendFunctional programming with Xtend
Functional programming with Xtend
 
Codegeneration With Xtend
Codegeneration With XtendCodegeneration With Xtend
Codegeneration With Xtend
 
Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)
 
Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012
 
This Is Not Your Father's Java
This Is Not Your Father's JavaThis Is Not Your Father's Java
This Is Not Your Father's Java
 
Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]
 
Xtext at MDD Day 2010
Xtext at MDD Day 2010Xtext at MDD Day 2010
Xtext at MDD Day 2010
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
Code Generation in Agile Projects
Code Generation in Agile ProjectsCode Generation in Agile Projects
Code Generation in Agile Projects
 
Xtext Eclipse Con
Xtext Eclipse ConXtext Eclipse Con
Xtext Eclipse Con
 
Generic Editor
Generic EditorGeneric Editor
Generic Editor
 
Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)
 
Xtext @ Profict Summer Camp
Xtext @ Profict Summer CampXtext @ Profict Summer Camp
Xtext @ Profict Summer Camp
 
Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)
 
Scala
ScalaScala
Scala
 

Recently uploaded

How to become a GDSC Lead GDSC MI AOE.pptx
How to become a GDSC Lead GDSC MI AOE.pptxHow to become a GDSC Lead GDSC MI AOE.pptx
How to become a GDSC Lead GDSC MI AOE.pptxKaustubhBhavsar6
 
Outage Analysis: March 5th/6th 2024 Meta, Comcast, and LinkedIn
Outage Analysis: March 5th/6th 2024 Meta, Comcast, and LinkedInOutage Analysis: March 5th/6th 2024 Meta, Comcast, and LinkedIn
Outage Analysis: March 5th/6th 2024 Meta, Comcast, and LinkedInThousandEyes
 
Flow Control | Block Size | ST Min | First Frame
Flow Control | Block Size | ST Min | First FrameFlow Control | Block Size | ST Min | First Frame
Flow Control | Block Size | ST Min | First FrameKapil Thakar
 
The New Cloud World Order Is FinOps (Slideshow)
The New Cloud World Order Is FinOps (Slideshow)The New Cloud World Order Is FinOps (Slideshow)
The New Cloud World Order Is FinOps (Slideshow)codyslingerland1
 
Scenario Library et REX Discover industry- and role- based scenarios
Scenario Library et REX Discover industry- and role- based scenariosScenario Library et REX Discover industry- and role- based scenarios
Scenario Library et REX Discover industry- and role- based scenariosErol GIRAUDY
 
Planetek Italia Srl - Corporate Profile Brochure
Planetek Italia Srl - Corporate Profile BrochurePlanetek Italia Srl - Corporate Profile Brochure
Planetek Italia Srl - Corporate Profile BrochurePlanetek Italia Srl
 
TrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie WorldTrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie WorldTrustArc
 
CyberSecurity - Computers In Libraries 2024
CyberSecurity - Computers In Libraries 2024CyberSecurity - Computers In Libraries 2024
CyberSecurity - Computers In Libraries 2024Brian Pichman
 
March Patch Tuesday
March Patch TuesdayMarch Patch Tuesday
March Patch TuesdayIvanti
 
.NET 8 ChatBot with Azure OpenAI Services.pptx
.NET 8 ChatBot with Azure OpenAI Services.pptx.NET 8 ChatBot with Azure OpenAI Services.pptx
.NET 8 ChatBot with Azure OpenAI Services.pptxHansamali Gamage
 
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENTSIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENTxtailishbaloch
 
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024Alkin Tezuysal
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfCheryl Hung
 
UiPath Studio Web workshop series - Day 1
UiPath Studio Web workshop series  - Day 1UiPath Studio Web workshop series  - Day 1
UiPath Studio Web workshop series - Day 1DianaGray10
 
EMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? WebinarEMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? WebinarThousandEyes
 
Graphene Quantum Dots-Based Composites for Biomedical Applications
Graphene Quantum Dots-Based Composites for  Biomedical ApplicationsGraphene Quantum Dots-Based Composites for  Biomedical Applications
Graphene Quantum Dots-Based Composites for Biomedical Applicationsnooralam814309
 
UiPath Studio Web workshop series - Day 2
UiPath Studio Web workshop series - Day 2UiPath Studio Web workshop series - Day 2
UiPath Studio Web workshop series - Day 2DianaGray10
 
Patch notes explaining DISARM Version 1.4 update
Patch notes explaining DISARM Version 1.4 updatePatch notes explaining DISARM Version 1.4 update
Patch notes explaining DISARM Version 1.4 updateadam112203
 
Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)Muhammad Tiham Siddiqui
 
3 Pitfalls Everyone Should Avoid with Cloud Data
3 Pitfalls Everyone Should Avoid with Cloud Data3 Pitfalls Everyone Should Avoid with Cloud Data
3 Pitfalls Everyone Should Avoid with Cloud DataEric D. Schabell
 

Recently uploaded (20)

How to become a GDSC Lead GDSC MI AOE.pptx
How to become a GDSC Lead GDSC MI AOE.pptxHow to become a GDSC Lead GDSC MI AOE.pptx
How to become a GDSC Lead GDSC MI AOE.pptx
 
Outage Analysis: March 5th/6th 2024 Meta, Comcast, and LinkedIn
Outage Analysis: March 5th/6th 2024 Meta, Comcast, and LinkedInOutage Analysis: March 5th/6th 2024 Meta, Comcast, and LinkedIn
Outage Analysis: March 5th/6th 2024 Meta, Comcast, and LinkedIn
 
Flow Control | Block Size | ST Min | First Frame
Flow Control | Block Size | ST Min | First FrameFlow Control | Block Size | ST Min | First Frame
Flow Control | Block Size | ST Min | First Frame
 
The New Cloud World Order Is FinOps (Slideshow)
The New Cloud World Order Is FinOps (Slideshow)The New Cloud World Order Is FinOps (Slideshow)
The New Cloud World Order Is FinOps (Slideshow)
 
Scenario Library et REX Discover industry- and role- based scenarios
Scenario Library et REX Discover industry- and role- based scenariosScenario Library et REX Discover industry- and role- based scenarios
Scenario Library et REX Discover industry- and role- based scenarios
 
Planetek Italia Srl - Corporate Profile Brochure
Planetek Italia Srl - Corporate Profile BrochurePlanetek Italia Srl - Corporate Profile Brochure
Planetek Italia Srl - Corporate Profile Brochure
 
TrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie WorldTrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie World
 
CyberSecurity - Computers In Libraries 2024
CyberSecurity - Computers In Libraries 2024CyberSecurity - Computers In Libraries 2024
CyberSecurity - Computers In Libraries 2024
 
March Patch Tuesday
March Patch TuesdayMarch Patch Tuesday
March Patch Tuesday
 
.NET 8 ChatBot with Azure OpenAI Services.pptx
.NET 8 ChatBot with Azure OpenAI Services.pptx.NET 8 ChatBot with Azure OpenAI Services.pptx
.NET 8 ChatBot with Azure OpenAI Services.pptx
 
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENTSIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
SIM INFORMATION SYSTEM: REVOLUTIONIZING DATA MANAGEMENT
 
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
UiPath Studio Web workshop series - Day 1
UiPath Studio Web workshop series  - Day 1UiPath Studio Web workshop series  - Day 1
UiPath Studio Web workshop series - Day 1
 
EMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? WebinarEMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? Webinar
 
Graphene Quantum Dots-Based Composites for Biomedical Applications
Graphene Quantum Dots-Based Composites for  Biomedical ApplicationsGraphene Quantum Dots-Based Composites for  Biomedical Applications
Graphene Quantum Dots-Based Composites for Biomedical Applications
 
UiPath Studio Web workshop series - Day 2
UiPath Studio Web workshop series - Day 2UiPath Studio Web workshop series - Day 2
UiPath Studio Web workshop series - Day 2
 
Patch notes explaining DISARM Version 1.4 update
Patch notes explaining DISARM Version 1.4 updatePatch notes explaining DISARM Version 1.4 update
Patch notes explaining DISARM Version 1.4 update
 
Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)
 
3 Pitfalls Everyone Should Avoid with Cloud Data
3 Pitfalls Everyone Should Avoid with Cloud Data3 Pitfalls Everyone Should Avoid with Cloud Data
3 Pitfalls Everyone Should Avoid with Cloud Data
 

Eclipse Banking Day

  • 1. Modeling Industry Data with Eclipse Modeling Project Sven Efftinge (itemis AG) Dr. Jan Koehnlein (itemis AG)
  • 3. Frameworks and Tools used to design, use and process Domain-Specific Languages
  • 4. EMF
  • 5. GMF EMF
  • 6. GMF TMF EMF
  • 7. GMF TMF EMF M2M
  • 8. GMF TMF EMF M2M M2T
  • 9. Experiences made in a real world project
  • 10. Initial Situation • DB-Application • Oracle DB • Oracle Forms
  • 11. Goal • Oracle DB • Java Rich Client • JPA • Spring • Swing / JGoodies Forms
  • 14. Quantities • 1722 tables • 19572 columns • over 300 Forms
  • 15. Quantities • 1722 tables • 19572 columns • over 300 Forms Our job
  • 16. Quantities • 1722 tables • 19572 columns • over 300 Forms Our job • Find suitable abstractions
  • 17. Quantities • 1722 tables • 19572 columns • over 300 Forms Our job • Find suitable abstractions • Simplify code
  • 19. @SuppressWarnings(quot;serialquot;) @Entity Entity @Table(name = quot;BUCHUNGSKREISE_Fquot;) BUCHUNGSKREISE_F public class BuchungskreiseF extends AbstractEntity implements Serializable { @SuppressWarnings(quot;unusedquot;) @Id Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = quot;bkrIdSeqquot;) @SequenceGenerator(name = quot;bkrIdSeqquot;, sequenceName = quot;BKR_SEQquot;, allocationSize = 1) BKR_SEQ @Column(name = quot;BKR_IDquot;, nullable = false BKR_ID false) private Long bkrId bkrId; public Long getBkrId() { return bkrId; } public void setBkrId(final Long bkrId) { this.bkrId = bkrId; } @Column(name = quot;KONTO_NRquot;, nullable = false length = 45 KONTO_NR false, 45) private String kontoNr; kontoNr public String getKontoNr() { return kontoNr; } public void setKontoNr(final String kontoNr) { String oldValue = this.kontoNr; this.kontoNr = kontoNr; firePropertyChangeEvent(quot;kontoNrquot;, oldValue, this.kontoNr); }
  • 20. @SuppressWarnings(quot;serialquot;) @Entity Entity @Table(name = quot;BUCHUNGSKREISE_Fquot;) BUCHUNGSKREISE_F public class BuchungskreiseF extends AbstractEntity implements Serializable { @SuppressWarnings(quot;unusedquot;) @Id Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = quot;bkrIdSeqquot;) @SequenceGenerator(name = quot;bkrIdSeqquot;, sequenceName = quot;BKR_SEQquot;, allocationSize = 1) BKR_SEQ @Column(name = quot;BKR_IDquot;, nullable = false BKR_ID false) private Long bkrId bkrId; public Long getBkrId() { return bkrId; } public void setBkrId(final Long bkrId) { this.bkrId = bkrId; } @Column(name = quot;KONTO_NRquot;, nullable = false length = 45 KONTO_NR false, 45) private String kontoNr; kontoNr public String getKontoNr() { return kontoNr; } public void setKontoNr(final String kontoNr) { String oldValue = this.kontoNr; this.kontoNr = kontoNr; firePropertyChangeEvent(quot;kontoNrquot;, oldValue, this.kontoNr); }
  • 21. External DSL with TMF Xtext entity BuchungskreiseF (id=bkrId sequenceName=BKR_SEQ) { String kontoNr (notNull, length=45) Long rgNrBkrIdentifikator (notNull, length=1) String referenzcodeKontoNr (notNull, length=45) }
  • 22. External DSL with TMF Xtext entity BuchungskreiseF (id=bkrId sequenceName=BKR_SEQ) { String kontoNr Long rgNrBkrIdentifikator String referenzcodeKontoNr }
  • 23. External DSL with TMF Xtext BUCHUNGSKREISE_F entity BuchungskreiseF (id=bkrId sequenceName=BKR_SEQ) { String kontoNr RG_NR_BKR_IDENTIFIKATOR Long rgNrBkrIdentifikator String referenzcodeKontoNr }
  • 24. entity BuchungskreiseF (id=bkrId sequenceName=BKR_SEQ) { }
  • 25. entity BuchungskreiseF (id=bkrId sequenceName=BKR_SEQ) { } TABLE BUCHUNGSKREISE_F ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 Database Schema
  • 27. Number of Characters (Domain model DSL) 30.000 (DSL) + 50.000 (code generator) With DSL + 170 / Entity 7000 / Entity Without DSL 300 TZ 240 TZ 11 Entities 180 TZ 120 TZ 60 TZ 0 TZ 0 20 40
  • 28. Views
  • 30. public class PersonenForm extends Form<Personen> {
  • 31. public class PersonenForm extends Form<Personen> {
  • 32. public class PersonenForm extends Form<Personen> { public class PersonenHauptSubForm extends SubForm<Personen> {
  • 33. public class PersonenForm extends Form<Personen> { public class PersonenHauptSubForm extends SubForm<Personen> {
  • 34. public class PersonenForm extends Form<Personen> { public class PersonenHauptSubForm extends SubForm<Personen> { private JComponent vornameTextField;
  • 35. public class PersonenForm extends Form<Personen> { public class PersonenHauptSubForm extends SubForm<Personen> { private JComponent vornameTextField;
  • 36. public class PersonenForm extends Form<Personen> { public class PersonenHauptSubForm extends SubForm<Personen> { @Override protected void initComponents() { ... vornameTextField = builder.createTextField(desc.vorname(), private JComponent vornameTextField; Editable.PROPERTY_DEFAULT, MANDATORY); gepardBuilder.setNoLeadingBlanks (vornameTextField);
  • 37. public class PersonenForm extends Form<Personen> { public class PersonenHauptSubForm extends SubForm<Personen> { @Override protected void initComponents() { ... vornameTextField = private JComponent builder.createTextField(desc.vorname(), vornameTextField; Editable.PROPERTY_DEFAULT, MANDATORY); gepardBuilder.setNoLeadingBlanks (vornameTextField);
  • 38. public class PersonenForm extends Form<Personen> { public class PersonenHauptSubForm extends SubForm<Personen> { @Override protected JComponent buildPanel() { TwoColumnsPanelBuilder builder = @Override protected void initComponents() { ... TwoColumnsPanelBuilder.instance(getBuilderFactory(), vornameTextField = private JComponent builder.createTextField(desc.vorname(), vornameTextField; Editable.PROPERTY_DEFAULT, MANDATORY); gepardBuilder.setNoLeadingBlanks getResourceMap()); (vornameTextField); ... builder.add(quot;vornamequot;, vornameTextField);
  • 39. public class PersonenForm extends Form<Personen> { public class PersonenHauptSubForm extends SubForm<Personen> { @Override protected void initComponents() { @Override ... protected JComponent buildPanel() { TwoColumnsPanelBuilder builder = vornameTextField = private JComponent builder.createTextField(desc.vorname(), TwoColumnsPanelBuilder.instance(getBuilderFactory(), vornameTextField; getResourceMap()); Editable.PROPERTY_DEFAULT, MANDATORY); ... builder.add(quot;vornamequot;, vornameTextField); gepardBuilder.setNoLeadingBlanks (vornameTextField);
  • 40. Why not GUI-Builder? • No control over generated code • Too many details • Do not directly leverage information from the domain models
  • 43. ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 Referencing ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 ID NAME PROP1 DATE ATTR1 model : gepard; import quot;platform:/resource/com.affichage.it21.gp.dao/src/main/model/types.daoquot; com.affichage.it21.gp.dao { flaechen { readOnly entity WaehrungF (id =(rvLowValue)) { } readOnly entity GepardVerwendungPvF (id =(pvOid)) { temporal manyToOne GeschpartnerAllBsF geschpartner (joinColum } } verkauf { readOnly entity GepardVerwendungKdvtF (id =(kdvtId)) { temporal notNull manyToOne GeschpartnerAllBsF geschpartner (j notNull Number istLangfrist (castTo=Boolean) notNull Number istLokaldispo (castTo=Boolean) } } gepard { readOnly entity AbcKundenF (id = (rvLowValue)) {
  • 46. addValidator(new Validator<Institutionen>() { @Override public ValidationResult validate(final Institutionen institution) { final ValidationResult result = new ValidationResult(); if (institution != null && institution.getEsrNr() != null && !CheckUtils.checkPcKontoNrPruefziffer( Long.parseLong(institution.getEsrNr())) { result.add(new SimpleValidationMessage( getResourceMap().getString(quot;validation.esr.msgquot;), Severity.ERROR, getModel(Institutionen.DESC.esrNr()))); } return result; } });
  • 47. Eliminate framework code addValidator(new Validator<Institutionen>() { @Override public ValidationResult validate(final Institutionen institution) { final ValidationResult result = new ValidationResult(); if (institution != null && institution.getEsrNr() != null && !CheckUtils.checkPcKontoNrPruefziffer( Long.parseLong(institution.getEsrNr())) { result.add(new SimpleValidationMessage( getResourceMap().getString(quot;validation.esr.msgquot;), Severity.ERROR, getModel(Institutionen.DESC.esrNr()))); } return result; } });
  • 48. Eliminate framework code Avoid repetitive null pointer checks addValidator(new Validator<Institutionen>() { @Override public ValidationResult validate(final Institutionen institution) { final ValidationResult result = new ValidationResult(); if (institution != null && institution.getEsrNr() != null && !CheckUtils.checkPcKontoNrPruefziffer( Long.parseLong(institution.getEsrNr())) { result.add(new SimpleValidationMessage( getResourceMap().getString(quot;validation.esr.msgquot;), Severity.ERROR, getModel(Institutionen.DESC.esrNr()))); } return result; } });
  • 49. Eliminate framework code Avoid repetitive null pointer checks Use static imports addValidator(new Validator<Institutionen>() { @Override public ValidationResult validate(final Institutionen institution) { final ValidationResult result = new ValidationResult(); if (institution != null && institution.getEsrNr() != null && !CheckUtils.checkPcKontoNrPruefziffer( Long.parseLong(institution.getEsrNr())) { result.add(new SimpleValidationMessage( getResourceMap().getString(quot;validation.esr.msgquot;), Severity.ERROR, getModel(Institutionen.DESC.esrNr()))); } return result; } });
  • 50. Eliminate framework code Avoid repetitive null pointer checks Use static imports Use and define library methods addValidator(new Validator<Institutionen>() { @Override public ValidationResult validate(final Institutionen institution) { final ValidationResult result = new ValidationResult(); if (institution != null && institution.getEsrNr() != null && !CheckUtils.checkPcKontoNrPruefziffer( Long.parseLong(institution.getEsrNr())) { result.add(new SimpleValidationMessage( error(quot;validation.esr.msgquot;, desc.esrNr()); getResourceMap().getString(quot;validation.esr.msgquot;), Severity.ERROR, getModel(Institutionen.DESC.esrNr()))); } return result; } });
  • 51. Internal DSL in Java @Check void checkEsrMsg() { if (!checkKontoNrPruefziffer(parseLong(_this.getEsrNr()))) error(quot;validation.esr.msgquot;,desc.esrNr()); } • Junit-like • catches null pointer exceptions
  • 52. Why do we want to abstract?
  • 53. Software Life-Cycle Costs (Schach 2002) Requirements Specification Design Coding Unit Testing Integration Maintenance
  • 54. Software Life-Cycle Costs (Schach 2002) 2% Requirements Specification Design Coding Unit Testing Integration Maintenance
  • 55. Software Life-Cycle Costs (Schach 2002) 2% 5% Requirements Specification Design Coding Unit Testing Integration Maintenance
  • 56. Software Life-Cycle Costs (Schach 2002) 2% 5% 6% Requirements Specification Design Coding Unit Testing Integration Maintenance
  • 57. Software Life-Cycle Costs (Schach 2002) 2% 5% 6% Requirements 5% Specification Design Coding Unit Testing Integration Maintenance
  • 58. Software Life-Cycle Costs (Schach 2002) 2% 5% 6% Requirements 5% Specification Design 7% Coding Unit Testing Integration Maintenance
  • 59. Software Life-Cycle Costs (Schach 2002) 2% 5% 6% Requirements 5% Specification Design 7% Coding 8% Unit Testing Integration Maintenance
  • 60. Software Life-Cycle Costs (Schach 2002) 2% 5% 6% Requirements 5% Specification Design 7% Coding 8% Unit Testing Integration 67% Maintenance
  • 61. Software maintenance - proportional costs
  • 62. Software maintenance - proportional costs
  • 64. Finance related applications of Eclipse Modeling