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)
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 ?

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

Bluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfBluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfngoud9212
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
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
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Neo4j
 

Recently uploaded (20)

Bluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfBluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdf
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
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
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 

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