SlideShare ist ein Scribd-Unternehmen logo
1 von 65
Downloaden Sie, um offline zu lesen
Modeling Industry Data
          with
Eclipse Modeling Project
       Sven Efftinge (itemis AG)
     Dr. Jan Koehnlein (itemis AG)
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
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
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
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 ?

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 

Andere mochten auch

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
 

Andere mochten auch (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Mehr von 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
 

Mehr von 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
 

Kürzlich hochgeladen

Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 

Kürzlich hochgeladen (20)

Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 

Eclipse Banking Day

  • 1. Modeling Industry Data with Eclipse Modeling Project Sven Efftinge (itemis AG) Dr. Jan Koehnlein (itemis AG)
  • 2.
  • 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
  • 26.
  • 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
  • 29.
  • 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)) {
  • 45.
  • 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