scieee Science in your language
[en] (orig)
OpenConfigurator - A Practical Approach
to Configurator Implementation


 !
"


#$%& '(#'




#%)*+%%,-
'%)*+%%./%0
1*%%- +"

Abstract
 .2 "
" "2%3
 .2" 
.%4"2 ""
 56"
" .%
 ! 2 
2 "!"2  6%
47  "5"%
42 22"
 ! %
4 "!22
!.  %89 
    /2!
 %4 &+"!2!
22!  5"
 %4!5"
  %
4 "!!/33  /+&21
92" %:  .
 2"%,2  
 "6262 ""%
9" ©'(#'2"

Table of Contents
#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #
#%#%,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;
#%'%,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;
#%$%96%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?
#%;%9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F
#%<%4%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F
'%+9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$
'%#%++9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #;
'%#%#%+9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#;
'%#%'%, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#<
'%#%$%9.++9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#?
'%#%$%#%9.&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #@
'%#%$%'%9*9,+2+
29.+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#F
'%#%$%$%+9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #G
'%'%9++9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '(
'%'%#%+8=8>+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '#
'%'%'%+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ''
'%'%$%+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ''
'%'%;%,+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '$
'%'%<%+9. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'$
'%'%?%,9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'<
'%'%@% "9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'@
'%$%+9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'F
'%$%#%,9.&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'F
'%$%'%+9.9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $#
'%$%$%, &%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$
'%$%$%#%++-+7%%%%%%%%%%%%%%%%%%%%%%%%%%$$
'%$%$%'%+&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$
'%$%$%$%,"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$<
'%$%$%;%8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$F
'%$%$%<%++%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$G
'%$%$%?%8, +-&%%%%%%%%%%%%%%%%%%%%%%%%% ;#
'%$%;%3&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;#
'%$%;%#%,, -+7%%%%%%%%%%%%%%%%%%%%%%%%%%%%;#
'%$%;%'%,9.93"8!%%%%%%%%%%%%%%%%%%%%%%%%%;'
'%$%;%$%+)4 +9.%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;$
'%$%;%;%9-4 ,9.%%%%%%%%%%%%%%%%%%%%%%%%%%;;
'%$%<%, &%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;?
'%$%<%#%41" +A9+B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;@
'%$%<%'%4 +A+B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;@
'%$%<%$%4++9.%%%%%%%%%%%%%%%%%%%% ;G
'%;%&&36%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<(
'%<%"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <'
$%9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<$
$%#%+,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <;
$%#%#%9*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <<
$%#%'%&*99%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<F
$%#%$%9*-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%?(
$%'%+9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?'
$%'%#%9+9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%?'
$%'%'%+9 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%?;
$%'%'%#%4)9 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?;
$%'%'%'%49 +4+%%%%%%%%%%%%%?<
$%'%'%$%49 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?@
89 &+&9 

$%$%+9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%?F
$%$%#%4-7%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @(
$%$%#%#%49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@#
$%$%#%'%&-7%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@$
$%$%'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@$
$%$%'%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @;
$%$%'%'%=-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@<
$%$%'%$%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@
$%$%'%;% &%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @F
$%$%'%<%8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@G
$%$%'%?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%F(
$%$%$%9 .%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%F(
$%$%$%#%&96%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%F$
$%$%$%'%"3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%F;
$%$%$%$%, 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F@
$%$%$%;%9 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FF
$%$%$%<%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%G?
$%$%;%1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%GF
$%;%"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GG
;%, "9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #(#
;%#%489 , "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#(#
;%#%#%,9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #('
;%#%'%9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#(;
;%#%$%8&9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#(?
;%#%;%& 89 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#(@
;%'%, &%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #(F
;%'%#%8C8+, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #(G
;%'%'%+,/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%###
;%'%$%+ ,!/&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##'
;%$%4)9 ,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##?
;%$%#%3)9 ,,,%%%%%%%%%% ##G
;%$%'%,, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'(
;%$%$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'#
;%;%, 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #'$
;%;%#%, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#';
;%;%#%#%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #';
;%;%#%'%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #'?
;%;%#%$%+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'F
;%;%'%+, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$(
;%;%$%9 , %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$'
;%;%$%#%,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$$
;%;%$%'%9 &%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$G
;%;%$%$%9 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #;'
;%;%;%, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #;$
;%;%;%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#;$
;%;%;%'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#<;
;%;%<%9, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#<?
;%;%<%#%)99%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#<@
;%;%<%'%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#<G
;%<%9 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #?(
;%<%#%48C89 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #?(
;%<%'%369 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #?$
;%<%$%9 & %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #?F
;%?%"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@;
<%4&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@@
<%#%4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@@
<%#%#%/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #@@
<%#%'%/+&+A/+&B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@F
<%#%$%1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #@G
<%#%;%96"C/33A9B%%%%%%%%%%%%%%%%%%%%%%% #@G
<%'%&8!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #F$
<%'%#%,4&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #F;
<%'%'%99 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #F<
<%'%$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #F@
<%'%;%36 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #FF
<%'%<%+ 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #G#
<%$%&+ *D !89 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #G'
<%$%#%1  9 %%%%%%%%%%%%%%%%%%%%%%%%%% #G'
<%$%'%+ 9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #G;
<%$%'%#%E   )9 ,%%%%%%%%%%%%%#G;
<%$%'%'%& ,%%%%%%%%%%%%%%%%%%%%%%%%%%% #G<
<%$%'%$%" 8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#G<
<%$%'%;%D !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#G?
<%$%'%<%D !9 & %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '((
<%$%$%9 + %%%%%%%%%%%%%%%%%%%%%%%%%%%% '('
<%;%+ *36   89 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%'($
<%<%"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'(;
?%3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'(@
?%#%9"*19 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'(@
?%#%#%,"91%919"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '(@
?%#%'%,"91%5+- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'(F
?%#%$%41,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '(G
?%'%4),9 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'##
?%'%#%4 "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'##
?%'%'%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '#'
?%'%$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'#;
?%$%9 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'#?
?%$%#%9 E!19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '#@
?%$%'%9  19%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '#G
?%$%$%4  - 9 3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''(
?%$%;% D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''#
?%$%<%& 37%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '''
?%$%?%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''$
?%;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'';
?%<%"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''<
@%"8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ''@
@%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ''@
@%#%#%, ""%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''@
@%#%'%9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'$(
@%#%$% D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'$$
@%#%$%#% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '$;
@%#%$%'%D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'$?
@%'%8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'$@
@%'%#%9+=9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'$F
@%'%'%- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'$G
@%$%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ';(
&%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';$
1%36,*1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'<#
1%#%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '<#
1%'%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'<$
9%89 &+=+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'@#
1 "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$##


List of Figures
#%#%,4*9,9.+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $
#%'%96D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @
#%$%4%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##
'%#%9.&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@
'%'%99,+2+29.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#G
'%$%8!9++%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '#
'%;%9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ';
'%<%,+,9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '?
'%?%8!E"9& ,9.%%%%%%%%%%%%% $(
'%@%9+9.+ 3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $#
'%F%)4","%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$<
'%G%4",.+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$@
'%#(%8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$G
'%##%,,8, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;(
'%#'% ,9.53"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;$
'%#$%+96+9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;?
'%#;%, ,6+9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;F
$%#%+9+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <;
$%'%1),,9 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<<
$%$%91%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<?
$%;%9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <F
$%<%)9 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?;
$%?%9 4+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%??
$%@%9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ??
$%F%9 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?@
$%G%+9 >"3,9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?G
$%#(%49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@#
$%##%8!,9 "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @;
$%#'%, 169 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F'
$%#$% 9 "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F?
$%#;% :9 "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% F@
$%#<%)&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FG
$%#?%-1!9 4"9 %%%%%%%%%%%%%%%%G(
;%#%489 &%%%%%%%%%%%%%%%%%%%%%%%%%%%#($
;%'%8!89 , "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#(;
;%$%8!8, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #(?
;%;%368C8+,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ##(
;%<% &,,),,%%%%%%%%%%%%%%% ##;
;%?% &%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ##;
;%@% &, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##?
;%F%4)9 ,H1H9 +%%%%%%% ##?
;%G%-)9 ,-%%%%%%%%%%%%%%%%%%%%%%%%%%%% ##F
;%#(%,:9 )9 ,-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##G
;%##% &9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#''
;%#'%--9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #'<
;%#$%--&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'@
;%#;%--+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #'G
;%#<%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$;
;%#?%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #$<
;%#@%99 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$@
;%#F%99%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$F
;%#G%9,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$G
;%'(%9&4"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #;(
89 &+&9 

;%'#%, 16%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#;;
;%''%--94"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #;<
;%'$%9:&:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #;?
;%';%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#;F
;%'<%)89 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#<@
;%'?%48C89 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#?#
;%'@%&+9 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #?'
;%'F%9 ,9.1A36B%%%%%%%%%%%%%%%%%%%%%%%%%%#?$
;%'G%#*.,& %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#?;
;%$(%'*14"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #?<
;%$#%$*&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#??
;%$'%;*D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #??
;%$$%<*37&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#?@
;%$;%?*37%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#?@
;%$<%@*9 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #?F
;%$?%9 ,-8C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#?F
;%$@%9 +!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#?G
;%$F%9 +9.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #?G
;%$G%-!9 242)9 
,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@(
;%;(%& 44"0"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@#
;%;#%3640"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #@$
<%#%&8!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #F$
<%'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #FG
?%#%91%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'(G
?%'%,:9 1,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '#(
?%$%),9 &%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '#$
?%;%,9 D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'#;
?%<%0& E %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'#<
?%?%36")9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'#?
?%@%9 9 E!9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '#@
?%F%9 4"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '#F
?%G% 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'#G
?%#(%.9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''(
?%##%D %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''#
?%#'%++%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'''
?%#$%9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%''$
@%#%989 !, 169 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'$#
6
List of Tables
;%#%, !8C9+, 9%%%%%%% #(G
;%'%, !/9)9 ,%%%%%%%%%%%#'#
;%$%, &%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #';
;%;%9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'<
;%<%93%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'?
;%?%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'F
;%@%&3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'F
;%F%+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #'G
;%G%+3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$(
;%#(%+, 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$(
;%##%9 , 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$'
;%#'%4"&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #;G
;%#$%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #<(
;%#;%&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#<(
;%#<%+&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #<'
;%#?%1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#<;
;%#@%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #<;
;%#F%9 & 4%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@#
<%#%)33931%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #G(
&%#%: =&99%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ';;
&%'%9"9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';<
&%$%9"9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';?
&%;%"9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';F
&%<%969%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';G
6
6
List of Examples
;%#%36/1,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ###
;%'%36"& %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##$
;%$% &9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##<
;%;% @Component&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'<
;%<% @Attribute&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'@
;%?% @Part&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#'F
;%@% @Product&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #$'
;%F%, 9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#$;
;%G%, 9 2+.9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #$?
;%#(%, 99%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #$F
;%##% @Calculated&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#;'
;%#'%@Configured&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#;$
;%#$%364"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #;G
;%#;%36&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #<#
;%#<%36+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #<$
;%#?%36%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #<<
;%#@%9& %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#<?
;%#F%9& ,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #<F
<%#%+ 36%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '($
@%#%, 9.+!89 9%%%%%%%%%%%%%%%%%%%%%''F
6
#
1
Introduction
A Bit of History
0 ! .     % 9
!%4
7.!!!""
%4! !! 
I:'((?2%'J%
D62!
""  .#G"%&
 "2!
"!
"'(" % 
7 !2!"
52 " !  
%&! 
 %4
"!!A%I0K'((#2%GJB*
#% +  2
'% 2
$% !2
;% %
The Market Shift
0!2*HI%%%J
42""
 " 
I"JHI1'((<2%#(J%!"2
62"A%I-
!'((G2%'$J2I:'((?J2I0K'((#2%GJ2I+'((?JB*
9R#%R
'
0 "6 
2!!!%0!2!"5
!"A
B%47 5
"  %
0 ,
 2
" !! %
         
0 4 "!
%-  !
 """%4
 %
97"!
525
!%

0  2  2!
  %4"277"
6" I-'(#'J%
0 4"
 %4"7" 7
% 2."2
 "52
 "%
L  52
L   "A2
2 B2
L  2
L !!7""
%9!
 " %
3 ..2
 "2"%3"
""!%
&72 "  " 
I0'(#(J%4!
 "%4
" !7! 
62% %2" =%
0!2 !"  "
I:'((?2%'J%&+)*H"2
!M"C!6"!"!%HI+#GGG2%@?J%!2
"!"%
 R#%#2N,4*9,9.+O
"A%I:'((?2%'JB%
$
Figure 1.1. Market Trends: From Custom-Made to Customized Products
4. 7
"I>'(#(J%6
27! 
.!"5
 I'((GJI-#GGFJ%47! 
 " I,'(#'J%&
!! 2
""*2
%4 
 I1'((<2
%'J%
Business Today
4"5 7"
""I:'(#'J%"2
2 % 
"   %0!2
".26"5
2 "
"%2 2 
 "" 
%
    .   2  
" !    "  7 
 %E"
52"7
.5%
        "      
"52"2
9R#%R
;
%D 257
2! "
 %9 "2
7 !%+ 
%%%
L !2';=@ 
L 7!6! 2"6
L   A "B 7    7    
H HI:.'(#(J
L "
L  272
22!2%"
2 ""
" .%4" !
 2 2 %
1.1. Motivation
3"62   
! !  "%3
!"!2" 
7"6%42" 
22 % 2
  5"!
"22!22
"%
E2""5 HH2
 "%+
"!! .2!%4
 !  6!2
" "%,2" 
"" 2   
!  2%3!2
   262 
 !%97"2 "
"%
) 62 
 "!!
 56"2!""%
D 2"     "
" 2!!2 
6%4"2 2"
%
1.2. Mission Statement
!2!!  
2!.!6.
%1" 2  2
. 2" 
C "
" %
,
<
D ! /A
"/33B "" 2
" %4 !27
 6 %2!
2  %
8  /2!7
" 7"  "26"2 "
"%D !!!2!"
   "6 2
! %4!"
." " 
!"%
Concrete Objectives
4 "  !.
"! *
0 4 " 
2"" %
0 4 "!"
*"5"%
0 4 " !6 2
!"!%4" A% %2/
33B2"A% %2
B%
0 4
 "2 *
L!0 4"
! 26/C
!%
L0 4!2. 
C7"26%4"2
"" !!C56"%
L!""0 1 66 
27"
 %
L0 "2 
"""5!%3
"2 2!4"%
L#0 4""
 "6 2 
7"""%,2 "
  "%
9"2!2!5! *
#% $0  !2!
.  
9R#%R
?
C2%D!!
.!6/  !%"2
 ! 2!!
!*
L 
L C=
L A2B
L /2! !/33#2"*/+&'A  
=B1A
B
'% $    %0 1       
2!" !!
A B %4 
 ."! *
L !HH
L  2&+$
L ! &+ &+
  
L 5 "6 +;
L ""/33?!A9<2/+&21B
$% 0 2!!
" .6 %3"2!52"2
  A !B
2!" %4
.*
L 5!" &5+2
"!!!
L 6*%4"!
5/1
L  *04,:<=9=/229 
&+
4!!%4
.!6"%97"2 !2!
!" "=H89
  "HH89 H%
1.3. Context and Scope
4  !7 
 2"2
"  %1" ".   .
2!5"7"
.%: 62!
 2!
% R#%'2N96DO6!*
#&%,##
'&%,!+
$&%!  "
;&%%"
<&%6-""C
96
@
Figure 1.2. Context of this Work
2!
2! 6!%D!
*22
%42!2!"%
4 !*
0 82!2 !
!. "
  "%29R'2
9R$2!"%
&0 9  !
!  22! !"
  ! . 
 %4"!"  
9R'229R$29R;2
%
$0 9  !
 "%
9R;229R<2 !
"9R?2#$%
1" 7  2! !
7! .%2! 
!2   !" 
2!2
%
  ! 2!!
!%45!*
L !.
 2 .C
A"9R'29R$2B%
9R#%R
F
L  A""B. 
! %2
 ! "A"9R;2
B%
L ""!!2!
%45
! ""A"
9R<2 !"B%
L "2""
 !%D6
! 2
!A"9R?2#
$B%
L .! !6
A"9R@2%B%
1.4. Challenges
D89 7! 
% !5"! 
 !"89 %2  2
.  !2! *
'%())0 4 8
9 "!6  
"%"27!89
 HH22%R9
7"2!5%289
 HH2" !%
E2!    7"%
#  %  "      
0 4 89   !6
 !7"
 %D!!! /33
 "! 6
"2! ! 2!    !
 5%2!"6 2!!
   R
 76%
82!.6   
!"  %2!5H
 H2  %0!26  
 6" 
 %D22
6!%
1.5. Thesis Structure
0 !AB A&B
"!2 C  2!!
 "AB26*
4
G
0*(0 2!!
''%D!
.  
%7!"
*
L D.!"P
L D5 .!
P
L D "!.P
4 .
!""! %4! "
 2. 
!%
0+(0 4"(
6"%D! .
272!" 
 %42!! 
2   ! %
&%+72!"
*
L 0!.! "P
L D  P
L D "!""P
L D P
0 2! %,
2.6"""
 %
0,(0 9;!
 " 2%
D  )!*2!!. "
 .%4!5
 
 %E62!5 
2! 22 
2%"2!! 
2"!2"!   6
%1" 2"5!! 7*
L D89 !
P
L D89 !!
"P
L 0!.!89 5P
L 0!! 
P
0-(0 9<2!  )
89 
!%D! !2 !
%42!589 5
9R#%R
#(
! "2!!&++%
2"5!! 7*
L D ! 89 !
 !P
L 0! !2"P&!
!5 .P
L 0! !!2"P
L 0!!6P
3"2!7**
+
0.( 0 4"2
%D56"
. &5+%
4"2!5. 204,:< 89
 ! "%9?!!! 7
*
L , "* !   ! .    
89 5 P
L 0!04,:<2  
!P
L 0! 2.!89 "P
L 89 2C7"P
& 2"2!7*
+
0/(!"#0 2!  
" 2!89 "7
  "%,2!!.
!  
 %42!%"2!5
!" Q%47"6!
"*
L 89 5  7
 7"P
L 0!!.P
L D !"P
L 0!!P
 R#%$2N4O!2!%
4
##
Figure 1.3. Thesis Structure
3!!"2   %
"5"2""!C"
!5  %47%
E!25 !"%
#'
#$
2
Product Customization
" "!2"5
  " A        B  
! % 2! "
 "%
& 1%H. "
57HI1'((<2%##J%
2!!.=
 !!7!%D5
.%42!5
!" "%4
*
L 2
L 2
L 2
L .. %
E62!5. 
. 
%"2!5!
 %367"". 
%
4!  ! 
.%4"
 "
 C%2 
 ""
. %
9R'%R+9.
#;
2.1. From Products to Product Configurations
2!5.
  %
2.1.1. Products and Components
Products
4HH"6 22
2!!"6%
 2!"2"
2H H#%
0!256
%
  2""
2"""2 "
!27!I1'((#J%& > I> '(#(J2
"ABH2
 C  =
H E?@FG%826"!
A!R'%'2N
9++9.OB%82
"E7
" !A%I> '(#(2%?JB*
1 &. 
./%
2> ! HH
!2!!*
L "" 2!2
L 2
L  2
L A"BA"B2
L  . 
L  %
!2%&
"H!
AB!HI0'((F2
%$#J%
Components
+'%422
%+"2
!*
&23 &0A
B2!."
!""A
=B%
#*==%!"% =!=+2/"'G2'(#'%
' *==!!!%%!%%==6%PVW$'(UW+UVW;';?;$@1;?;#$@$@;''$($<$?
$$'$;2/"'G2'(#'%
, 
#<
12HHH"H6
!*A"B
22 %2
!"
AB%2"
!"" %
4
2!R'%$%$%$2N,"O%
2.1.2. Variants and Variant Management
Variants
& E#GG#2"C
""!  IK'(((J%
4C   "2 "2
%4 
$%
+ "%D!
 R'%$%$%$2N,"O%!25
 !""A%I+'(($2%''$J2I&#GG?2%;<J2
I9#GG#2%<<J2I0#GG@2%@<JB*
!"0 -"%
.""6. 6"%
0 - 
!%4 "
""22"6"
%97"2."
. "%
Variant Management
42   2 !
2;%9
722 %
  AB25
" 
5"  
5%4" 
"  !
%4!2H!"H*
2
 ""%
9  7!A
B6"* "  " 
5"% 2 
""%2
! 2!"7
 A!2B2
$ *==!!!%%!%%==6%PVW$'(UWUVW$@;'$$@1;#$#;<$<$''$<$;;$
;<'$;2/"'G2'(#'%
; *==!!!%%!%%==6%PVW$'(UWUVW$@;'$$@1;#$#;<$<$''$<$;;$
;<'$;2/"'G2'(#'%
9R'%R+9.
#?
 "5 "
%E"A=B!
6"  *2
"2%4 
7"2 A B2
! !
! "%82
 2%
2  
 %82
%82 
2!7! 
%"2
2 %9"2
!225
"2! " 6
CA%I+'((#JB%& "6
 ""6
"%5 !6
.2 %
&2"..
76" ""%0!2:
%I:'((?2%FJ !"
 *
40 8
 
 "<S#<S 7"%&F(S
"!#S%97"2 6"
" %
'0 97"
"" %426"
"""%
2.1.3. Customized Products and Product Configurations
&2 
%6""
2!7"
I0K'((#2%<J%I'((?J"
 A%I> '(#(2%GJB*
0 4 
."!"%
 0 D    
2.%
0 4".
7%
 " 5
<%"
<*==%!% =!=9. 2/"'G2'(#'%
9.++9 
#@
.A.BI:'(($J%&
6.2
5"!
! 
I+'((#JI+'((;J%
2.1.3.1. Customizable Areas
3"2
""A! .
2%I+'(($JB*
L "
L A2"2B
L  A"B
D 7".
A% %2B26 A% %22%B
 .%:%! 
 A%
I:'((?JB*
Figure 2.1. Customizable Areas
4 R'%#2N9.&O*
5"0 
""%,!
6 2!
"! %
9R'%R+9.
#F
1"62:%! %
60 D "AHHB
AHHB2. 
%D
2
""A% %2 B2
" 
A% %27 B%
0 D.
""!
%4%
10 + !.
22!
A% %2"
!2 % "B%8
2
6%+ "7
%
0 &2!2" 
A% %226!"2%B%4.
%
$"0 "2 6
 ".%-)
6"   
A% %2 B%D
 267"!%
1)! !.%0!2
 "%"2
  27
 %
D.2"
6" 2!!"7
 9R;2%4
" %
2.1.3.2. Comparison: Custom-Made Products, Variant Series Prod-
ucts, and Customized Products
 " A R'%;2
N9 OR'%'%<2N+9. OB2
!    2      %
 R '%'2 N9  9, +2   +2  9
.+O " 
I:'((?2%#(J*
9.++9 
#G
Figure 2.2. Comparison of Custom-Made Products,
Variant Series Products, and Customized Products
4!
. 6"*!  
""2.
2"!!62
 7%"2!2
."
.I:'((?2%##J%
2.1.3.3. Product Configurations
!!!".%4
57!

7.I:'((?2%GJ%D
72
%
4 %&
 2
!2! %
4 "
""!"% 2 
2!2!
  "!.%
+    " !      
A "B!C!%4 
      2     2
 
7AR'%$%<%$2N4++9.
OB%+I+#GGF2%GJ   
9R'%R+9.
'(
!%D2!5
6" 
"  A
  R'%#%'2N, 
OB%+ 7"6"
 %9
R$2!!%
0 !2!!
"%
2.2. From Classical Production to Product Cus-
tomization
4  
 %4AR'%#2
N++9 OBI'((<J%
H9H" 2. %
&9R#2"2 "
"%!2"57!
%>! !A"
 "B"%422"7
 2!
 .%
! 2!!6HHAI> '(#(2%
#$JB!".2!!
!%D!.2
." !%
 R'%$2N8!9++O!
  %
+8=8>+
'#
Figure 2.3. Overview of Common Production Processes
2.2.1. Per-Order/One-of-a-Kind Production
A2B 27
%4"2
?%4!
"572!
76"%
& > I> '(#(J2""
 7"  .%& 
 7"6AI>T'((<JB2
"5"7%2 
7 ! 
 %+
22 "%
?*==%!% =!=3.  2/"'G2'(#'%
9R'%R+9.
''
2.2.2. Series Production
%AB 
 .%."72
2A2B
%5"! 22
%8 2
7@%
" ! 
%4 "!
"!
.A6 B%4 2" 
27!!A
 B%
&  26"
"I&'((;J2!!">  
.I> '(#(2%#$J%36
""2%
2.2.3. Variant Production
D" 2
! ""2 "2  
F%02  
"%
2 
 %
"%3622
%
&"> I> '(#(2%#$J2"
.!
AR'%$%$%;2N8 OB%
"2
.%02./%4
 %8!2
""
2>  .
%02 
%4./ %
" 22
!7  
"%E2! 
26 "
!%
@*==%!% =!=  2/"'G2'(#'%
F*==%!% =!=  2/"'G2'(#'%
,+
'$
2.2.4. Mass Production
4 ""2!
" .%4"26
"%,."G*
$0 "" C.2
""6 %0!2"
""%
0 4.!%4
.2 ".!%
570 " 
7 !.2!
7"%
80 4." 
! 2! "
"%&"! 
"0""'(""
<((S%46"H4H!!""'$<
"#'F%
40 4 7
!  
%   
D!4"5H, HA
H4"HB!!"'("%
90 "2
"  
%
:%03A2 
 BA2 
.B!2!
! %
4 H22 
!! !""
%HI1'((<2%GJ%  2
" "2
%82"6"  
2!!"".%
36  %
2.2.5. Product Customization Strategies
1%H " 
57HI1'((<2%##J%4 .
"%9
2. "A%
I'((#2%#JB%
G*==%!% =!=,  2/"'G2'(#'%
9R'%R+9.
';
!2. "
"%& "
 "2
 A%% !B
A%% B 7I'((?2%
@J%9 ..
2"A#(#<S
 B%
2.!
%D. A%%
 2R'%$%;%;2N9-4 ,
9.OB2. 5
AB%4 2
"6 AR'%$%;%$2N+)4 +9
.OBI'((?2%#'J%
+"2. ."
5% 2
 !*
Figure 2.4. Customer Involvement Strategies
60 "2"5
 %4""""
 A9-,B%
4 2 
AI'((?2%FJB%
 0 4       = "
%0
  
7"%D6
 .2""
6%
0 4"!
6*" 2
!"" %2
"!
 " %4 "
H8HI-!'((GJ%
,9.
'<
 ".2
""5* 
1%H "7
 "%HI1'((<2%$J4
%4
HHI4#GF;2%'@<J%4
  " 
"  2.
A%I+'(($2%'(FJB%2
I+'(($2%#<;J% 2 "
   2!!"
%
2.2.6. Mass Customization
4. #GF(!
"H+H#GF@I#GF@J%1"#GG'2
+5H,9.*4E!19
HI+#GG'J""  
I1'((<2%;(J%
  "2 
!"I+#GG'J%DHH
.""
2.%
2.2
 
A +!  
"I+#GF(JBI+'(($J*H4  
."  5
"%HI1'((<2%'J%
8.
!  "  
7I-!'((GJ%"
!2*.
 " . "
AR'%$%'2N+9.9OB%
2.I+'(($2%'(@J%
& ""+*,.

L " 2
L !6"" 2
L 2 2!
"%
4  .
2%I+#GGF2%?<J
9R'%R+9.
'?
Figure 2.5. Main Principles of Mass Customization
4.A R'%<2N,+,9
.OB -!+A%I-!'((G2%''<JB*
0 9.
5 %4 
!  2"
!2 .%
$ 80 1"   . 2   
.  %
9.2" 
 .%
10  2 
6"=%0!2
 
!2H HA
R'%$%;%'2N,9.93"8!OB%&2
! .!
"%&2. 
!"
%
0 4"
262!.!
%2
""!%4!
2!".  
%
& 1%H !.
 .%HI1'((<2%'J"2"
.6".
. 2
%4! 
.ABA
B" ". 
! 5A%I+'(($2%#G#J2I0K'((#2%
 "9
'@
#(JB%22
.2
" 52!H" 5
!"HI1'((<2%66J%
R'%$2N+9.O!!2!
"."%42!!
 2 %
2.2.7. Strategy Comparison
+. 2
"2I+'(($2%'(@J%
2 "+".2
. 2!!"!"+5
 ! %
92. "C
.""C2*
L 2 
L  76"
L  
L A2!2%B
2. "2"6
!" !2
%+
H..H!!R'%$%;2N3
&O26".2
. %9!
2! "*
"!22!
"!"%
2.   
%
&" "
%2. 6
6 7
7 A%I0K'((#2%
##JB%2
!2!."
)56%4
!"2"2" %
&"2.2
%4 2"!A!
!R'%$%$2N, &OB%,2
 "! 
5%2
 2 
%4 %
& !7 2 
 %
  "
 %6
9R'%R+9.
'F
"
"%,. 22 
  %2
.." 7 2" 
7%& +2.
6"2
A%I+'(($2%'(F'#(JB%
D5!"%"
. "! ."27
""*  2
6"2
 27%D!
 !
"".%
2.3. Product Customization Implementation
9.  6
.%4
!%
42". "2
 ".%
. A%I:'((?2%##JB*
L ! 
L 2.  .

L  !"

L .! "  !
 
L .6 .

2.3.1. Mass Customization Achievement
2 . 
."2#(%+6' .
 I+'(($J##*
 0 .25
 %97"2".%
2
2"%
A6.B7"
!26"!5!%
2+! 2. *
#(!I1'((<J2%#'%
##4"I1'((<J2%#@%
,9.&
'G
L0 !.
2"%
L1 0 "  .    
."%
L0 8 . .
%
4 0 2".
 6   % 9  "    
"%97"27
 "
 2!""%47" 
5"%
+ ! . *
L "0 3A B
A"2 B.!
"%&.%
L0 9. .2
 %
L5"0  6 ""
..! %
2 "2"62
%2
. "%57""
.%
 . "" 
"62" .
 "! .%
,2""2!"2
.%1
%!  
.I1'((<2%$(J% R'%?2N8!E"9
& ,9.O!"7
"".%
9R'%R+9.
$(
Figure 2.6. Overview of the Necessary Conditions for Achieving Mass Customization
1 .%D
!R'%$%;2N3&O%
-!7
!! "22
!. %D!
R'%$%'2N+9.9O 
 R'%$%$%;2N8 O%
"26"2!!
R'%$%$%<2N++OR'%$%$%?2
N8, +-&O%1"2
".%9."
R'%#%$2N9.++9 O!!
 R'%$%$%'2N+&OR'%$%$%$2
N,"O%"" 
7.%42!
 %3"2 
"57%D!
9R$2%
-  2
)"R'%#%'2N, O%%
! H" "
7HI1'((<2%;(J%2!
" 5%D!R'%$%$%'2
N+&O%)!R'%$%$%?2N8
, +-&O%"2"
7""! 5
2  2%
+9.9
$#
62!! !.
%D5  2"
7 " .
%D52"2. "%
2.3.2. Product Customization Value Chain
+. "."!*
 AB
AB R'%@2N9+9.
+ 3O%
Figure 2.7. Value Chain of Product Customization Pursuing Enterprises
4 + 
",3%+#GF(I+#GF(J%%
" ""%2
"! %
 22!AB
AB%36!%4
!#'%
&2. "!
2 % A
B2. 
2!."   %E"
 .7 A+B%
&56C 
 2 .A
B%
2  A-UB72
".*"
#'*==%!% =!=DS9$S1? 2/"'G2'(#'%
9R'%R+9.
$'
.2 "%
-U!.262
.2"
%4 A
R'%$%$%'2N+&OB!
2!"  %
:.2 .
..!.
7!"
."%.2 
-U  26!"
2!!"%:!2
 HH  
A%I+'(($J2%'@(B%
-2.
 %4  7
 A9&B%6"!
 A9,B"%4 
! 7
 A9-,B%"2.
!  A9&B"2 %&
"2"! !6 !2
 A3-+B A+,B
6 %D! 
!"R'%$%<2N, &O
9R$2%
4.
7AB
AB% 6 A
2R'%$%$%;2N8 OB
    !"%
2"."2
2"
% 7
" !7".
%+ ! 2
!".-U%4
7
 H"H%&""
 ""
"%
47C2!
 A!!
R'%$%<2N, &OB% "2 "
."5 .
6" 5%D"7"
2!
 A6B%
4 6 2!
7" !
%4 
"6 .! 
.%&"25
 "2!
, &
$$
 ! 6A
(B%
D AB"
22.7
2!""""%&
2 2C
!
%
4" 
C%4 
 %4
2 
%&".2
   
 7. .2
7 %
2.3.3. Manufacturing Aspects
2.3.3.1. Product and Production Related Prerequisites
".
 %82"5 
 .22.
 %6
2!! 2 "
6 27!6""
.%47 2
 2%
82"C!
*"!
.%!2"
6 %"2
!.
%
D!"! %
2.3.3.2. Product Architecture
4./"5 %
& 1%H
 "" !"!"!
HI1'((<2%#?;J%46!
%!.
"2 
2C2""
I!.#GG?2%$$J%4"2"I&
#GG@J2I0'((F2%$?J*
10 4!22
!!"A
B%2"
!%
9R'%R+9.
$;
10 4!
AB. ! 22
2 2%%
AR'%#%$%#2N9.&OB%
10   .
"2   22
"22222" %
2"
2!!"
%
90 "!  
2.%
R'%#%$%#2N9.&O!"%
2!."
AB2 A
0BAB%
&2 2
!! *7
"%9 "A  6"B
! "A! "2R'%#%'2
NOB6"A%I0'((F2
%#;$JB%& 2.2  " !5
2".5"%
0%""5 
AI0'((F2%#$GJB%4"
"A%I0'((F2%#;@JB*
0 & 2
""%""!A!
BA!B%2""
"!22
""%
6;0 4C  "
" %D
C22 ..
!C 6"
%8C""
2%
0 47 .
%0%!
A%I0'((F2%#<(JB*
L %0 52
!%
L!%0 !5
  %
L1%0 5"
"%
4 " 
" 5.% "!
, &
$<
"2.2
"! 6"
%&2."
 %
2.3.3.3. Modularity
H+"   
""  %I%%%JI,
"J""55.2 
 57%I%%%J+"
"7I.J%HI1'((<2%#?$J
 26C2
2!!6"%E.
!#$A%IE'(('2%#'@JB*
L &"!!6""!
%
L &%
L &"%
L &!%
D".#;20%
""%4". R'%F2N)
4","OI0'((F2%$($#J*
Figure 2.8. General Types of Modularity
0 2.
%2"
%
%0 D "2
2"!
#$9I1'((<2%#?;J
#;I1'((<2%#?;JI>T'((<2%F;J!".%
9R'%R+9.
$?
%62"
HH%
0 4"H: H
"%&"! %&
"6"2!
!"  %
0 2!
57%36
 .!!!%
<2=30 &""
2!" 
!%4"2
""%&622
!!%
D""2"6! 2
 "26 %
  """2
!! *
0 +A"B"".!
"27%
0 A B!" 
!"!I>'(#'J%
10  "
6!I:'((?2%;;J%
10 ""C
IK'(((J
4 22 .
.7 !
6" I'((#J%
+  2     "  "  . A%
I+'(($2%'<G'?(JB#<*
0 9!)
2""%4
%
>0 &2
" %
0 9!)
22 
7AB%
50 )
2!5%
#<E+7"%
, &
$@
 R'%G2N4",.+ O
%
Figure 2.9. Types of Modularization for Platform Designs
The Role of Modularization
,.
.%& 12HI%%%JI"J"
6"2
""  
"%HI1'((<2%<J
62.2
  "!226
".
%,..
* 2"!"
.%2
"  " 
%2!.%,
.".
2 .%&2.
7"2
"2"%
AR'%$%$%<2N++OB"
.2"
  "%+"
""2 
%&"2"!. 52% %2
="!5
A%I1'((<2%#?F#?GJ2I+#GGF2%#G;JB%
3  .!  2
!%2
  "
%&  "A B2
 A B 
A2!  !
9R'%R+9.
$F
"B%& 7!
 !"%0!2
2"5 A%I+#GGF2
%#G@JB%
&"1%"C"
!  !% %2 "2
""I1'((<2%#?GJ%
2.3.3.4. Order Fulfillment Strategies
&! .6
!  %4
%1 
"!R'%'%<2N+9. O%+"2
!  = I-
!'(('J#?*
62630 +."%,
 7%
<62<630 +."%9
HH5%
8628630 +. "
2!!%
6256(5630 +.
 %9%
$62!6(!630 +.
%,6.2" 
%
 R'%#(2N8 O
#@%
#?4I+'(($2%';FJ%
#@"I0'((F2%'?J%
, &
$G
Figure 2.10. Order Fulfillment Strategies
32  ! 
52"5%!2
!5%"2
- 2
"2!7"
!A%I> '(#(2%#'JB%
2.3.3.5. Production Process Split
2."
 
%
D2C"
2%2 "
.2!!  %
4"
CAR'%$%'2N+9
.9OB%&."
7  2
 %I+'(($2%'$(J
& +27
 6""
%4 !
"26"
%4! 6
" " 6"!I+'(($2
%'$('$#J%4 "2
"!"I+'(($2%'$#J*
9R'%R+9.
;(
0 4
2"%42!2
"%
0 4 "
%&7"
%
& 2  %4
!!
2!"%3
"25!.."
".%+!
 2 R'%##2N,,8, O
I+'(($2%'$#'$$J*
Figure 2.11. Make-to-Stock and Make-to-Order Manufacturing Scenarios
?=2#30 2
%
2 
=" 5
 %
        2 2   
" .%D
 " 2
" "%
*=62#630 2
2 "
3&
;#
%4".
!  !%4"5"
%
D2" !
! %.22
!"2 " 6"!
 5%E2
7"7%
+"2 A%I0
 #GG?2%??#J2I+'(($2%'$$JB*
L 2
L  2
L ""2
L "2
L  %
2.3.3.6. Other Manufacturing Process Related Aspects
,"6"
7  2 A B %
0!2.72
"2"AI:'((?2%?$F@BJ%
22 "9E92!
7 A% %2 2 2  B!
 22 6"%4"
" 2
7"""%7%
A6 ! B!
4A" 2 2 2%9&!
M"B " 
 "6 A%I+'(($2%$(<JB#F%
,26"22 
! A9&,B"
".AI:'((?2%
#<#JB%
"2 "62"
  A9,B"2!"!
  ". %
2.3.4. Economical Aspects
0  . 
2!!7
.%
2.3.4.1. Market and Marketing Related Prerequisites
H9 " !
"65 %!"! "2
#F6 I:'((?2%FGJ%
9R'%R+9.
;'
 !7
 7 HI+#GGF2%$J#G&
R'%'%<2N+9. O2..
2!
AB2AB%
2!276
".A R'%?2N8!
E"9& ,9.O2%I1'((<2%$#$$JB%
826*'(*
10 +" 2 2"%6"2
"%
0 -7""227""
%
0 "2 "% "22
"%2"%
0 92%
%
1"25!
2% %2  "2 ""2
 "! !
.%
82"
.%4! A"B"
 "6%&"+2
22 ".
25%
"2"*>
2!5 2"
.! !""!
I>#GG?2%;;@J%H3! !2
"!2"!
.HI1'((<2%$$J%
2.3.4.2. Mass Customization Cost-Efficiency Overview
3!. A
R#2N4,OB2" .
""   "
%4 2!!2."""
 "52 
22"%42
 %
D2 
.'#22!!:
%I:'((?2%#??J%
#G9I1'((<2%##J%
'(4+5I+#GG'2%??J%
'#6I-!'((G2%';#JI+'(($2%#?GJ%
3&
;$
Figure 2.12. Influencing Factors for Mass Customization's Efficiency
 R'%#'2N ,9.53"O !
2".%D!
"%
 2 "6%:!2
"2!2
2% 2. ""2
66 
"%
2.3.4.3. Profit Gain Through Product Customization
2.
7 A+B 2!7
%&62
!" 6 %D!2
 "%&"
"" 
 2! "
. %
46!2" 
.7"  AB%
& 27"AR'%$%$2
N, &OB2""
" %2 
 "62! 
%&"2''2! 2
 2" !!%4
!275!
''4!"+I+#GF'J%
9R'%R+9.
;;
   7A-!+2I-
!'((G2%';#JB %&!!R$%$%;2
N1O2 ""
 5%&2
. "!2*.  "
6 2!!"5
 "%42"
!  7""
 2% %2" 6" 6 "
%,2."
62 *
2 " 
"7%82
6"!%
2  ""%
I:'((?2%#??JI-!'((G2%';(J
2.3.4.4. Cost Reduction Through Mass Customization
1" 2.
%27"6!
I:'((?2%#?F#@'J*
!0 ,"
.AR'%$%$%$2N,"OB
 %1"  .2
 .A#%B!" 
A#%B*. 
!"2!
"%
!$0 &.
"
AR'%$%$%<2N++OB%& 
".2
  %3"2!
"  "2
. " !"%D !
HH" "2
"7"%2 2
2! 6"
2". 5
I:'((?2%#?GJ%
!0   AR'%$%'2N+
9.9OB257
 %4"
!%4.!
%&  !!
2"2!
..%4
"2"2
 %&
2! !
 2 !" 
   A% %2&.'$
'$*==!!!%.%=2&'(2'(#'%
3&
;<
H9D1 4&1 %%%H6"
B%:!27""%
!@0 .2 
! "%4"
2!
""%4 !! "
!2"2 "
%+"2!!6
A% %2$"2!67
B2" 2
"!" %&
72!22 "
%&2"" 
""!  7%
& 2662
%82
"572!6%
82!6"A% %2
 26"B" %
&7
62" 
. %466
  26 !
6" 226%
42!A% %29E9';B!
A3-+'<29&'?+,=+:,'@!2"
9,'F ,-+'G !B7%
2  
 ."%
 !
%82! 
!2 ."
"!%1"22
7 "%&
7  "2
"7A
R$%$%;2N1O"" 
"B%& ! 2" 
".57"
"2!%
"26"%!
 "".26" 7
"%422
"2 ! 
 "%
&!2. "
 %97"2
';&%.7
'<&%#8
'?&%!- 
'@&%- =9" 
'F&%" 
'G&%87
9R'%R+9.
;?
 62" "2
.2"%
2! 
 %!27!%
72-!+56
I-!'((G2%'?$J%
2.3.5. Marketing Aspects
4 .2!!!
 %+"2!!
.%62!! "
2!!"!.2%
&"R'%$%'2N+9.9OA R$%#2
N+9+OB2
%2" .
." !%
Figure 2.13. Interaction Process in the Context of Product Customization
! 2!!AB
2AB%42
. % R'%#$2N+
96+9.O!5
5%
:5 !" %
, &
;@
2.3.5.1. The Buying Process (Customer Perspective)
4"
I'((?2%#$J% !2!" 
"A% %26B""2
% %2 =B2" %
 !2 !"
%4"
 
L A% %2 B2
L A% %2 B2
L A% %2B2
L A% %2" !B2
L A% %2 B2!
L A% %2B2
L A% %2! B%
&"2"
L A% %2B2
L A% %2B2
L A% %2B
%
& 2"
% 2
"77%
42!" *2!"
!=226=
I:'((?2%'FJ%
& ! 2
 %. 22
!"A%I'((?2%
#$#FJB%
2.3.5.2. The Selling Process (Supplier Perspective)
822 !AB%
4 "5 7
%4  """5
"A R'%#;2N, ,6+9.OB%-
!%6!!H;+H2!22
2!!.2"
I-!'((?2%'(J$(*
$(4! "I'((?2%#GJ%
9R'%R+9.
;F
Figure 2.14. Marketing Mix for Product Customization
10 5 5
22%
+."."
7 A+B%
109 %3"2!
5"!"! %
.2! "%
12$30 & . 
 %
.2 7"
!A6
2R'%$%#2N,9.&OB27
%
12 30  
   %-
.2"76 2
"!%0!2
! !%-  
26""!
2! 2%
0 4 "
%%2"
"! 2!  
%1""25 
5%8"2
%"2 "
 .5 6%
0 &.
AR'%'%<2N+9. OB2
!227  %& 2
!5  2
6" 7"%)
"" 2.
, &
;G
22565AI'((?2%'#JB2
%
0 75 2
 7" %46"
 .""!
 AR'%$%$%;2N8
OB ."AR'%#%$2N9.++
9 OB%
 2 !
 7 ""%
"2"%&
2. 2%%
R'%$%$%;2N8 O2 % 
 2A% %2B 
%"2!2
22 "" A%I'((?2%#G'<JB%
2.3.5.3. The Interaction Process of Product Customization
E!2!" ! 5
52!!
!%E"2!!  .2
 6%
-2!
 2.26"
A7B2 6%D
262
""..
"%2"
C%.
!""2
"A%
I-!'((?2%##FJB%
 "2!
2% )2
"!.%06 
! 2%%2"
" %62"6"
 %
462!"
2%& 2"
22 "%
+ !%4
 6R$%'2N+9 O%
 2"
%45 
%,2 2!
R$%$2N+9 O%
&  ""2
" %4
"!"%4 
AR'%#%$%$2N+9 OB22
9R'%R+9.
<(
 2%4
"72! 
"%
E62! .  
%D 2
%.2 ! A% %2"
 " 2B2
"2!
"%
82!" %
 2!
"%&62 !
7"2!5!
%,22.!
""%4"
52 
27A% %2 B%
"2 A
"2% %2 B % 
"26 ! 5
 %2 
.%
4 
.6!.%
!2!!" 
. %3"2!5
%12!2!5" !
.%
2.4. Application Areas and Examples
+. "%D""
  2.
 !7"%1'9$#1'1$'2.
!"$$*
L80 /!2 2 !.2  
%$;
L80 "  !.2
%$<
L8A90 4C"!
.!  %$?&2"
$#&%3
$'&%33
$$4! 6*==!!!% %=2/"$(2'(#'%
$;3% %2  I*==!!!%%= "!=J2  4  /!
I*==!!!% C!%=  =J2 1 1 I*==!!!% %=
=.VJ2/"$(2'(#'%
$<3% %2 I*==!!!%%= 9<GJ2 0I*==
!!!%%=%J2/"$(2'(#'%
$?3% %2 DI*==!!!%! %==99<%J2 1,DI*==!!!%!%=== 
= V= %J2 ,1.I*==!!!%.%== 
"==V "V!==V= ==!V=
&&36
<#
.  5
". %$@8
"2"26""!
.%$F
L<A40 +.22222
%$G
L! A 0  5       
   2 " !  "   .  
"%;(8. 
2%;#
L50222!
.%;'
L5%0+.!! %;$%
L4A0 D!.22
 66.
%;;
L0 2.  
".%;<
L0 &          
 %;?
3"2'$ 
;@%4".   
"6"%
2"22!.%
4 22!!.
%
V!V %%J2 4"I*==!!!%"%==!V= 
6%6J2 -I*==!!!%%==!=6%CJ2 I*==
!!!%%=+!,J2/"$(2'(#'%
$@3% %2I*==!!!%%=JA  I0'((F2%#;;JB2I*==!!!%%==
 = %J2/"$(2'(#'%
$F3% %2 0"I*==.%"%=J2 1.I*==!!!%.%=J2
0XI*==!!!%"%J2/"$(2'(#'%
$G3% %2 ," +I*==!!!%"%=+%J2 %%%I*==!!!%%==
==6 =J2 0;,I*==!!!%;%=J2 +I*==
!!!%%=J2/"$(2'(#'%
;(3% %2 &I*==%%== =,$''=&PJ2 I*== %%%=
= %6PW(('$'($UWUWUWUW#UVW'$'(J2/"
$(2'(#'%
;#3% %2:!I*==!!!%!%====.%J2/"$(2'(#'%
;'3% %2 9.I*==!!!%.%=.J2 4%I*==
!!!%%=J2D,66I*==!!!%!66%= %J2/"$(2'(#'%
;$3% %2 , &I*==%%==J2 E I*==%%==V=P
W2J2/"$(2'(#'%
;;3% %2 &I*==!!!%%=J2 I*==!!!%%=J2 - I*==
!!!% %=== =J2/"$(2'(#'%
;<3% %2:)I*==!!!% %==. = %J24">3
I*==!!!%%.==J2/"$(2'(#'%
;?3% %20';I*==!!!%';%=J2/"$(2'(#'%
;@3% %2I*==!!!%%=J2/"$(2'(#'%
9R'%R+9.
<'
2.5. Summary
2!5!  6
!*.%
DC22
2 " !%
E62!6""%
"22!6
! H!".H"
.%4! 
!9R;2%
D 2! 
%D6
22
 "%D.
 "2  .
9R#2"%D
".
 "%2! 
."2
. %&
2.! %
0 2!7H!
."HH!H%
R'%$2N+9.O2!H!
.H%D
2!! 2
A6B
A6"B%&
7 "56"2
!7  6"%62!
2!
%
4!2  
2%D 
"6 !.
!"%"2  
!%D2 "
"557
" 5%
D!" 
.%
629R$22!!%
<$
3
Configurators
9R'22 " .
%D
.%"2
AR'%$%'2N+9.
9OB2! 57%D
2.%42 2
"72"%
2"5%
"2 
" "*!2
AB
.%42 !%
4 AB
!.%&2!! 
6.%42!!
 2  7!
%
Configuration in the Context of Product Customization
.2" 
. %+"2.
2
  %4  .
!AR'%#%$%#2N9.&OB2
""! ".2%4
" !6
 %  2 
.!2" "
%42 R$%#2N+
9+O2.!
I+'(($J*
9R$%R9 
<;
0 D2
.2A
R'%$%$%'2N+&OB2!%4.

%925
22"%,2
 2%
0  2A
B ! 2
AB%2
ACB
2!72 
 %
Figure 3.1. Development Process for Custom Products
!2 AB2
  
%D2
"" .%+"2!
"%! !!
%
3.1. Product Models
4  .2 A 
R'%$%$%'2N+&OB %D
2"A
R'%$%$%$2N,"OB2
%+"2A
R'%#%$%#2N9.&OB!%&"2
9*
<<
2"2 2"
6%
D2 2
AR'%$%$%'2N+&OB2 
""2"2
%4 "22
2"! "
67I- '(#(2%F#J%
Basic Meta Model for Generic Product Modeling
46 2
 A!!R$%$%$%<2N&
O2H9 HB%E2"
L./2
L2
L
%4
A R$%'2N1),,9 +OB%4
 "2  
2!!"5%
Figure 3.2. Basic Generic Meta Model for Configurable Products
Product Models in the Context of Configuration
6 22
AB%!
2!! 
"%
4! 
! "*6"
!"!%42!59
R;2%
27 
   .%
3.1.1. Components: Structural Decomposition
DAB2%
9"%4"
6ABAB%
9R$%R9 
<?
2.!*
&#0 9"7A7B%4
5"%
80 4. 
2AR$%#%'2N&*99
OB%
@0 &"*
LB60. .
"M!HH%
L160 %4!"2
AB"%& 2!HH
2%
L80 "2
*% %2
C2 "C"%
:!2 26
%
0 2"
"C %#
Components in the Context of Configuration
D 6 2
"%,2
A R$%$2N91OB*!
2%& 
2AB%&
2!%
Figure 3.3. Compositional Structure of a Bike
#! ![n..m]2!n!m
%&6n[n]%
9*
<@
Configuration Decisions Related to the Compositional Structure
-2  
! A6
" R$%;2N9 OB'*
% 0 "2
"" %
422"6"%
% 70
&%*"[0..1]2
"5A% R$%;2N9
 OB%
1%  *   "     [1]2   
"%
9% *"[n..m]2!n >= 0, m
> n2"67"%47"
7n7m%2!
*
% 2
% %
% 0
&%4)*2""6 
%D"5)2
%42"2
!)"
!%
1% !*&!
%
% 0
&%%0*42
!"2!2.%
1% *&!!%
'I- '(#(2%F$F;J2I:'((?J2I:'((?J2!%
9R$%R9 
<F
Figure 3.4. Structural Configuration Decisions
D.2!R;%;%#2N
, O%4!!6
%
3.1.2. Attributes: Component Characteristics
8A2$B
% 2" 
%
"2
%
&.!*
'04!%
#04"2% %22 2"AB2
%M!5A!B%
0 &"""%& 2
"[1]22! "";*
$H H22I- '(#(J27
HH2".%2
2% %2"%
;I/Y '(($J2!%
&*99
<G
L8:2304n!%n!%
L8:60 41!A!92!
!61B%
L82304.m!%m%
L860 4"A
!2!61B%
L660 36""A!9
!B%
L60 3truefalseAB%
L860 &""%
L!"23046A!9
!2!!6nB%
$0 92! %
.*
L<0 96"truefalse%
L&:0 ""2
% %2blue%
L'0 2% %2 
2.53%
L0  2% %2"King Louis II."%
L!0 922% %2{blue, red,
green}%
L$0 92 2% %2
!015002[0-1500]%
L:0 92% %2 
!012[0.0-1.0]%
L0 &!2% %2{[10-15]}%
Attributes in the Context of Configuration
- "2"*
@0 &.2!""
 A% %2B%4
 "2%
0 9.6"
A% %2"6
HH2B%4
 26%
<09A% %2
! 
B%4%
<&!2I1 #GG$2%#<J%
9R$%R9 
?(
&9?0&!!%
0!2A% %2"
HH2HHH HB%4.
2%
10 -2"
"A% %2 B%4
%
D./".
="%
Configuration Decisions Related to Component Characteristics
4! *
% 870
&%*D"AtMostOneA7B2
"5%
1% *D"AtLeastOne2
"%
9% *D" 12
"67"% 2
!27"""""
%
%80
&%% *    . 2       
5%
1% *.2 
%
D.2!
R;%;%#%'2N&O%& 2!!6
%
3.1.3. Constraints: Domain Restrictions
-  22!
62
 %2!A"2
B2!2
662"A
R;%;%;%#2NO6B%
- ! "I- '(#(2%F;F<J*
<0 &!6
 %!2! 
!226true2 
% 2%
?2I1 #GG$2%#<J%
9*-
?#
2" %62
 %& 2
*
L:0 "2 2
 and2or2not2==A7B2!=A7B2<2=<2>2>=2%
L80 ,"+2-2/2*2%A
B%
LC0 -"%
L<0 -!%
L'0 -!%
@0 D2A
B"A
R;%;%;%#2NOB%
@0& If <condition> Then <action>%D
2".2 
! %  true2!"
2 6%4"
 2!" %
Constraints in the Context of Configuration
 2"
 =%
&"- 26 2
A%I- '(#(2%F<J2I/Y '(($J2I3.
'((FJB*
L D22
 ! %
L 9"%27
 %4!"2!
"%
L -""2!"! 
%
Configuration Decisions Related to Constraints
 2
*
% 
&%6%D2
.! %&62
.%&
". " 
!%&"2!. 
2!    %
4%
9R$%R9 
?'
1% "&6
 2! "!66
%&62 "!
"  
 %0!2 26"!"6.
"6  %
.2!52
2%D!6
R;%;%<2N9, O2!!!62%
D5!%6
 AR$%$%$%<2N&OB2
 "
%3"2"2"
!!%
D! 29R;2
!  . 2
2".2!%02
(7.%
"2!! 
6%
3.2. Product Configuration
!!A"
B%D ACB"R'%#%$2
N9.++9 O2 %
0!!"2!%
3.2.1. Characteristics of Product Configuration
4 !%
62!2
R'%#%$2N9.++9 O
I'((?2%$'J*
0 2"
%&6
.%4"""%
0 2
2!6%4.A
B"%E2  2
6 2!
%2%
2%
0 D.2
""%2
"  2
!"%4"
8
 "AR'%$%$%;2N8 OB%
9+9 
?$
6.2 "
2!
2".%
!*
1  + 
A
B
AB%4"2
"AB
%9 
2.2
"A%I'((?2%;#JB%
2. !I'((?2%;(J*
L   222
!  %4 
!%
L &2A 
B%
L   2
!A"B%&2"
%@
L 4 "
%
9.!"2 AB 
!"2 2!2
% 2!2!
"!6 %
.29R;22
!2%4 2
!""2*
2!
 *
0 4
%2!
".%
 0 & 
 .%
 0 4"!
!  %
D!ABR;%;%$%#2N
,O%
D2!.  262
!! %
@2" 2!R'%'%?2N,9.O
72.2
"%
9R$%R9 
?;
3.2.2. Product Configuration Processes
+ 
%2!! 2!!
  !AI,#GG(2%
;G<(J2I1 #GG$2%#F#GJ2I'((?J2I-!'((?2%#'$JB*
 10   2
%
#10 AB
 2!
%
 10  
!2" "%
! 2!!"%
3.2.2.1. The Global Configuration Process
2    
"22!"%2
 A!!"!B
. %
D ."I'((?2%
;'J!2
 % R$%<2N)9 +O%
Figure 3.5. Global Configuration Process
+9 +
?<
0 % 2!! 
"%4!
2!"."%
0 4 "
AB2!
 !A"B2
%& 
A!
 "B%452
!
%
0 4./
.  %  
257
22.%4
! F*
L 0 
7!  
%9"2  2 
%&
"2 7%
,2%
L 0 
"" 7" 
AB7AB%
L 0 2
"2! 2 7
2"2
%
@0 4  
257
!%
4"2!!
 "!* 26 
%4!"
%4" "
./%4
" ./I1 #GG$2
%#F#GJ%
E2"2 "%
3.2.2.2. The Configuration Process as a Transformation Process
2 * 
2 .2
" %
 R$%?2N9 4+O!
  "%
F%I,#GG(2%;G<(J2I1 #GG$2%#F#GJ2I'((?J
9R$%R9 
??
Figure 3.6. Configuration as a Transformation Process
4%2
  A" B
%4 R$%#2N+
,O2""*
% 9"
% 97"
% 9"
% 9.
% &7"
% &
% 9
  2 %4
"25%G R$%@2N9 O
! 2!!*
Figure 3.7. Configuration Steps
G2 "2"! 2!
!" ""5!%&2 
"%4"22
! %
+9 +
?@
60 &2 
%622
7""%
60 4 " 
 %4 
2 "". 
!"I:'((;J%4"
"%&2
 
AR$%$%'%'2N=-OR@%'%'2
N- OB%
80  "2 
" %2
 
 "%,2
  2
"! %
0 &2
 5" %& 2
"" "C 
"%
4 2!
 "57%
&" 2./
%4 2
% 
%
3.2.2.3. The Interactive Configuration Process
0  AB
AB2!"! !
"!2"*
A R$%F2N9 +OB%
2!.
R'%$%<2N, &O%I-!'((?2
%#'$J%
Figure 3.8. Interactive Configuration Process
9R$%R9 
?F
4
%4"
%2  
. %E2 
"" "  
 2%
46
" .%
&2 % 2
"! *
'0 4"  
6" %D "
A(B 2!"
"  AB%
10  "2 
.2% %2"7  
%2 ""
"7%
(@7(8
0 4"2
 2R$%'%'%'2N49 
+4+O%4!2
" ""  
" %
0 & %
46"%02
""%4
2 "6
 %
4!"
 %&2
5 %
 ""2
!%62!
! "%
3.3. Product Configurators
2!! !%D! 
!.7
" %E62!!!2. %&
 . "!""
2!6
 %
The Role of Configurators within Product Customization
+ "".I1'(((J%4"
"!"
 H H.2"6
I- '((;J%
+9 
?G
& R$%G2N+9 >"3,9.O2
 ".%
!25
 %
Figure 3.9. Product Configurator as Key Enabler for Mass Customization
2 5 
%2 2 
"""
%4 "5
7"262 
%422"2"2
" 6I-!'((?J%
82 7
%!.
AR'%$%;%$2N+)4 +9.O2%%I-
!'((G2%';#JB!"%
Origins of Product Configuration Tools
 '("2 "4%8 
I-!'((?2%$'J*
8$0 #!
 %4 2!"" 
62"
.%
!@10 8 !
 %4"5"" %
 !%4 " 
!3-+"27   
"%2"%
! 0 D #GG(2"
2 "!!!2%
3 !"5!
"!9-,!% 2
6"H H6 "
%
9R$%R9 
@(
2"6" %6
!2!" "
!!!%0!2!" 9&
3-+%
Definition of Product Configurators
H&! 
  2!6 2
 %4  "
 % 
76."  
HI0#GGF2%#(@J%
 2 "!"
 A9&B%D"
2"!
.A B 
%
4"! %0!2
!  2
7!%D5. 
7"! %
3.3.1. Tasks and Requirements
9 6"7%& 2
  " 
.5%42 
2
 .%4"2" 
" I'((?2%'@J%
0!2" "%
27#(%E2
6
"" "%
D"  2 
 "%D! 
2(*
#0""2 2%%6
  %
@70 2. 
%D 27
%
50 " 2.2%%6
 %##
#(I+'(($2%'?J2I- '((;2%'?J2I'((?2%$$$;2%;G<(J2I-!'((G2%'F'J2I> '(#(2
%';J
##46* 5AB%
" !AB2!6 "
%4"2
  6A(B%
4-7
@#
3.3.1.1. Tasks of a Configurator
D2! R$%#(2N49 O
.%D2 !
72!%4   
2 I- '(($2%'$=$@J2I'((?2%$$$;=;G<(J2
I> '(#(2%';J%
Figure 3.10. Tasks of a Configurator
Information
4  
2  %
42"2" 
"!%
 "5 2
""" %
Specification / Recommendation
4  
2"2 5  %
!2  
2   
 2!" 67%&
"2"" 6
27%
2 5""%4
66"2 22
"%8"  ".
 %4 
   72
%
D 27
!*2 
9R$%R9 
@'
%46"2 
 ! 
%4"
 %8 
5"
 "%62"2
 2!!"7 
%&2H!H62    
 !A%I- '(($JB%2
 " 2  
  %62!"7
2522
 %
Communication
4 2""*.
  AR'%$%<%'2
N4 +A+BOB%& C
 2.2 "%
2 7
7"7%,2 !
"2  " 
" "5 5%4 
72!
72. 
!%
82 22
 %3"26.2!
 "2
"%4  2 
"%&.2
!!".
 2"
!" %
Integration
4"".2 "!
4#'"%E"
  7"
22!2"
%25 
 ! "2!
%& 2 
! "
23-+"29-, 
+,#$" %  2
 ""7 9&"
! .A% %2$B%
25 !"
!"42"
%
#'&%"  "
#$&%- 

@$
3.3.1.2. Additional Requirements
D"22
 2"
7!%
2"%46"
 6.
6 "%4"
 !  " 
 2 %
8D27
 "% 2 !
%4 
7""2!
7%-   2
    6!
 7""5% 2
" 5! %4 
"!"!%
  !!!2
" ! 22!%
622 !.
  !%87 
""!% 6
" %
3.3.2. Features
2
  %2" !
 "%
! 2!!"""
 "!7%
 R$%##2N8!,9 "O !
6!%
9R$%R9 
@;
Figure 3.11. Overview of the Main Features of a Configuration System
D   2
   2%,25
 *
@0 32!"
%
L50 9  
%
L<0 
 %
$0 9  %
"2!!2!
!22"2!
%
3.3.2.1. Information
4!  7
2R$%$%#%#2NO%
1%0 4!  "5
%2%!
!2" %
"2  ."2 
"%""
"%

@<
10 4!"%
222 
  %&
.%
.".! 2'! $%8!2!
 "2.  5
%D!. R$%$%$%;2N9 
9O2H.H%
1230 &6!
2!7" %E"
 2! 
  2"  
 "%& 6
"6%
3.3.2.2. Specification / Recommendation
7
R$%$%#%#2N=-O2" 
! %
1230 4 
./%0 !2
 2! 6  2
27 7  
% 2!.  
 *
L5&0 1"2!
" 6A!2
2622%BA!
 B%&22 
%2!
.%"
22AR'%#%$%#2
N9.&OB%
L90 2 
!  A% %2'
$.B%3"2!)
AR'%#%$%#2N9.&OB2
"%4" 
2".!%4"5"
"%
& " 
%
2! !."
  *
L1(7%0 4 ""
 ""%2
 7""2" 7
"%0!2 !2
"!"*
"" !%&
9R$%R9 
@?
27!   
6%
L@%0 362!2"2
"%4 7
 " 
%
D!!R$%$%$%;2N9 9
O2H+H%
90 4 "
 %82 
 "  A
B%82"
 "%3% %2 6"
?(2 "
"!%2
  "A"
B%
E"2!"
 52 
%2 " 2%%
"  
%-%
,2"" ""
%42 "2 
 ! 62
%2"*
2 ! 
!%8"2 ""%
@230   2 
" !5"%2
 (%8
!%
! """%2"
""5
%4 
AB%
4 2A6B 
"""Z"%
222
7%4 
6 2% %22
7"%
0  2"
 22"2! 2
2"
 %
-"25
 ! *""%
2! 
! %2"

@@
 "A%
I+'((FJB%
4"2" "2
" !%E2"
6  %62
"" 
22 ++#;"%
0 &  
2!=6%
2"%4 
 6 "
".!  %"5
2!! 
  %
0 2
 "6 2
"%4 .
 2!" 6
" I- '(($2%<F<GJ%
.2R$%$%$%;2N9 9O2H.H%
230 &
!"  
%4"627
 %4!
 !"%
3.3.2.3. Communication
462"
7R$%$%#%#2N9O%
@0 &.
!%"2
%
  2!" 
2"%4"
5%7 2
!"
%& 2  
!5%
C0 &"
   2
 %4 "2!
 "%8"2
  %4 "
"%97"2%422
C7 %4
.!%
230 8"2" 
2" %42
"7%2
#;&% %
9R$%R9 
@F
""62 "
 !%
&  5
6"2!7  %4
"! 2 "
2!  !6.
"%
4" "%4 
 " "
 %
3.3.2.4. Integration and Administration
4! .7
R$%$%#%#2N O%
0 8 "
!%
2  
%4"2 "7
2!!!52
"%
,2 5" "
 2 AI0'((F2%#FJB*
L0 72=%
L10 ! 22 %
L10 1A18,B222
%
L10 +=!%
L10 - 27"%
L$0 42"%
LC02%
L$0 %
3"722! 2!
"  %4 
7 
%
$  230 4      !  
"  ""
5"%02 "
 "!
"2*
L 0 9!=229-,"
22%
L10 3-+2++2+,2 2%
& "22"
.%2!"
"!2  [,:#<%E2!"
!"62I> '(#(2
%$<J*
#<&%<9  

@G
L 3&94A3 &294B2
L 4-&EA6 B2
L [,:A9[,:  B2
L 691:A[,:91:"B%
82(30 ,"
%1" !
  A&+B2" 
""2!".%4 
"  
2!  %
2&(30 1"6
 ! 2"
A+B!"%4 +
 " 2!!2"
2%6 2 !
! "*
L$0 4 %
L1$( #?($#@(0 4
 %
L 8$0 4! .%
L!@1(110 4 "
%
L @0 4%
L60   A8B"
!"2% %2
2%
8230   
22 2 "5
"%4!
 2 %
 "5!2
""2  
+%
3.3.2.5. Other Features
1"2"5""
2%42
! *
:230 4  2
 &!
 C %82 C
2!"7%82
C6 "
5%&2   
77" %
230  .2
!%1" 
#?&% %"
#@&%- %"
9R$%R9 
F(
2  !"
7"%4"2
 " %
230 - 52
""! 
 ""%26 =
%8 2! 
"!%4""
2 !% 2 2
 2% %2
 "%
9 52"!%
62"" 
"22!
C "%
3.3.2.6. Development
"2"  2
%D!!
*
$230  ""
.HH!22
7%
  22
2  2"
 5%
#230 &
 ! !2""
%& "72!
 ! "%
62  "%
  7 C2
56"%
46 ""
%&A'$B2
  "527" %
-"2 ! 2!!
 C"6%8
2.2
  %42
"%8!29R;22
  "6"%
3.3.3. Categorization
1! 2 2!! 2
 ""  %D
6""2 .
2"2%42
"     
 %
9 .
F#
"  5"! "!
2 "%2 
.!". "%
2"626  .2#F%
2)#G""%
D! . "2
 "62%D
. 6""
%4 6"! R$%#'2N, 169 O%
2! *
8"0 96
 "%,26 !
 ""%
0 9 . 
"!%4."5
 %
0 )! "
 "2 .5 %
0 9 "
 "%2
 % 
25*
L  0 9.       
 %
L0 9 
" %
L 0 "
 "%
L1 0 
 .%
0 +  
%
D!!2 
!%
#FI1'((;2%'?$(J2 I:'((?2%;G<'J2I'((?2% <#<@J2I-!'((?2%$($$J2I-
 '(#(2%@<F(J2I> '(#(2%$G?(J%
#G4 6 \!"2!
I\!"#G??J%
9R$%R9 
F'
Figure 3.12. Morphological Box of Configurators
9 .
F$
3.3.3.1. Application Context
10  257!"C 
! ""*
 **%&
2.2""
!" %4
"" " 
"2R$%$%$%$2N, 9O%
<0 &"" "
  %.3:3/2
 !! %4.
"%2
6.3:/26
"! 257
! %
0 :!2 5 *
5""7""
%02"%
&")2""2!!"
" %36"
.%/2252
" !!!%2
  A" B2
!2"A!"B2!
"7"%H
HR$%$%$%;2N9 9O!
%
#0 4"!25!5
 %%27"2
7"2 "2 
""%&62"'(A% %27
 2BA% %2!2
!%!B65!%0!2
A% %26 5"B
A% %26B"6'#%
"0 4 .)%
D 22"
  
%
& A""H HH7 
HB  %4""
2"5"%
  "%
4" 9-,"%
9  9&"
%4"5" 2
'(   " 2   *==%!% =!
=3EV8VG';#]3EV8VG';###(V)%9$%&;.VV  2,"#F2'(#'%
'#       "      2
 *==!% %=!=='#G<;<@;="^+^^^^
 ^96%PW#2,"#F2'(#'%
9R$%R9 
F;
!%&"   
'! %
9   3-+"!2++"2
%4"! 
!
"%
2"2
62"%
0  25 .
6%+"2 " 
 %
& "5 
A%R$%$%'%$2N9
OB%47"!
" 2"2 %D
 !" 2
  "%4"! 
"7 "225
 !%
82 ! ""
%
C0 62
AR'%$%$%;2N8 OB"
".2"  
 %4 
 "5"
 %42 
  
%"  "6
" %97"2 
%
"2 3-"
"27!%
3.3.3.2. System Environment
D2 
 "62%
0 &"2"%9 
" ./A% %29=B
  %E!"2"5"
1'9" %0!2"
!2!*
L   62"$"A% %29&
! ' B2
L  !A% %2. 
B2
L  A% %2  2" 
 2%B%
9 .
F<
"26%4
  ".
%
&"".%D"
2 %42
!7%&604,:''
! %
2"."2
  AB%2A""B
!! A"B "
!%36"04,:<'$H6H
7&2/&=D 
I+"'(#(J%
22 !
 %4"""
!7 %
0 & "5" "
 2AB
%42 2""
%D7 "7
A"B22 
".AB%4"."
=7A"2% %2&2/&=D
B""  
A"B%
0 & "
%  "2
"%!!26%
& "7"2
!62 !"A
B2%8!2
  "2"%62! 
!3-+"2!
 %
46 2! 
%2" "
 " 5&+=+ 
%"  2 
 "%97"22 2
"2%% % R$%#$2
N 9 "O
%
''&%=" 69  
'$,"*04,:/2. 04,:
<%
9R$%R9 
F?
Figure 3.13. Different Integration Scenarios for Configuration Systems
0 4 ! 5
."%& R$%#;2
N :9 "O2! *
L  2
L  2
L  %
72 "2 "
"%4 """!
62% %2 "%
"56%
2 ""
2! "
%4"22" A"B!
%
"2 56 2! 
%4 2 
"6"!2  A&+B
A+B%&!&+"
 %2 
6%&+2""
 "%62"
2! +%4! "
==%+2 "
%
9 .
F@
Figure 3.14. Integration Levels of Configuration Systems
#0 4. 5"2
5 2! "%
4 "" 52
%25 
020%4".2
 !22!!
"2!"*" 
 " "%
3.3.3.3. Modeling Capabilities
E6!!27" 
%
0   252
! 5
%R'%#%$%#2N9.&O!!
 .%42)20
22222)
)%D  
7".
 "%4""2 "!
%
:0 1"  25!
 "!7%D "
 22
2!%8!2
%
10 & " 2
 
 %4"2! " 
" 2 ""%,2
!2! 2% %2
9R$%R9 
FF
!" %
3"
L 2
L 2
L 
%
7 "! 
7!  "%8 
"! %&2"HH
!"7%
962!! C!7 
!  "%4!"2 
 "5! %E2!
 222
   %
42! 
%02 
! %42 
! "*! 
 !2! 
!%0!2
 "%
3.3.3.4. Configuration Characteristics
46 " 5 
%
Configuration Approach
2 .% 
 %
0  2 
L 2
L 2
L 6%
 R$%#<2N)&O"%
9 .
FG
Figure 3.15. General Specification Approaches
2  . 5
2!!"%4"
5"22
2% 2!
!7%02"
! !"%
22 
5%42
%  25"
2"%4!
72!C"!
! * 27
%
&2 6
%2 " 7%4
7"  2!
C"!"%
0 4
 % ".2 R'%G2
N4",.+ OR'%$%$%$2N,"O2!
!  "*
L0 " .
2  6
".%62 
" %
L"0 ( 
2AR'%#%#2N9OB
"%&66 
"%5 ';%
L80 +
2%1"
';*==!!!%"%I*==!!!%"%=J2,"'(2'(#'%
9R$%R9 
G(
2%E2
6."%
L$0 86 %
 !"%4 
%
 R$%#?2N-1!9 4"9 O!
 %-
R$%#2N1,,)+, O
%
Figure 3.16. Relationship Between Configuration Type and Configuration Decisions
Interaction characteristics
0   2
 "%
0 4./2!!"
   26
!!"*  %
32 " !
"%&  27
9 .
G#
%4 "2
%4" %
42   %02 !
!! *!
""72
"""%
10& %
 " AI'((?2%<'JB%4
"7! %*
L1&"0 46  %
0"" 
6".  "%
L0 45"
5%222
5"7%4
 "AR$%#%#2
N9*OB%
LC0 4 5  
%62"72!
 ""
"%4"%
L$0   
2%2"
""%
L 0 4  2
"%27
!%
L80 & "C
   "%4! 
7%
$0 ""  2 
" "" %4 
 5% 6 
"%
&)77A(
"B
%& 2 
 %,  % 
2" .%07
!7  %
".!26%"
!6%&2
  6%
&2 "
 5.! %4"7"
  2"!%0!2
  %&62"
 !6%
2 "  "%
9R$%R9 
G'
Configuration procedure
4A B
."%
0 4 "" 
 *! !*
!5" %4
2 %
82"
 !%3"2 !" 
 %"
AR'%$%$%$2N,"OB2! !
"" 
%62" 2!
"!26%
,2 !)
""""
'<% !6  7 
 AR$%$%$%$2N, 9O2H+
HB%
0    2
"'?%,"2
2!!" 
"!6 %2
2 !
25%
6 & 0 &     
5%D"
5  2"
. 2!22  %
1"25! !
 !5%& 
 "25 "
 %D"" 
"%4"2 "  2
"%
0!22"="
 *
LC&0   2
 !%&"
 AHH!B%9"
"%4"22 
%
L:&0 4 
"5" %D"
% 252"
'<  "2 "
:I:'((?J%
'?I> '(#(J2 H3 H2!"
%
9 .
G$
""2 
%3"25" "
%26 
" %
&"262"" 
5%42"""AR$%#%$2N9
*-OB"%9
! 6*A!{0, 1, 2, 3, 4,
5, 6}2""2A < 4% 
4256"!"!"
C6%& "2
 "2!"7
A 07"0!
%0!2"6"2
"62!%9
""%
L5&0 4!6*
0! A5{1,
2, 3}  2!
""  "%2 
2 ! "
72!!"!"5%
90 "     2     
 5%D"
!"2")2
2%!2
 %& 
 %D!  A%
I> '(#(JB*
L'(0 4 %5
"!%
L(230 4 "2
 %"
"22 
" %4"25"
 2%
L@230 42 
 " 5"""
2% %2 %
L 230 8"2 "
"22"%4!"7"
"%
&)2"2
%2"
 %
0 & 2
%&
%+"
7%
9R$%R9 
G;
-! "!  !
*"2 %1"
 2!5HH
%"2" "2
 !   
2%
!""" 
%522
7A6"
B%4!"" 
%&"2!2 6""
*72
"  27"
A2;R$%$%$%;2N9 
9O2H+HB%  
 72
! AB25AB%
& 
*%8
 )2% %2"6
 2)2% %2
" %
 27 
%4" 6
 %4C%4
2% %22!
%4C"2
!!"!AI- '(#(JB%
Presentation
9  ""!"%42! 2
 %
0 &"R$%$%'%'2N=-
O2  %
9 )02!
 !" AH+"H
!B%&"2 "
AH.H!B%9"2  26
 %
90 9  7"%
 %4"5"
 %422". %
4 " "2
.2"""%
 !2!*
L'230 4"! 
5"%
L:230 "!!
2% %2   C
9 .
G<
  % C
%
L!"230 ! 
  C%4!"2"
%
-!I- '(($2%
<G?(J*
L$230 4 
" " .
%45" 2"
"%
L@2))30 4
""2 %D
62"
6"2 %
I- '(($2%<G?(J*
L1(0 4.
2 % 2
 %8"2"
%. 7"2
! %4"7!%
L 0 ,  
!  %D  7
"2"22
%1"."2.""
!7%
L@0  2 
"" %
 2!6" 
%826"!" 
."%8
27 5  "
" %
L+$(0 46.!
6"%4
$  
"%D!!'@!
 $72!"
"[$'F%2$
7!*"
.2" ! 
52.%
"2 .""%&
!"!2 .
%&.!"
'@D!!"  !%
'F*==%!% =!=[$2,"#;2'(#'%
9R$%R9 
G?
 2 
!%
10 & 2"
 2A%I+
'((F2%##JB%25!
62"
%
2 
2% %2!6
2"C5%97"2
" 2"5
%42
 !"6%
2)76%02!
 !*"%2
"25
52"%2!
!"2 22
 5%2"
"22!!"
!"67%2
"! %
3.3.3.5. Implementation Aspects
  .2!!
2 "%
0 2
 A%I'((?2%<;JB*
L 0 4  2
%+!   "!
%
L80 4  
 2% %23-+!%4! 
52! " ! 
%
L%0 4   !%
4"""  " "
2"A% %22
H"H!B%2!""
 "H6H6
.%
L@0 &6 "2% %2"2
 %
L1&%0  
!2! "
!%& "
  ! 22 2  
 2 "%
9 .
G@
C0 )2 
" %&  
  2 "%
2* "
"%
80 "2 ! "
" % !
   2!267
I'((?2%<;<@J%
D7 22"
 %2
!   2%%
! " I'((?2%<;J
AI#GGFJB*
L$0 4 
2!5
"%  
2!  I- '(($2
%F(F#J%
L@0 - AH-H
R$%#%$2N9*-OB!
  %46!  
"6%& " 
 "5  
 %,
 I- '(($2%@@@FJ%
L   0 4      " 2
 %  
! %& 
 %
"2!2
 )2%% 
! AR$%#2N+,OB*
L$0 9 
"%D2!
2!6
"%" I- '(($2%@GJ%
L@0 9 
%02"2
% 2(" 
%4" %
4 25%
L 0 4  
! 2  2   !   2  
! %9
!2%%2""
 %4"2"
  %4 
 2I-
'(($2%@FJ%
9R$%R9 
GF
4  12 13*
! 2
%
L  0 & 2
!2 
22%  22
"%427"
  7%9
"! 2!
%
L6;0 2 
C%DC
2!"2
   .=.%D
A"B2C2%%2%
  2C%
9 %
72
7*
LB%0 !  2!)
2  !%
4 " 
! %6"!"7
2"   %,
7 "
I- '(($2%F(J%
L470 &272
" %2  "2
7%
4!  .%:
R@%#%'2N9.O!!
9R;2  6
""%0!2  "
 2!5 
"%
3.3.4. Benefits
R'%$%;2N3&O2!"
. %02!!"  2
"" %
!  A%
I'((?2%;$;;JB*
Supplier Perspective
0
L 6"  "
%
"
GG
L -"  .%
L   ! " ! 
" %
L ".7
2 "!
 7"%
L ," 6%
10
L     ! 2
7! 
%
L 37"  
2"
%
L  !%
L !. !"%
L -7""   
 !%
0
L - A%%2 
! B"  "  %
L - A%%722
6 B%
Customer Perspective
0
L &2.%
L %
L "AH"!HB"AH"HB%
L - %
L ,2! 2
%
4   "!
%3"2! "5
7"2A-8B
 "%
3.4. Summary
2!.*!
  ! 2
 "%
& !22!2
!%+"
 AR'%$%$%'2N+&OB! "%
4"22
 %+"6 2
"AR'%#%$%#2N9.&
OB%2" %
"22!"6 
9R$%R9 
#((
2
%1!".6
A2R;%;2N, 9OB%
E62!2!
 %D.  
*./%4.!
!.2"
.AR;%;%$%#2N,OB%42
! " A  
B%4 !
2  
 %4" %
2!5
5!%
4!%D6
 !.2
7 
. %,2!6"
 "%"2
 %
4!%"
   " %9R;2
2
"%
#(#
4
Methodology and Conceptualization
2!!. 
*%D !2"!"
.  7"2 2 "
.%
&R#%'2N,O  !2
 ""! *
#% 4. 
%
'% 4.%2
   6 

D2!2C9
R<2 !"2!89 
 "  %9R?2
#$!!.2  
   ! %
:5 !689 5%
4.1. The OpenConfigurator Methodology
& 289   
"%D""2! 
" %&"2""
7!2"    
! %472 
 "2  
%
89 22 
2     
9R;%R, "9.
#('
6 6"%4"2 ""26
%! 2!!."
6 6%
4.1.1. Main Characteristics
4"289 5 
%"289 5 *
L 2
L C2
L  2
L 2
L /%
D5"6!%
0 89  %42
 %4
!5  !
 5"%"2
"  ! 22
 "5 %4
! "2"2"" 
   " "%,2
"! "  2
"! ."A,B "%
6;0 ,"289 5 
2%4"2!
   7" 
! AR'%$%$%'2N+&OB%D! 
.2!6"
%2 
"%"2C
""  "22
A88&BC A88+BC  A88+B2
 %:2C
"%
C0 &89 5 
5%4!
"%2 "!  
%8289 "
2!
 %422 
89 !2"" 
2!" 2!  
   6 "2%4 
 2"   
  "2
 HH!" %
$0 4.!5"
2 %D
  CA%%/  
2!B2! ! 
,9
#($
A%%/B%4!
!/ !!"/ "%
2!  
2."%02!
5"A% %2"
!6B%4 
6%
E0 & "72! 
",%42/
  %2/ 2C "
 *2
!22
" !/%4 2
!2""    2 2
 ! "!HH%32  
 89 5!6 2
/ A% %2/12/+&212%B
 / !!7"%
The Fundamental Idea of OpenConfigurator
4 2*
L2E32
L2;3
7"2
L AR$%'%'%'2N49 +
4+OB2E3%
4. " R;%#2N48
9 &O%
Figure 4.1. The Fundamental Idea behind the OpenConfigurator Approach
489 !2. %
82!2%02
  A/1B %
D5  %
9R;%R, "9.
#(;
4.1.2. Configurator Development
H H  "2"
2!5 ! "2 R;%'2
N8!89 , "O%D!"6
!%62!5!.
!%
Figure 4.2. Overview of OpenConfigurator Methodology
& ""2 "
2 %"
" "%
46%
4""62!
 ! %""  2
 2"!2%% %D
 !2 2
 " " %89 5C
2! 6 2,:!
% "    
7 ,:89:
6AI '(((JB%4 ,:
. /27
9 
#(<
"89 !#%&.
 !'%
 "2
/! /2"
89 !%4 
  %2   
2 " /
! A3B$%+!
3;" %4
6""  /?5
 "<%" ! 
?%
4   "   A   B2    
2"  /2
%
42 /A/&-B"
2!" %
4!"/&-
(%4"

"2 
A+B%
42 5 
"%2(
A%%!"B  %&
7 222
   
%4&+@
9R?2#$2   
2! "  +%4
 "!  !!
23-+29&+,"%&! 2
 %
"2   
%02"2 /CA,22
+8/8B   
&+%4!"C!"/ " +8
/82/&[1F[,: 2/&[DG!"/+&#(
#E2",:/2
!"  %0!2
 "!%
'E*89 !"56  
!%
$E*! .%& 2
89 H H"" %
;*==!!!%% =2/'#2'(#'%
<*==%%=C=?=== ==6%2/'#2'(#'%
?EC!%
@*==!!!%%===2/'#2'(#'%
F&% , !  <,: 3 2  *==%!% =!
=/V&VV[,:V1 2/'#2'(#'%
G&%,!+<,:>%2*==%!% =!=/V&+VV[,:VDV2
/'#2'(#'%
9R;%R, "9.
#(?
CAC!B%4
 89 
!6%
&"2 " %42
/ A6
B7  %4 !
-X##22 "6
""%
&252  "2
7%E2 2
2"!%
6!2!2!! 7
  2!6 
%
4.1.3. Other Approaches to Configuration
0 .25! 
 2" 
 "% R;%$2N8!8, O  
! 2CC%
Figure 4.3. Overview of Other Methodologies
#(&%,!+2*==%!% =!=/V+V&+2/'#2
'(#'%
##&%-58?2*==%!% =!=-X2& #2'(#'%
& 89 
#(@
36  "2  
"  %9A%I-
'(($JB!522
 2!"
  %47 27  
 ""%+"2
6"2 
72"7"2
!%
&"C22"
"%1 *".,:=89:#'
   ! %42"
AI '(((JB%
0!22
&%4
2%4""
2 2
"2"2C
 2"%E2
! 22
HH%4  5 
!A% %2+ 22%B!
%4"2!  
!2 6%
"2(
2 " C%4
 2A% %2/+ 2/+B2!
". ! %4 
!2!! 
!%
4.1.4. Advantages of OpenConfigurator
2! 
"2! *
L "   2
L  ! 
L  2
4"*
L  "
L  
L 26 
L    6"2 ""
2! *
L  ".  "2!2C
  
L     "/2
 
#'&%; 9  =C9  %
9R;%R, "9.
#(F
L   " ! 
 /
L  "62 6
L 6"2""" 
 
4 2 *
L  2
L 7"".2
"
L  A-8B""
" 
0 .89 5  "2 
!2
!!!!  
.%
4.2. Modeling Approach
4  2#$%
 .R$%$%$%<2N&O2
.!*
(0 4 "
 2%4  "
", " 
/1#;%D2.
 "%
4C!
AR'%$%$%'2N+&OB89 7
 %
0! "2!
R;%'%'2N+,/O%
(0 "2/
A"!"H!"HB%4 
2"2!!
R$%#2N+,O2"6%
02. 
 "AB.AB%4
 6R$%#2N+,O
7""%2" 
2AR$%'%'%'2N49 +4+O
B%
R;%$2N4)9 ,O!!6  
6"%R;%$%'2N,, O!2!/
HH %
#$8  ""! %2! ,:
 7 ! #(" I '(((J%
#;*==%!% =!=/12& #2'(#'%
8C8+,
#(G
0 8.!
AR$%#%$2N9*-OB6 
"%
DR;%'%$2N+ ,!/&O"!2!
A B6"2R;%;%<2N9
, O!!"%
& "67AR$%$%$%<2N
&OB2! %.
R@%#%'2N9.O9R@2%%
1        "  89 
!2!  6 %
4.2.1. Object-Oriented Product Modeling
&R'%$%$%'2N+&O2C
   "!%
2!  !C !
AR$%#2N1,,)+, OB
 !2 !7 5
"*
Table 4.1. Mapping between Object-oriented
Concepts and Product Modeling Concepts
6;6  1 
9 +="
).=. HH=HH
&  = H9H=HH
8C +=2
AB &
,"./ &
, 9
4"./ 9
0D2%& 
"%
&0 . 20
62!!6
%3% %233. 
3$3=3."3
%
8&0 !"
%23
242=2>212%
6;0 &2227%
%&C6
!25%
5 2 30 2""2"
2!!%4"
9R;%R, "9.
##(
C2"
%2"2
!C!!color%
0 &"2% %22 2 %
4"2 %42
"5AHHR$%#%'2
N&*99OB%0!26
"2 ""%4
"%
0C%
!"2".A
R$%#%'2N&969 OB%3% %2
""%
# 0  2! !C
"2"5"*"2
"%2"byte2
 -/+255 24711%42
 A"B"5"%
 R;%;2N368C8+,O!6#<
3%D
R?%#%$2N41,O2!56!%
Figure 4.4. Example Object-Oriented Product Domain Model
"2!R$%#2N1,,
)+, O2C    /
C"7 "%0!2
"" 
2!!"!!76%&
"5"2R;%'%$2N+ ,!/&O289
 . %
#<D,: !%
+,/
###
4.2.2. Product Models in Java
0   C2!
 !!  /    #?
%62/1#@ %,
"2.2
%4!"!"#F%4!
 2 /12!/
6#G*
Example 4.1. Example JavaBean Domain Model
public abstract class Bike {
// Fields
private Frame frame;
private Fork fork;
private Wheels wheels;
private Collection<Equipment> equipments;
// Methods
public int weight() {
// ...
return calculatedWeight;
}
// Accessors
public Frame getFrame() {
return frame;
}
public void setFrame(Frame frame) {
this.frame = frame;
}
...
}
public class MountainBike extends Bike { ... }
public class CityBike extends Bike { ... }
public class Frame {
private int size;
private Color color;
// Accessors
...
}
public class Fork { ... }
public class Wheels { ... }
public class Equipment { ... }
& "  2     !*    
2!/1"%
#?*==!!!%C%=2,"';2'(#'%
#@*==%!% =!=/V12& #2'(#'%
#FE*89 "."2
7 java.io.Serializable%& 2
A"B%
#GSerializable"%
9R;%R, "9.
##'
& 289 2 6
"/% 2/  
2 *
#0 /5""%1
%D . )
"!2" "!A/5
!"B%&2"2
%:!2
"%&"2""""
89 !%
1(0  2/
"Aboolean2byte2int2double2%B2"AString2Integer2
B"A "!B%
8(0 &"2"A% %2
String[]B"A% %2Collection<String>B%4!"2
% !"A% %2EquipmentB2
Collection<Equipment> 2
%,2"2byte[]InputStream2
! " %
0 . 2 /%
D2"!%6
2"double getWeight()! 
%
-   6"289 !
%42!   2
6""!%2
!/ 
%4"!
 %D! 
6%
4.2.3. Providing Meta-Data with Java Annotations
&289 2 ! !
 2 2%2 
 "!* /'(%
2/2"
 !/ 2"
" "%
/"
2 "222%4"!
!%2"
2 "'#%4!
  236R;%'2N36"& O2!
Description2"2
!%,26
Frame*
'(*==%%=C==C=C88=%2& #2'(#'%
'#4 @Retention(RetentionPolicy)%6
!%
+ ,!/&
##$
Example 4.2. Exemplary Annotation Definition and Usage
@Retention(RUNTIME)
@Target({ TYPE, METHOD, FIELD })
public static @interface Description
{
String value() default "";
}
@Description(value = "The base element of a bike")
public class Frame
{
...
}
D7"! 
/2 3/1''2/+&'$1';2! 2
   
%
Annotation Usage within the OpenConfigurator Methodology
D  89  !2   " %  2 "
 289 2!H  H
!"%42!  
R;%;2N, 9O2!5"
   !6
%
4 ! "2!!
! %"2*
0 &/ 
 2!!R;%$%#2N3
)9 ,,,O%4!"2% %2
  2
  %4!
 2%02 
!2"2  % R;%<2
N &,,),,O 
 %
''&%# ,32 *==C% =/="==C''(=6%2
,"';2'(#'%
'$&%,!+2*==C% =/="==C$#@=6%2
,"';2'(#'%
';*==C% =/="==C$($=6%2,"';2'(#'%
9R;%R, "9.
##;
Figure 4.5. Using Annotations to Map Domains Models to the Generic Meta Model
$0 D2C
7 27 A
R;%'%#2N8C8+, OB%4!"89 
* %1" 2
HH226
%
 R;%?2N &O2!
!!
 5*
Figure 4.6. Using Annotations for Domain Definition
0 :!2!
2"2   C   %
36R;%$2N &9O%
+ ,!/&
##<
Example 4.3. Using Annotations to Define Constraints
public class Bike {
...
@Size(max=10)
private Set<Equipment> equipments;
...
}
27"76#(%4
!"/-'<$($'?22
./%
289 !1!
26 2 %
C0 D2 
"AR;%$%$2NOB'@%62
""2 6
 62!%4 R;%@2N
&, O%
D 2 "6!
 2!  *
L  0  R ;%#%'2 N9  O2 ! 6
289 %
!-X22/
H H%
 52"
%
02   2
 %
L$(0  AB
 2"2!.
%42"
 "2""
222! %
42 !" " 2!!
 %
'<,%87
'?*==C% =/="==C$($=6%2,"';2'(#'
'@E"%
9R;%R, "9.
##?
Figure 4.7. Using Annotations for Declarative User Interface Mapping
4"62
!R;%;2N, 9O%1"2
%D2
   !%
4.289 !6
% 2
2%D!6
 ! !
6%
4.3. The Generic Configuration Model
42!
2%
"22HH
 2
 %4" R;%F2N4)9
 ,H1H9 +O%
Figure 4.8. The Generic Configuration Model
as "Backbone" of the Configuration Process
4)9 ,
##@
4  R$%#2
N+,O%3"222
26!ABAH
HB%& 
!  
%42!!R;%$%#2N3
)9 ,,,O%!CR;%$%$2
NO%
Representations of Configurable Products
89 2 %,
2!! 2!
  %
:0 2! %
L#0 &R;%#%#2N489 O2
!2  /%&/
2"5 %02
! %
L0 82 /C%&
2/"A B/CA
 B%42
"%
& 2589 !/2
 .2  %
2!"
" %
@&%0 "2 *
L:%0 4 !".89 
* "
%42!!7
"AR;%'2N, &OB%
L0 &7!%6
2 * 
2  
%4!"A
R;%#%'2N9 OB%
4. 2 
 %8 !2
A! H  HB
%
&289 "". !!
'F%
Relationships between the Different Levels and Representations
4! R;%G2N-
)9 ,-O%
'FE*""H!"".H*   
HH 2%
9R;%R, "9.
##F
Figure 4.9. Role of the Generic Configuration Model and its Relationships'G
4  2
 2!!2 A"6B
!6"%822
 %
42 /
AR;%#%'2N9 OB2"
%42
2!
%" %
D  
)%
  2
%42"2  
'GE  ""*PartDescriptorPartAR;%$%#2
N3)9 ,,,OBProduct-
Descriptor566"M2 !%
3)9 ,,,
##G
%4AB%
6"%
0!22"6"""2
   AB%42 
" /122 !%
&"22 CHH 
%,"2
!"2!2%
E62!56  "
%
4.3.1. Elements of the Generic Configuration Model and
Meta Model
! 2!!  
"% R;%#(2N,:9 )9 
,-O,:%
Figure 4.10. UML Class Diagram of the Generic
Configuration Model and Related Descriptors
0 4Configuration!2 
%! A !Bvalue%&
   rootComponent%
& $0 4Component"
"% %&
9R;%R, "9.
#'(
A"B "Xvalue2
!%  " Attribute
Part2  "%4"
"type%2"
FacetA!B%
&6""X%&"
"""  2
" %4". "%
8&8$0 - 26" 
C%82"
""%4"%
&AttributeDescriptor2!
/52%DdeclaringType /
"2!declaringMember6%4
2declaringMemberA B%"5value-
TypeA/5!B"
"22!"5
collection%52  
"2readOnly%
1&1$0 &Part6" C%4
2 !
"%Part22
Component2 "2 "
" %45" type2
ABvalue%
2PartDescriptor
"%47AttributeDescriptor
AB%
5&5$0 4!
7 2%&Facet
%4!"2
2 "$"2"Component2AttributePart%&"
22!
%36*
L10 &! %
L 0 + %
L$0  "%&! 5
5%
L9&0 3%
LC0  %
"72FacetDescriptor2!
"%D!R;%$%$2
NO%
4.3.2. Model Mapping
D  C7/
R;%'%#2N8C8+, OR;%'%'2N+,

#'#
/O%2R;%$%#2N3)9 ,
,,O2!  2!""
 %D5 "2 !
 %2!!!C
%
24R;%'2N, !/9)9 
,O. *
Table 4.2. Mapping between the Java Concepts and the Generic Configuration Model
E<
$

# 8 


$
9A/
"B
" @Component Component 1"2
/
A B
%
+"
A2
=
B

^!2
String2Enum2
InputStreamM
"


@Attribute Attribute &)
/1
A,:
 B

!
%
+"
A2
=
B
ObjectA"
B
"


@Part Part &)
/1
A  
,: B%
%%
"26
 2

A B%
 "2 "!
5%D"%2"
)%
4 !)2!"
 .AB% 2
/ "%
4.2!
 %D!  
6"R;%;2N, 9O%
4.3.3. Facets
489  %&
!!R<%'%<2N+ 9O2"7
6"6"!%D
"/12
!%4"2
$( %4" "
$(*==%!% =!=V2,"$(2'(#'%
9R;%R, "9.
#''
 % R;%##2N  &9O 
%
Figure 4.11. Usaging Annotation to Control Facets
 2!2
=%R'%$%$%'2N+&O!

7%
0!2"!289 ."!
%9"!! *
10 362%
4!2
%22.!"A
R$%$%'%#2NOB%
0 + "
"  %62 
7"2
%"2!%
$0 &!%22
 %,2
   "
2!"262+,"2/+&
/9-$#"%
90 3%4
" %6
2!1I/-$($'((GJ
2!9+ 
&+$' AR@%'%#2N9+=9 OB%
$#&%,8"2   2"
'%("/-'F$2*==C% ==C=PW'F$2,"$(2'(#'%
$'*==C% ==C=PW$$#2,"$(2'(#'%
, 9
#'$
C  $$0+  "  .%
4 $;2!! 
 %62"2% %2H!
H%H H2%4.
"! "A% %2D4$</$?!"B"
89 !2  
!%
4"2%02$"
 "%2/+&A
I/-$#@'((G2%#@GJB
AR<%;2N+ *36   89 OB%
4.4. Modeling Concepts
E!! !7
 "25 %
 2 2 7
9R$2%"2R$%#2N+,O
 2!R$%'2N+
9 O. "%
2!!6 .%
+"2!  !!
6%,2!56"!" 
6 6%
4!*
0 R;%;%#2N, O
2!"E<
%,22 2
26%
0 2"52!/
"89 !"%,2"
2!  2 
2"!"%
10 E62R;%;%'2N+, O2!!
%A!
R'%$%$%'2N+&OB% 62
!!A
R;%$%$2NOB%
0 9 CR;%;%$2
N9 , O%4*
L !AB2"/2
.2
L !  
2 !.
AR'%#%$%#2N9.&OB%D
$$E"%
$;&%;"
$<&%%>  2*==!!!%% =!=2,"$(2'(#'%
$?&%,%42*==!!!%%=!=C=C=C#$GF?G%2
,"$(2'(#'%
9R;%R, "9.
#';
2 !2
" %
&62 ! 
 A
R;%$%$2NOB%
$0 0 2!.!"
2 !2
  %423
CR;%;%;2N, O%42!
%
4"A-R;%$%$2
NOB%
0 "2R;%;%<2N9, O2!
..%D
&6R&22   
!%
2!  
2 A
R;%$%$2NOB%
27 !2 
 %
:5 ! .%
4.4.1. Structure Modeling
1"2R;%$%'2N,, O"!2!
! "%42= 
6"289 ! *
Table 4.3. Structure Modeling Annotations
8 $
@Component  " ."!
%
@Attribute  " "!%
@Part  "  %
@Ignore  "  "!%
D2 "AR$%#2N+
,OB%! 2!!%
4.4.1.1. Components
2%/
"AR;%$%'2N,, OB%
1" /!@Component2
./%& "!5&+%
 "/2/1$@%36"
$@E   89  ! " 5 7   
java.io.Serializable/12 %
,
#'<
 !@Component!!"
6 %
&6 @Component! 36R;%;2N 
@Component&O%
Example 4.4. Usage of the @Component Annotation
@Component
public class Product {
private Assembly assembly;
...
}
@Component
public class Assembly { ... }
Runtime Representation
"2 "
ComponentDescriptor2! 6%D
 2 "Component
C% R;%#'2N--9O
 ,:C %
Figure 4.12. Runtime Representation of Components
  2! " 
"  CA/1B2!
%
Responsibilities
4! *
L   "2
L  5" "" A!B2
L  52 ! *
Table 4.4. Component State Variables
9 $
abstract 2!5
"%
instantiated 2! "
"%
9R;%R, "9.
#'?
9 $
specified 2!6"
"%
L  M 2
L  *.
$F
L . *! 
! *
Table 4.5. Component Events
! $
Change 4 " 
A% %2 2" 2%%%B%
ValueInstantiation 
 "%
ValueChange 4 !  
A% %2= B%
TypeChange -!" 5"
 A!7
CB%
Reset !%
L * ComponentDescriptor
 5"" %
""289 
"!"A "B2
!  """%4"2
!2 52%E2
! A!B
"$G%R;%<%'2N369 +O2!! 6
" %
4.4.1.2. Attributes
4""%/
2/1"22
=%
& AB AB!
@Attribute26"";(%1"2
 "2!! "A "B
*
Lbyte2short2int2long2float2double2boolean2charC!2String2
BigDecimal
$F*==%!% =!=V2/<2'(#'%
$G89 2! "
 " %
;(E 2""
 ""%42"289  .
2 "
%
,
#'@
L  "       2 % %2 int[]2 byte[]
Collection<String>
LInputStream2Enum
&" AB"A
B%
4!  236R;%<2N @Attribute&O2!
%
Example 4.5. Usage of the @Attribute Annotation
public class Assembly {
// implicit, singular String attribute, field access
private String stringAttribute;
// explicit, singular Integer attribute, field access
@Attribute
private Integer intAttribute;
// explicit, plural String attribute, method access
@Attribute
public Collection<String> getMultiValueAttribute() { ... }
...
}
Runtime Representation
&2 Attribut-
eDescriptor2%%SingularAttributeDescriptorPluralAttributeDescriptor2
 5"%4 "
Attribute2%%SingularAttributePluralAttribute% R;%#$2N--
&O%
Figure 4.13. Runtime Representation of Attributes
Responsibilities
4Attribute"  " 
" "%4Attribute
.!*
L  ! "
9R;%R, "9.
#'F
L 52 ! *
Table 4.6. Attribute State Variables
9 $
instantiated 2! 5
"%
specified 2!6"
%
L  *
L .   *          !
;#*
Table 4.7. Attribute Events
! $
Change 4 " %
L ;'* AttributeDescriptor
5"%
4.4.1.3. Parts
96" %:2
/1"22  =
%
1"2ObjectA62
R;%;%#%'2N&OB%4"6" 
@Part%2 AB
AB%36!36R;%?2N
 @Part&O%
Example 4.6. Usage of the @Part Annotation
public class Assembly {
// implicit, singular part, field access
private SubAssembly part;
// explicit, singular part, field access
@Part
private SubAssembly anotherPart;
// explicit, plural part, method access
@Part
public Collection<SubAssembly> getMultiComponentPart() { ... }
...
}
public class SubAssembly { ... }
Runtime Representation
& 2 "PartDescriptor2
%%SingularPartDescriptorPluralPartDescriptor%422
;#&"%
;'E"!"6%36  
!%
,
#'G
+2%%SingularPartPluralPart%2!
" /152/1"5
%82"
!!22
 %
 R;%#;2N--+O!,:C 
%E,: 2"  
2"%
Figure 4.14. Runtime Representation of Parts
Responsibilities
4Part  !!
%  AB%4
Part.!*
L  
L  "" AR;%;%#%#2N9OB

L 52 ! *
Table 4.8. Part State Variables
9 $
instantiated 2!2 
"2"%
9R;%R, "9.
#$(
9 $
specified 2!6"
"5
%
L    * !       
AB
L .   *          !
*
Table 4.9. Part Events
! $
Change 4 " 
A% %2 2"
 2%%%B%
ValueChange 4 ! 
 A% %2= B%
L ;$*PartDescriptor 
5"
0  26!
!2!!2
%
4.4.2. Product Modeling
D.2!"
 "%4! *
Table 4.10. Product Modeling Concepts
8 $
@Product  "A""B
%
@Product.Name 5%
@Product.Description ,%
@Product.Attribute  %
HH2
%4"
22 %
4@Product.Attribute
! *
LlabelAB*String  

LlevelAB*int" 
%D *
LUNDEFINEDA0B
;$E"%4" 8
9 %
+,
#$#
8 $
LIDENTIFICATIONA1B
LSTANDARDA2B
LDETAILA4B
LSPECIALA8B
4 %
@Product.Asset,%4
"byte[]java.io.InputStream%
4@Product.Asset
! *
LnameAB* %
89 ! 
*
LPRIMARY
LPRIMARY_THUMBNAIL
LSECONDARY
LSECONDARY_THUMBNAIL
47722
2% %2" %4

%
@Product.Price 5%
4"""2!2
BigDecimal
%
+ . "%D!
.%3% %2!5!" 
%
4 5 6 info.openconfigurator.products.annotation.Product.Asset. 
"%4&+7"%
E"@Product.Price289 5""
 ""%97"2!5 2
  "%D! %
36R;%@2N @Product&O!/1 @Prod-
uct*
9R;%R, "9.
#$'
Example 4.7. Usage of the @Product Annotation
@Product
public abstract class Bike
{
@Product.Name
public String getName() { ... }
@Product.Description
public String getDescription() { ... }
@Product.Price
public BigDecimal getPrice()
{
return new BigDecimal(0, new MathContext(2))
.add(basePrice)
.add(frame.getPrice())
.add(fork.getPrice())
.add(wheels.getPrice())
.add(getEquipmentsPrice());
}
@Product.Asset(name = PRIMARY)
public byte[] getImage() { ... }
@Product.Attribute(label = "Total weight", level = STANDARD)
public int getWeight() { ... }
@Product.Attribute(label = "Robustness factor", level = SPECIAL)
public double getRobustness() { ... }
...
}
Runtime Representation
4 "
%4!AH+
HR;%$%$2NOB%Product2
&6R92!"0%"%
4"%D
2."%4C 
6%
4.4.3. Configuration Modeling
 .2!!!
 !%
2.
"*
Table 4.11. Configuration Modeling Concepts
8 $
@Selectable 92 
 
6 %
@Configurable 92
 
9 ,
#$$
8 $
".
%
@Constructible 92 
"%
@Variable   
  %
@Parameter   "
."
%
@Calculated   2
%
@Configured   
%
42@Selectable2@Configurable@Constructible2
%46"
 R$%'%#2
N9+9 O%D!
%
4@Variable2@Parameter@Calculated"
.  %1"2"
"6R$%#%'2N&*99O%
42@Configured26"   
6%
4.4.3.1. Specification Methods
+"22! 
"   %0"
@Selectable2@Configurable@Constructible
"%1"22@Con-
figurable%
2
%02!!!
6%
Selection
46  2"
"A&82R'%$%$%;2N8 OB*!
  2!5!"2
 %2&48"2!2
"2!6%
 2 HH%
89 2!!A36R;%F2N,
 9OB*
9R;%R, "9.
#$;
Example 4.8. Modeling Selectable Components
@Product
public class Car
{
...
@Configured
private Motor motor;
...
}
@Selectable
@Component
public class Motor
{
private FuelType fuelType;
private int power;
private BigDecimal price;
...
}
4@Selectable" 2Motor%
42"
!2!
! %
4"2 "
% R;%#<2N9O
*
Figure 4.15. Component Selection Schema
&!2
AB @Domain.QueryA
R;%;%;%#2NOB%
9 ,
#$<
+" A% %2B"
7AB2 6"AMotor
B! %
E @Selectable2  2
 ""H"H2 R;%#?2N9
O*
Figure 4.16. Incremental Component Selection
2Motor!" @Relational
AR;%;%<2N9, OB2
"2@VariableAR;%;%$%'2N9 &OB%
42*% %2!
DieselFuelType2Power5250
100"2"!%4 
%42!Power802
 !"6FuelTypeGas2
!" "!Power80%4
26AH9
 HR$%$%$%<2N&OB%
&.2%%
@Parameter%7.
72262
%
Configuration
89 ". @Config-
urable%&R$%'%#2N9+9 O2
9R;%R, "9.
#$?
!%%2

!7."A!
!2!B%
&6 2.!!*!!
"!!"  2
%9!!2!222"
5%2widthheight

%"2 2"!"6
. @MaxAR;%;%<2N9,
 OB%
89 2/ !!
!36R;%G2N, 9 2+.9
O*
Example 4.9. Modeling Configured, Parameterized Components
@Configurable
@Product
public class Window
{
@Variable
private Form form;
@Variable
private Material material;
@Parameter
private int width, height;
...
}
Window"@Parameterwidthheight2
@ConfigurableA"@Constructible2!B%
 2"Window2
%2%4"2 
6 A' formmaterialB%
42AwidthheightB
%
 R;%#@2N99 O "*
9 ,
#$@
Figure 4.17. Component Configuration Schema
.2"2
AR;%;%;%#2NOB2*
2!
%
4 5 !
! %4@Relational"
!@Configurable2"@Parameter
2 AR;%;%<2N9, OB%
Construction
&"". %+"2
 A182R'%$%$%;2N8 OB2
2"%2
6""%
62*!
  2
256%
 89 2!236
R;%#(2N, 99O%
9R;%R, "9.
#$F
Example 4.10. Modeling Constructed Components
@Constructible
@Product
public class Kitchen
{
@Parameter
private int length, width, height;
@Configured
private Countertop countertop;
@Configured
private List<Unit> floorUnits, wallUnits;
...
}
&2"! 
2!"2 2
!"%
1"2@Constructible"@Variable2 
% 2"
%&"2 
!5  2!!""5"%
2"2
"%42""A
B%
 R ;%#F2 N9 9 O 6   
"*
Figure 4.18. Component Construction Schema
9 ,
#$G
2 
%
 R;%#G2N9,O!6
%22.
%4!67
%
Figure 4.19. Comparison of Specification Methods
D  2!
"%
&2
%1"25
"2! " ""%
4.4.3.2. Configuration Attributes
&".%
562!"
 "%2!! 
2"@Variable2@Parameter@Calculated2%
9R;%R, "9.
#;(
 R;%'(2N9&4"O."
 "%D!6!
%
Figure 4.20. Comparison of Attribute Types
Defaults and Regular Attributes
D!  
2! !*
#% $0 !
2 R;%#G2N9
,O%42"2@Selectable
 2@Configurable
@Variable@Constructible
@Parameter%
'% @0 ! 
2%
&A% %2
B
%&"!"2 ""%0!2"
" "2!%
922priceMotor R;%#?2N
9O2! % 2
9 ,
#;#
"C%2""
%
-  6
AR;%;%<2N9, OB%
Variable Attributes
&2""  2
@VariableA B%"2
22A
R;%;%;%#2NOB%8!2!6%
  2 
 5%!"
2"2
2!2626%0!2"!
%
: 2 
6%22  
 "%
&6material36R;%G2N,
9 2+.9O%
Parameter Attributes
E%62String2long2double2
floatint"!";;%
4289 !@Pa-
rameter%
+!"!!*6
2"  
A9+B;<"" "!%2
2 
"2%8!2"
%
4"6length2widthheight
!36R;%#(2N, 99O%
Calculated Attributes
+72%, 
6 2!22
 5%
36R;%##2N @Calculated&O!6
*
;;E 2 "  2  "  * 5  6    2  6 long
ALong.MAX_VALUEBintAInteger.MAX_VALUEB6double%0!
2 5!2!!""5"
%
;<4"  "  
A9+B "C!2
R@%'%#2N9+=9 O%
9R;%R, "9.
#;'
Example 4.11. Usage of the @Calculated Annotation
@Configurable
@Product
public class Window
{
@Parameter
private int width, height;
private BigDecimal pricePerSquareMeter = new BigDecimal(125.5);
@Calculated
@Price
public BigDecimal getPrice()
{
final int sqm = width / 100 * height / 100;
return new BigDecimal(1, new MathContext(2))
.multiply(new BigDecimal(sqm))
.multiply(pricePerSquareMeter);
}
...
}
4"289 ! 
2!!" 
@Calculated%4 !""" "
22!"  %
,22
"  %&6
 /5static%4
!%
E"26"2
.%289 5!!
2 
6% "!2
!"!;?%
4.4.3.3. Configurable Parts
"289 @Configured 
 6"%2
* "@Configured2"
%8!22"5
@Configured"%
36R;%#'2N@Configured&O! motor
 2gearbox*
;?89 ! "6"
%2 @PropertyDependency({ "width", "height", "pri-
cePerSquareMeter" })"width2
heightpricePerSquareMeter%4!"2! H9 !
= [H%
,
#;$
Example 4.12. Use of the @Configured Annotation
@Product
public class Car
{
...
@Configured
@Part
private Motor motor;
@Part
private Gearbox gearbox;
...
}
&""2@Configured2
@Selectable2@Configurable@Constructible
R;%;%$%#2N,O%
D5!2!."!.
A.B%289
 627 
 "%D56R;%<2N9 +
O%
62!!!2!89 
%42! %
4.4.4. Data Modeling
1"!2!".5 !
%2!""
!  %4"
 "!A 
@SelectableB%
0!2"!*R'%'%?2N,
9.O2!("
.%42!5
! "%2"5
"" 2%8"
!!22!
 %02 
%
62!5!!"
 %4! R;%;%;%'2NO!
2!" 
%"2R;%;%<2N9, O2
5%
4.4.4.1. Domains
& 2!!2!/  !
%0!2
 ! * %
236R;%F2N, 9O!Car
 Motor."fuelType2powerprice%
9R;%R, "9.
#;;
D"Motor
2%&6R'%#%'2NO 2
"2%
425 Car *
@Product
public class Car
{
@Configured
private Motor motor;
...
}
@Selectable
@Component
public class Motor
{
private FuelType fuelType;
private int power;
private BigDecimal price;
...
}
E!2!  Car2! !2!
MotorPD=Motor
P
4!*!%2
 55%
2!2!"A
-R$%#%'2N&*99OB% R;%'#2
N, 16O !8
9 !%
Figure 4.21. Morphological Box for Domains
Domain Characteristics
2! %  C
2!%1"2
,
#;<
R$%#2N1,,)+, O2!
%0!26"%
0   2
"2R$%#%#2N9*
O%4!22 "2
7%
2R;%<%'2N369 +O!!2Bike
 !Equipment%D Equip-
ment2!LockBasket%4
!"2 Lock.class
Basket.class%
 R;%''2N--94"O2
  C*
Figure 4.22. Runtime Representation of a Component Type Domain
82""2!" 
6% !"A% %2EquipmentB2"
"" "A% %2LockBasketB%
8!289 "
2R;%;%;%#2N94"O!%
80 4 
%4!%
25!*
L8230 "22
"%02 
%
L 230 8!2"
2 %022
9R;%R, "9.
#;?
"*AB26
%
 R;%'$2N9:&:O
!*
Figure 4.23. Component Level and Attribute Level Domains
2"5%
10 & 
%2!%
4!!"*
L 230 422!
2!
%%
L1230 4
2! "
%
D!6!%
0!2%
5*
L0 @Selectable2
6"%
L 0 @Configurable2
% 2
" %
A@VariableB2A@ParameterBA@CalculatedB%
L 0 @Constructible2
2%
$  0 4
R$%#2N1,,)+, O6"2
""%2
""AR;%;%$%#2N
,OB%
,
#;@
&2"AH
.H!B*2
AB%" 2
A)B%
E26"(2
".56%2"
 ""!
""6"AR;%;%<2N9,
 OB%
$0 4"22! "
 5 %4."*
L!0 &"" 22
AH9
 HR$%$%$%<2N&OB%
2 
%
L5"0D" !2!"6
%4 "65
7"6"A"!"B%
L!0 4%&
AB2
%&  "2
 A"B%1"
" "22 
 "AI-'((?2%<@JB%
L<0 45!%D
"22." 
!  %
LC0 45"=!
"A% %2B%
   %;@
&x"2!x <
10000%&22"2!
x <= t2!t2!5
"AHH!B%
Domain Definition
489 !!"6%1
 2!! !
%
""="5/"%
26boolean"
truefalse%
;@E "2/"integerA$'2'$'B2longA?;2
'?;B2floatA$'  BdoubleA?; B
A% %2Integer.MAX_VALUEB2"5
 !%
9R;%R, "9.
#;F
&      ) "      2
 % 2)
*
230 &26
%02! 2!
)%
"2"/2 
A% %2@Domain("black", "white", "silver", "red", "blue")B%
#)2)A% %2" 7" 
@Domain.QueryB%
3""A
B%
!"0  )2
"%62"
@Max(1000)2A6B1000%4
"2""AR$%#%$2N9*-OB2
!2%0!2
2  7"62!!"
"22%;F
3"262
52!!"
!%4 !2!2!
6%1
"!%
 R;%';2N9O.%
Figure 4.24. Domain Definition Concepts
& 2
"*)%
;FE89 !"5 "%2"
! 5%&6
%
,
#;G
&25" 2" 
2!6"
%
E!5 !
"%9R;%;%<2N9,
 O%
Component Type Domain Definition
" 289
 ! *
0 4./
5"%02"2" 
""%
!"0 4"""
! *
Table 4.12. Type Domain Annotations
8  $
@TypeDomain 2

3"%4
"65"%
&"89 %
36R;%#$2N364"O
"2 @TypeDomain%
Example 4.13. Implicit and Explicit Definition of Type Domains
public abstract class Bike
{
...
@Configured
public Collection<Equipment> getEquipments() { ... }
...
}
public class CityBike extends Bike { ... }
public class MountainBike extends Bike
{
@Configured
@TypeDomain({ Lock.class })
@Override
public Collection<Equipment> getEquipments() { ... }
}
public abstract class Equipment { ... }
public class Lock extends Equipment { ... }
public class Basket extends Equipment { ... }
4Bikeequipment!6TypeDomain%
42"%
97"2!  CityBike2"equipment
"Equipment*LockBasket%
DMountainBike27A" getE-
quipments() B2 !   "    Lock  "   
@TypeDomain%
9R;%R, "9.
#<(
42!  MountainBike2" Lock7%
Attribute Value Domain Definition
89 ! *
0 4
 5/"%4!  *
Table 4.13. Implicit Attribute Domains
#$ 
boolean 122*true
false
byte2short E2
integer2long2float2double E2
char2String 9= 2
EnumAB "22*
Enum.values()
byte[]2InputStream 1"2
4C!Boolean2Integer2%!"7A!B
  72boolean2int2%6"%
!"0 4
!"" !  /A
B2"/" A
B*
Table 4.14. Attribute Domain Annotations
8  $
@DomainA
B
2

3%4
"String
" 
 "5valueOf(String)%
4@Domain
"A=B%
@Domain.Query
AB
2
6
&!"7"5value%
47""" 
AHHR<%'%'2
NOB%
2!"
7C! "%
1"" 5name2
76
(AI/-$#@'((G2%$<#JB%
4@Domain.Query
A=
B%
&89 
%
,
#<#
3"2@Domain.Query!"
2"2 "  ! %
D289 
 %
36R;%#$2N364"O
Bike2Wheels2ForkFrame%
Example 4.14. Implicit and Explicit Definition of Attribute Value Domains
@Selectable
@Domain.Query
public class Wheels
{
private String manufacturer;
private double treadDepth;
private BigDecimal price;
...
}
@Selectable
@Domain.Query("select f from Fork f where f.special = false")
public class Fork
{
private boolean suspension;
private double suspensionStrength;
private BigDecimal price;
private boolean special;
...
}
@Configurable
public class Frame
{
@Variable
@Domain({ "16", "20", "24", "26", "28" })
private int size;
@Parameter
private double height;
@Variable
private Color color;
...
}
Wheels2
"" @Domain.Query%4" 
7"Wheels
Amanufacturer2treadDepthpriceB%
Fork
%4@Domain.Query"2!
67"%+"2suspen-
sionStrength2!"A!
B%
4 "Frame
%size6"2 
@Domain%
4height"2double
%
9R;%R, "9.
#<'
4color5"
 /"Color%
Part Value Domain Definition
289 ! *
0 6"
!289  
5*
L0 @Selectable289 
!@Domain.QueryA!B%
L 0 @Configurable2!
2! !
%2!
@Domain.QueryA!B%32!"
%
L 0 4!"
%
!"0 4""
! ";G*
Table 4.15. Part Domain Annotations
8  $
@Domain.Query
AB
2
6
&!"7"5value%
47""" 
AHHR<%'%'2
NOB%
2!"
7C! "%
1"" 5name2
76
(AI/-$#@'((G2%$<#JB%
4@Domain.Query
A=
B%
&89 %
3"2!  *
#% 89 @Domain.Query5"2
 %
'% 8!2"22
"5"!@Domain.Query289 
%
;GE*@Domain.Query2%2 
2"%
"5!%4"  %
 !%
,
#<$
$% "289 
%
E89 "@Selectable
@ConfigurableA% R;%#G2N9,OB%@Con-
structible#' "2
%%" %
36R;%#<2N36+O!
 *
Example 4.15. Implicit and Explicit Definition of Part Value Domains
@Selectable
@Domain.Query
public class Wheels
{
private String manufacturer;
private double treadDepth;
private BigDecimal price;
...
}
public abstract class Bike
{
@Configured
public Wheels getWheels() { ... }
...
}
public class CityBike extends Bike { ... }
public class MountainBike extends Bike
{
@Configured
@Domain.Query("select w from Wheels w where w.treadDepth > 0.5")
@Override
public Wheels getWheels() { ... }
...
}
&@SelectableWheels@Domain.Query2Wheels
7" 2!Wheels
%4@Selectable%97"
@Domain.Query"%
4BikeWheels2%D
CityBike 289 @Domain.Query
Wheels%
 MountainBike 2  wheels5    A"    get-
Wheels()B2! "!treadDepth 
0.52"@Domain.Query%
2!52! 
 %
4!"2"*"
22 2
"! %&"26.
"7!%4
!"  *
 "" !%
9R;%R, "9.
#<;
25"AB
%462!%
4.4.4.2. Defaults
&AR$%$%$%;2N9 
9OB289 ! /
%462"
R$%#2N1,,)+, O
 !
%
&2!2 %
89 ! ! *
0 "289 
4R;%#?2N1O*
Table 4.16. Decision Default Behavior
0 $ $< !"
$
% 9" E%4"6
%
E
% 97"

4""
2"2
7"%8!27"
0%
E
% 9" E%4"6
%
X
% 9.

E%% X2
"%
% &7" 4""
2"2
7"%8!27"
0%
E
% & 4"2"2
%8!2
"6%
X
36 26"2"
89 %
!"0 4 .
7"2!!"
 %289 
! *
Table 4.17. Default Value Definition Annotations
8  $
@Default
AB
2

&!2
 5"%4
" 
" 
 "5valueOf(String)%
4value6%
,
#<<
8  $
4@Default
"A=B%
@Default.Query
AB
2
6
&!"7"5value
2!6"" 
%
7"2!"
7C! "%
1"" 5name2
767"%
467"5 
"2!
%
4value6%
4@Default.Query
A=
B%
&8
9 %
4! "*
L"*! 6 
2%4
%
L""2
%026!2
A6!B%
L &!"
%
L"*
2 36
"%
36R;%#?2N36O 
@Default*
Example 4.16. Implicit and Explicit Definition of Default Values
public class MountainBike extends Bike
{
@Configured
@Domain.Query("select f from Frame f where f.type = 'MTB'")
@Default.Query("select f from Frame f where f.type = 'MTB'" +
" and f.default = true")
@Override
public Frame getFrame() { ... }
...
}
@Configurable
public class Frame
{
9R;%R, "9.
#<?
@Variable
@Domain({ "16", "18", "20", "24", "26", "28" })
@Default("24")
private int size;
@Parameter
@Default("#{_this.size * 2.5}")
private double height;
@Variable
private Color color = Color.BLACK;
...
}
MountainBike2frame56"
!2typeMTBdefault
true2" 7"%
MountainBike25!"7"
"2"%size22
24%
4@Defaultheight!6
"" %
4color "2!Color.BLACK%
Frame!"2 7@Default("BLACK")!
%
D5!  %
,"2!62!"
/"!" %
62!!!2!
%
4.4.5. Constraint Modeling
1"2   
   %89 !
 /2"1
I/-$($'((GJ%
289  !1
2! "/-$($ 
%"2! ""!
%& "!1
AI/-$($'((G2%;JB289 " 
 %
936R;%#@2N9& O2! 
/-$($@Max6/1"*
Example 4.17. Constraint Annotation Usage
@Configurable
public class Window
{
@Parameter
@Max(200)
private int width, height;
...
}
9,
#<@
&widthheight289 
"" %
2@Max212
int!2! 
!%2widthheight7
200%
21"A
R$%#%$2N9*-OB"%0!2
.2!%
4.4.5.1. General Constraint Characteristics
 2"2"/-$($2
! 7"%97"289 
 
7%1 2!!
 %
,"!7
 R;%'<2N)89 9O*
Figure 4.25. General Structure of OpenConfigurator Constraints
4%89 
"%4 
2! %42
 "A= B%! 2 "
 "a%45value)
"%DStringA"
 "B262 
"A"B%D6 "b%
Constraint Usage
1"2!"!2"
236R;%#F2N9& ,O
!*
9R;%R, "9.
#<F
Example 4.18. Constraint Annotation Usage Methods
@Constructible
@Max(target = "#{_this.length}", value = "#{_this.roomLength}")
public class Kitchen
{
@Parameter
private int roomWidth, roomLength, roomHeight;
@Parameter
@Max("#{_this.roomWidth}")
private int width;
@Parameter
private int length;
@Parameter
@Max("250")
private int height;
...
}
0 ,"22
22! 2!"A
B%2766
"6 "AB<(%
46!*H4width56
roomWidthH%4@Max
2505 %
0 &2"7
22"  
6"%0!2"
<#%
&"25"" 6
!lengthroomLength* @ScriptAssert<'
*
@ScriptAssert(lang="javascript",
script="_this.length =< _this.roomLength")
0!26"2
"""6%D6
2!2*
L %
L " %
L  22<$%
<(E1
A0 B2 !   !  89  !2   6  
"  5 " !%   2 "    6  "  
%*==%C%=!=1&:';("*==%C%=
!=1&:'$@2/#;2'(#'%
<#"25"".2%
<'4_&0;%#2*==%C% =
==;%#== ====&%2/#;2'(#'%
<$&R;%;%;%#2NO2  
"%" %
9,
#<G
Conditional Evaluation
4condition2!
6%6true2
  %false257"
%
4 condition! 6
"%: "2%9
! 6*
@Max(target="x", value="y", condition="a == b")
D 62* %
& 2"""8
9 !"%
D!2!89 !2
6%
4.4.5.2. Supported Constraints
1"""1A@NotNull2@Null2@AssertTrue2
@AssertFalse2@Max2@DecimalMin2@Min2@DecimalMax2@Digits2@Size2@Pattern2@Past2
@Future2@Valid262I/-$($'((G2%#(###'JB2"
 289 %
&" 62!!
""!"%&2
%
4!  !%2
! 62&6R&2*
:&0  "289 
@Equals2@NotEquals2@Min@Max2!
A%%equals/CB2 2  %
0 -"2 6"
 @Cardinality2! @Cardinality.Min
 @Cardinality.Max%
,"2 2  %
&"2!"2!7"2
"@OptionalA7@Cardinality.Min(0)B@RequiredA7
@Cardinality.Min(1)B%42%
 0 36 "  "   
    A B% D   " "
A@Compatible.TypeB  "     A@Compatible.MatchesB2
        A@Compatible.ElementType2
@Compatible.ElementMatchesB%
,"2 "      
!*    2 
9R;%R, "9.
#?(
"  
% ,     2 "
%
 0 36 "  "   
    A  B% 4"      
   " % 4"5 7"   2 !
5       6 %   2
"     !   7* " "
A@Incompatible.TypeNot2@Incompatible.ElementTypeNotB
"A@Incompatible.MatchesNot2@Incompatible.ElementMatchesNotB%
" 0 &2  6   @Satisfies 
@Relational%1/"%4
7@ScriptAssert%
"2truefalse%42@Relational2
"%42
2"A
R;%;%;2N, OB%
& 2&6R&26 %
D2 
2.    
%
D   9R?2#$
2!".!.%
4.5. Configuration Procedure
9 2 
2!2 
%E!2!! *!52!
 22 
%!2!  2!
6!!""
%
22."89 !!
%D  C 
2!! 6%
4.5.1. The Object-Oriented Configuration Procedure
 R;%'?2N48C89 +O !
 ."89 !%
1"2 
R$%'%'%#2N4)9 +O%42!!
 C 2!*
48C89 +
#?#
Figure 4.26. The Object-Oriented Configuration Procedure
Configuration formulation<;
& ! 2 
2! %C
 222
2/%D!"%
4"2!"
%%,2
 2!2
%4" 2
R$%#2N1,,)+
, O%42  2
 %&"2 
" " %<<D  
   .2
 %
<;E89 2 2"= 
AR$%$%$%;2N9 9O"R@%#%'2N9.
OB2! 7 
%
<<9"27  2!!"89 
AR$%$%$%;2N9 9
O"R@%#%'2N9.OB%
9R;%R, "9.
#?'
Configuration synthesis and evaluation
E62"  
%4 " R;%'@2N&
+9 +O%
Figure 4.27. Abstract Specification Process for Configurable Products
0 4
R$%#2N1,,)+, O%
2 2*
L6 %4 !2
@SelectableAR;%;%$%#2NOB%
L0!%4
@Configurable@ConstructibleAR;%;%$%#2N9
 O"R;%;%$%#2N9OB%
2"7%
2 2!"%
42A@Variable
@ParameterBA@ConfigurableB*
80  5""2
""*
L22
L25AH.H
R;%;%;%#2N9OB%
62 %,2
"@Required2 %
369 +
#?$
10 " 2(2
7AR;%;%#%$2N+OB%4
52"22
"AH9"
HR;%;%;%#2N9OB%"2"
% 57"2"
""AH9"HR;%;%<%'2
N9OB%
4 2!
%
Configuration Interpretation
&R;%$2N4)9 ,O2  
6 22
  /C%D "
  !" "2
"! C%42
2%
4 22!!
6%D!6 "
6%
4.5.2. Example Configuration Procedure
9 R;%'F2N9 ,9
.1A36BO6" %E!
"26"
%62 29R?2#$
"&6R12#)-63%
Figure 4.28. Configuration Domain Model for Customizable Bikes (Excerpt)
4Bike2Frame2Wheels
"Equipment%DBike"2MountainBike2CityBike
9R;%R, "9.
#?;
ElectroBike.%&ElectroBike"  Motor
%&Equipment" LockBasket
.%
42Bike2MountainBike2CityBikeElectroBike
%4"5@Product%4 2Frame2
Wheels2Lock2BasketMotor@Component%D
"@Configurable22"2
"6Frame@Selectable%42!"
6 2! .
%".6%
Equipment2"2
!"ALockB ABasketB%
E!2 " Bike"
 %-"2 !Bike 
 "%4!ACompo-
nentDescriptor2R;%$%#2N3)9 ,,
,OBBike.  
   "%
4 !,:C
  R;%'G2N#*.,& O%
Figure 4.29. Step 1: Initialized Model and Agenda
4Component2PartAttribute"
 R;%$%'2N,, O% "6"
"2specifiedfalseA4R;%;2
N9OR;%;%#%#2N-OB%,2abstract
 biketrue2 "
"%97"2bike""
 instantiated %1!2!6"
"A67B2
.%
4  .2
%& 2"
369 +
#?<
R$%#2N+,O%E! 6
7AB2""%
62"" 5"2""
%2""
*2 bikemanufacturer%
"  "%
H /H!5*"
""%
Figure 4.30. Step 2: Bike Type Specified
E2bike2ElectroBike
5"%4 . R;%$(2N'*14"O%
4!"   motor2  
2 %"289  .
ElectroBike"" /1
2 "bike%4 %
,2  "".! 
*%done%
motor%
E62!frame5A
B*colorSilver5%4
2Color2/"%
labelMyBike%
& R;%$#2N$*&O2  
 ".! 5%
9R;%R, "9.
#??
Figure 4.31. Step 3: Frame Attributes Specified
;2wheels" 6 
!5AB%62 
"%
4 ! R;%$'2N;*DO%
Figure 4.32. Step 4: Wheels Specified
E62!7*%&R;%<%#2N4
8C89 +OH9 "H2
!*27"equipment
A(B%4 "!2
equip12 %4"!"
%
369 +
#?@
& R;%$$2N<*37&O2 "
. "%
Figure 4.33. Step 5: Unspecific Equipment Added
72Lock
"equip1AB
Lock5AB%
4! R;%$;2N?*37O%
Figure 4.34. Step 6: Equipment Specified
"2motorAB2!
 %2!
"2 %
9R;%R, "9.
#?F
4  R;%$<2N@*9 9O%
Figure 4.35. Step 7: Configuration Completed
4  "%42 /1
"ElectroBike! R;%$?2N9 ,-8CO%
4 2"22 
%
Figure 4.36. Configuration Model Result Object
46! %D5! !
C!89 ! 
"%! 2!5"
%
4.5.3. Configuration Agenda
Configuration Process versus Configuration Agenda
 2%,2
2!"%&
2"%
9 & 
#?G
0!26!2! 2!
"272!
6%2 
 2 R;%$@2N9 +!O%
Figure 4.37. Configuration Process as Screenflow
D89 "!"
A!B26!!"
 %
422"
%D" "72 2
  %
2!
.AB%4!
 R;%$F2N9 +9.O%
Figure 4.38. Configuration Process Customization
Configuration Agenda Characteristics
& 2. %
%02  
%
9R;%R, "9.
#@(
&222
 %4 R;%$G2
N-!9 242)9 ,
O%
Figure 4.39. Relationship between Configuration
Decisions, Tasks, and the Generic Configuration Model
4            
R$%#2N+,O %
4 6  
7"". %
3"2  ! 
 %
D5 C
R$%#2N+,O%D5
  !%
9 .!%&*
L  2
L"2
L A% %2
"B2
L2 AB
2
L"2      " 
A!2 " )2H
.HR;%;%;%#2N9OB%
E"2289 !"6 
   ".5!
"%4"2.!89 5
AH)9 ,HR<%'%'2N9
9 OB%
9 & 
#@#
Agenda Task Types
4Task5""! R;%;(2N& 44"0"O*
Figure 4.40. Agenda Tasks Type Hierarchy
4 . Task      H H2   
    Data   Validation % 4 "  T 
    5 "2  !     % &
SpecifyComponentTypeTask<T>2  2     Component<T>2 !
SpecifyAttributeTask<T>Attribute<?, T>%4 
"Binding<T>2!"TaskCompos-
iteTask%
D! ! 2 
 ! %
Model to Task Mapping
4 "89 4R;%#F2N9
 & 4O%4 "
R;%<%#2N9 "O%
Table 4.18. Configuration Agenda Tasks
# $ 

<
$ $
SpecifyComponentTask E
%
Component<C> Domain<C> 9


%
SpecifyComponentType-
Task 9
"
A%B
Component<C> Domain
<Class<?
extends C>
4
"
"
%
9R;%R, "9.
#@'
# $ 

<
$ $
SelectComponentTask 9
.

A%&%B
Component<C> Domain<C> 4

%
ConfigureComponentTask 9
.

A%&%B
Component<C> Domain<C> 9


 
%
ConstructComponentTask 9
.

A%1%B
Component<C> Domain<C> 9



%
SpecifyAttributeTask &
7"
A%B


A%B
Attribute<?,A> Domain<A> 4
"

%
SpecifyPartTask E
%
Part<?,P> Domain<P> 9

"

%
SpecifyPartQuantity-
Task 9
7"

A%9%B
Part<?,P> Domain
<Integer> 4
"
7"
"%
4 "2."%
2!"" @Required
"@OptionalAR;%;%<2N9, OB%
Agenda Task Hierarchy
CompositeTask"2" %
89         2 " "  
A "2H H
R;%;%#%#2N-OB" !  
5"*
0   
89  SpecifyComponentTask 2!
! *
L  SpecifyComponentTypeTask2
L "@Selectable2 Select-
ComponentTask2
L "@Configurable2 Con-
figureComponentTask2
L "@Constructible2 Con-
structComponentTask
9 & 
#@$
80 A@Variable@ParameterB
@Configurable@Constructible289 Spec-
ifyAttributeTask ConfigureComponentTask
"ConstructComponentTask%
1 0   @Configured     @Configurable  @Con-
structible289 SpecifyPartTask
 ConfigureComponentTask"ConstructComponentTask%
 5"289 *
L0  2SpecifyComponentTask5
SpecifyPartTask2%
L10 2SpecifyPartQuantityTask
SpecifyPartTask%,22
SpecifyComponentTaskSpecifyPartTask%
 R;%;#2N3640"O6"" 
R;%<%'2N369 +O%
Figure 4.41. Example Task Hierarchy<?
4Agenda2 Task22" 
  %
<?EC6 "!
2!!"7%
9R;%R, "9.
#@;
Task State Transitions
"2  *
2 "A! 
 B%
 22   
 !5"%
&"22"
%42!5" 
%289 "2"
    %
,22"
%
D!2! "R<%$%'%<2ND !
9 & O%0!2!
89 !62!5"
 %
4.6. Summary
2!89  
 %+"2!! "6
.  
%:5". %
D2! !89 
% 2.*
L 2
L C2
L  2
L 2
L /%
1"2!89 5
!".  %4"*
#% 9."C%
'% 9= %
$% 97"2 7 
"%
489 !*!
". 2
  %4"2 
2/%,
/"! 
%
D6  
C %,
"2!289 2"
  "  %
4 6%
"
#@<
  "
 %4 22." 
2!""   %
"2!6  %
62!.  
 %D6C
/  "%
4C!  2!
89 !*
 %4"HH
 289 56"
6"%6" 2%
4! !
.%"2   2 
R$%#2N+,O2! *
L$0 DEA2
B2 A"B
%
L$0 4@Product
"%
L$0 4.2
"  2
%D2"
<@%,2 2
 %
L$0 
"2!
%2"%4"
2""
%4"/"6.
%
L$0 42 
 2" %4
!"2 . 
 %
D2.2
 "%D!6
9R?2#$%
42! *!2!
  %D6
"!  6%4!"!!2!
 R$%#2N+,O
"!R$%'%'%'2N49 
+4+O.89 %
<@42""  2 
%0!2"2 2
2!"!%
9R;%R, "9.
#@?
62!!2!89 56
%
#@@
5
Technical Architecture and Implementation
2!!89 5
%D!   2
&+%
489 5 " 
  %2!!
.)2" 
"%
5.1. Technologies
&R;%#2N489 , "O289 
"/!  %D 
6"/
A222%B289  
"!! %4 !
! 2   !%
5.1.1. Java
822/ "!%D
"/5CR;%'2N,
&O%"2/89 *
6;0 /"CA88B  C
88 2 A B2"22
2 %+"2
  ! C
R;%'2N, &O%
8   0 &  
 /6 
9R<%R4&
#@F
%2/2!/<A
"#%<B2"!89 !C
7.AR;%'%$2N+ ,!/&
OB%4" !!"%
,2A&+4B/? "*&+4
"6/2
 %&&+4 
%D".!89 !2
2&+4".
".%965"
 2!"62"
2!""&+46%#
@0 &H H"89 
2.89  "%+"2
  /1!
"   "
/5&+% &+2
 6%'
#0 89 "2"
&+  /1%2!
6 "
 /%$
5.1.2. Java Persistence API (JPA)
D89   ;2
"  !!/+&+C
%&!/"2/-$#@<2!"
'%(2 !C!89 
%,"2!  !*
$0 2/+&
".//1!
%!+8/8!
!1`:?%4"2
" ""
" "%
>0 /+& 7" "  /
1C!"%D"
7"&+"."89 5
7"AR;%;%;%#2N&OB2"
#      &+42  *==%%=C=?==
= =  =%  *==%%=C=?=== ==
) %2/''2'(#'%
' *==%%=C=?=== ==6%2   / ''2
'(#'%
$,        *==%%=C=?=== =
 = %2/''2'(#'%
;4!89 " ."DataProvider
AHHR<%'%'2NOB%D89 !
/+&22% %2/9-"&+
"/-'F$A*==C% ==C=PW'F$B "%
<*==C% =/="==C$#@=6%2/''2'(#'%
?&%%A"9  
1
#@G
7"&+'2" 
!%
10 &"/+&'
&+2!!
"%42! /+&"%D
"""89 !2
 2! -X
@%& 89 5""
"/+&5&+26""!!
%
& 2/+&"" 
 %2/+&!7"
AR;%;%;%#2N&OB2*7
"/+&7""%
5.1.3. Bean Validation
41/%
/-$($F!/"%1H
!"  CHG
C  %689 
!2! 1*
$0 1/
C" %2!"8
9  ""1%4!
!!2! 
2!/-$($2
 %
%0 41"
.!" 2
&+C %
  0     "  " /+&2 
/-$($&+
%
"289 1
 " "C%0!2
16"7!2
62""2
"%
5.1.4. Contexts and Dependency Injection for Java EE
(CDI)
E"  ! 296
"CA9B2/-'GG#(2" "
@62!/+&5@Id "
!"2""6 %9"2
@Ignored2 %
F*==C% =/="==C$($=6%
G9*==% =2/''2'(#'%
#(*==C% =/="==C'GG=6%2& ;2'(#'%
9R<%R4&
#F(
89 !%4! 
*
$;0 9  2
"C.H ! " H##%"
CABC C%2
 A""" @Inject
22B
 CC%,2
9!"CC" 
62 "%
3"2"CC2! *
L "%
L 16"%
L 2%
4! !!"C6 
 9*
@ApplicationScoped
public interface ValidationProvider { ... }
public class JSR303ValidationProvider
implements ValidationProvider { ... }
@SessionScoped
public class ConfigurationSessionImpl
implements ConfigurationSession
{
@Inject
private ValidationProvider validationProvider;
... ValidationResult<T> validate(Configuration<T> configuration)
throws ConfiguratorException
{
return validationProvider.validate(configuration);
}
...
}
4ConfigurationSession62
!2 044+#'" 
6%"2ValidationProvider%9
7"2 " C
%DC Configu-
rationSession29ValidationProvider"
JSR303ValidationProvider"!6
%
4 ."C2
 2!.%
!0 9"2
" =!!
##9*==%C% =!=====#%2/''2'(#'%
#'&%=" 6 
96"C/33A9B
#F#
8)#$!AI8)V&'((;JB%95!
 2!57
"!%"2"A!
9B%4
. (%
4!  !6!9.*
public class Payload {}
public class Sender
{
@Inject @SomeQualified
private Event<Payload> event;
public void emitEvent()
{
event.fire(new Payload());
}
}
public class Recipient
{
public void onEvent(@Observes @SomeQualified Payload event)
{ ... }
}
62PayloadC%4SenderC
9EventC29%4C
 7@SomeQualified%4
" fireCEventC2 
Payload%422onEvent
Payload27!@SomeQualified2"
 !9@Observes%E!2!Sender
29onEvent2  Payload
C"%
ERecipientSender"%2Recipient
Payload"A 
7B2! #;%02
 !6"%2!9
%:!2
2%
60 927
62!%4*
L0 ,!&8+#< 
 #?%"C
!"%
&""%
62"2 " 5
 2#@%
#$"%1!"
#;*==%!% =!=8V2/''2'(#'%
#<&%! 
#?*==%C% =!=====%2/''2'(#'%
#@  6 "     92   *==!!!%!% =
 ='(#(=($="!C'=2& ;2'(#'%
9R<%R4&
#F'
L$0 D9! .#F%
82 "%42
"!C"!"%
& 2689 2
.""#G%"2"
 2 27%4
26.22
% 52
" "%
L1"0 D)29  
6%4!"!" !9
 "2  9%
489 !962 
9%4!22 
%  289  
"/%
89 " 95"C"
 %1"
 "%9"29C
89 5)2)22
!*
$;0 3" !
@Inject29%4*
L 2" "
! !"A"B
L "!
"2 "A% %2 
22%B 9A6"26"2
"B
L"AB2 2'(
A"B
!0 ," !CA% %2!
ConfiguratorConfigurationSession2CComponent2Attribute
Part2%!B!"2"
9%62!!  289 
ConfigurationSession'#7!@Initialization"7%
4!  *
L .62
 A6"B
L .!  5
A"B
L  .2 6
!A6"B
#F*==%C% =!=====%2/''2'(#'%
#G36*==!!!%%=!='';((#?F$#=+$"C/
33?2& ;2'(#'%
'(*==%!% =!=,VC2/'$2'(#'%
'#,"2ConfigurationSessionImplementor2!Con-
figurationSession2"%,R<%'2N&
8!O%
&8!
#F$
2"C"9
2!2!6"2
"2"6"6%
D95A22%B!
!22 89 "
25"""%2!2
!C 9"
 ""9%
0  !
89 !2!!!5
%
5.2. Architectural Overview
2!!89 5%D
      !   2 ! !     
!.% R<%#2N&8!O
2!5H H%
Figure 5.1. Architecture Overview
9R<%R4&
#F;
5.2.1. Multi-Tier Architecture
2""289  
''%62
!*
1&0 4" 
!%4"" "89
 2!2""A% %2
! "'$9R?2#
$B!"!"5!%&
"289 ! /
A% %23-9+';B%
9!5 A
!B" !"2" '<%
:0 489 !" 7
 %4"*
L  0 4&+
" /1 89 %
!"/,'?2
"2!" &+%
L!"10 4)%"'@"
!2  %4+
89 6!
 !"%
L0 489 
"!%+"2
"%
L1A 0 "289  "
 'F2!""2
!6!5" %
$0 :""289 "
= =6"%
89 26"2"
2"+,23-+29-,9&!%
D" /2
"/%
489 5
%! 2!! 
"!%
''*==%!% =!=,V2/'<2'(#'%
'$*==%=2/'<2'(#'%
';*==!%% =6%=-V9V+2/'<2'(#'%
'<E*!"%
'?&%,$
'@&%+
'FE*" %
99 
#F<
5.2.2. Client Configuration Interface
489 !
2! &+
 %
D!6!R<%$2
N&+ *D !89 O%
Configuration API
4!"/2!
! ! 
 "%&Configurator"
 &+%4&+!! *
0 4A"/Con-
figurationSessionB  
%D !6
 2 %42 
! %D 
"!"2!"2
 5"!"044+A
B!/33!6%
4ConfigurationSession  
 A!B%Configurator
"C%
& ConfigurationSession   C2" " Configura-
tionSessionImplementor 2  ! 89   " 
A@Initialization2@FinalizationB9%
80 4 ConfigurationA-
genda%4" 
2 A
R;%<%$2N9 & OB%
2              
*!72!!
 %&2  
 %2   2&+
 %
 0 &R;%$2N4)9 
,O2HH89 !%
 !&+
 %,2.  
 ! 2
%
4  ".Config-
uration2Component2AttributePartAR;%;%#2N, OB%4
ConfigurationC 
%&Component<T> 
"T22C "%9
 C2""ConfigurationImplementor2
ComponentImplementor2AttributeImplementorPartImplementor%
9R<%R4&
#F?
89 "A@Preparation2@Initialization2@Fi-
nalizationB9%"2C 
ModelFactory2! 'G%
D2!=
%&R;%$%$2NO289 
62 2$(%1"2
"2"6"%2
.29&" 
"%7"
 ""6!AR<%'%<2N+ 9O
R<%;2N+ *36   89 OB%
&"R;%;%#2N, O2  
./%422 
%4"
 262!5 5"
%4""2"""22
  A!B"6  %
8"9AR<%'%;2N)3
1OB2 6"!%"2
 .2!"
  @Initialization%
:$#0D2  
"  %4 
"6"7
 2 %2
"!"""2
 2"" %4  
"ValueChange2TypeChange2%
6$'0D  !2"
 2&+
$$"%  2SetVal-
ue2SetType%2 26
"%4"  
!AR<%'%'2NDOB%
Services
  2  ""
%& 2$;*
$10 4MetadataProvider 2
7"22ComponentDescriptor2Attribut-
eDescriptorPartDescriptor/"A
R;%$%#2N3)9 ,,,OB%
$10 4DataProvider"
"   %"2
'G*==%!% =!="VV2/'?2'(#'%
$(E;""%
$#4"2!89 %
$'4"2!8
9 %
$$42 2*==%!% =!=9V2
/'?2'(#'%
$;E!!2R<%'%$2NO%

#F@
2!@Domain.Query"
 "AR;%;%;%#2N&OB%
9 10 4ValidationProvider22 
 2!"%
"%
0 &ConfigurationManager2!
"Configuration%&2
  ""
% 2@Completed Configura-
tion9%4""
6. 6"2
+,23-+9-,%02  
! "%
Webservice Interface
89 5 "
%4!-34$<
8&+$?%& 6" 
 " 044+$@2!"
6"-34"2! -34
!
89 !% 2!89 52
"!8&+!
%
5.2.3. Internal Implementations
D62
""2!
%4! %
Default Implementations
89 !%
4!HH
!%&"9
"C2"
 95 "AI/-'GG'((G2
%#@JB%
Default Service Implementations
," 289 
 C/33$F2"/+&21/&[1%
4*
E@$10 89 5"
 /%42
$<&%8#% 2-34"I '(((2
%@?J
$?&%%C!
$@&%=" 6 
$F&%,##
9R<%R4&
#FF
!5MetadataProvider/52
"7"6 
%
&6"
[,:"%8[,:
/"/"%
&"289 TypeRepository2
7""%4""5"
 "2"/
6%
E18$10 1"289 !/
+&+ %
+"2/+&5/+`:$G"7"  " 
2" @Domain.Query%4
7""6"/+&
%9"289 /+&'%(%
<9910 &289 5
!"1
%289 /-$($
%9"289  1
#%(%
E8F< 0 89 5ConfigurationManag-
er   
<9%&"2" /1/&[1
2" [,:2 6 
<9%1[,:."/&[1
'%'%
5.2.4. Extension and Integration SPI
&C89 5)
.%"/2!"2  
.6" "%
Implementors
4+%&
 !"%2
"7"!.%,"2
!!.%D
.256" % R<%'2
NO.!! Com-
ponent6%
$G&%,A"9  
36 +
#FG
Figure 5.2. Implementors
 2"&+Component
"2!%+"2
"5 .%2
&+""2 
%
4"2. 9AR<%'%;2N)
31OB2" @Initialization2 ComponentImplementor
CC="%.""22
". +Compo-
nentImplementor"%
"2"HH89 5
"2! 
6.A.B%4
 !2!
%
Global Event Bus
& +"95"A
R<%#%;2N96"C/33A9BOB%4 
"89 56"6"2" 
  %4R<%#2N)
33931O! *
9R<%R4&
#G(
Table 5.1. Global Events Emitted via the CDI Event Bus
!&1 > $
5%
BootstrapImplementor R 3  
2
%&!
 !
%
ComponentDescriptorImplementor2
AttributeDescriptorImplementor2
PartDescriptorImplementor
@Preparation2
@Initialization 9
"%
ConfiguratorImplementor @Initialization2
@Finalization 9 "
%
ConfigurationSession
Implementor @Preparation2
@Initialization2
@Finalization
9 
"%
ComponentImplementor2
AttributeImplementor2
PartImplementor
@Preparation2
@Initialization2
@Finalization
9
"%

Component.Event2
Attribute.Event2Part.Event
R :  

 %
Attribute2Part @Added2@Removed 3"
 %

Configuration @Created2
@Stored2@Loaded2
@Completed2
@Validated2
@Submitted
9 "
%
D!  *
5%0  "!C%4""
""%4 !
AR<%'%;2N123OB26
2  "%
0 &  %4"
!"  
%2R;%;%#2
N, O%4"5" 2"
%
0 E"2
 %4"22" 
7.  "6"
AR<%'%<2N+ 9OB%
Bootstrap, Environment and Utilities
&289 "/33!
%"2 ,##@2!&+
+ 9
#G#
$%(29#%(2/+&'%(21#%(/&[1'%'"%1
 "289  "2 
"!!5/&-"!%
 289  "!"6
!" Configurator2!
"ConfigurationSession%
 62
89 CEnvironment
" "%! 6
Environment262*
L,##AB2D&-;("
L,%#
L%1
47
2""
%
"289 !%
2"26
""&+7"7""%
5.2.5. Plugins and Connectors
2!5!"2!
"26!5%E"2 
"6%
 2"!*
10 +6  %6
2 6 2
!  .  %8
 
%4."" 
 !@Initialization ComponentImplementor2
 ComponentImplementor.addFacet(Class<F>, F)%
0 &! 89 "2
 +,23-+29-,9&%&62 
3-+9-," "
"%4"! 2
  @Submitted Configuration%
 6289 !!
 2
 "%4+9R?2#
$22A"B !
%
0 89 
!262!  !&++
%
;(&%>!
9R<%R4&
#G'
5.3. API Usage: Working with OpenConfigurator
2! ! 89 
!%2!!!2!&+"
!AB %
42*
#% 1  !  
'% +  
$%     
D!"! %
5.3.1. Bootstrapping and Starting a Configuration Session
9! * !5! /;# 
" 1 9R?2#
$A&6R12#)-63B%
 !9!/2!5. &7;'
!C;$%4/2!
89 AB""
C%
Bootstrapping OpenConfigurator in a Managed Class
&2! 89 !"
CA&7/! 2$%(
"9B2 89 "*
@RunWith(Arquillian.class)
public class ConfiguratorIntegrationTest
{
@Inject
private Configurator configurator;
@Test
public void testConfigurator()
{
// do something...
}
}
8 "89 !"
"C Configurator" %89 
 "%&.2 "
%
&289  !!
"A 7B*
#% BootstrapImplementor
'% @Initialization ConfiguratorImplementor
;#*==C% =2/'@2'(#'%
;'*==!!!%C% =72/'@2'(#'%
;$4 " /&7" 89 %
1  9 
#G$
Bootstrapping OpenConfigurator in a Non-Managed Class
" 9C!"2""
89 !*
public class ConfiguratorStandaloneTest
{
@Test
public void testConfigurator()
{
Configurator configurator =
new OpenConfigurator().initialize();
// do something...
}
}
X"  ! OpenConfigurator      initialize
%
!2!C  
  %
Obtaining a Configuration Session
46  ConfigurationSessionC2!Con-
figuration*
@Inject
private ConfigurationSession<Bike> session;
ConfigurationSession<Bike> session =
configurator.createSession(Bike.class);
// start configuration
...
session.load(id);
Bike bike = new MountainBike();
session.restore(bike);
// continue with configuration
...
& 2!!"ConfigurationSession%2
C%&"2!2" Configurator
5createSession"%
2 AR<%$%'2N+ 9 OB%8
! 2" "
 /1%
 289   
.   "%&"2! A
 7B*
#% @Preparation ConfigurationSessionImplementor
'% @Preparation Component=Attribute=Part2
$% @Initialization Component=Attribute=Part2
;% @Initialization ConfigurationSessionImplementor
9R<%R4&
#G;
A/BConfigurationSession2
&6R92!"0%"%
5.3.2. Performing Configuration
0   2
 89 &+%9 
! *
L E     
L & 
L " 
L D !
L D !  
D!!"
2   &+ 2!
" %
5.3.2.1. Navigating through the Generic Configuration Model
4 &+   2
!!  *
// retrieve the root component
Configuration<Bike> configuration = session.getConfiguration();
Component<Bike> bike = configuration.getRootComponent();
// get all attributes
Collection<Attribute<Bike,?>> attributes = bike.getAttributes();
// get a specific attribute
Attribute<Bike, Integer> weight = bike.getAttribute("weight");
...
// get all parts
Collection<Part<Bike,?>> parts = bike.getParts();
// get a specific part
Part<Bike, Frame> bikeFrame = bike.getPart("frame");
// access the component associated to a part
Component<Frame> frame = ((SingularPart<Bike, Frame>) bikeFrame)
.getPartComponent();
// alternatively, use a shortcut method of the Component interface
Component<Frame> frame = bike.getPartComponent("frame");
...
assertTrue(frame.getParent().equals(bike));
2Configuration%&
2ConfigurationC 2!Config-
urationSessionAgendaAR<%$%'%<2ND !9 & 
OB" %&Configuration
 2 getRootComponent%
4Component
"2!7 /1%
+ 9 
#G<
2Component
"% 
"2!*
L SingularPart5getPartComponentA"getPart-
ComponentsPluralPartB2!7 
"2
L    getPartComponent A" getPartComponents  
B"Component2"%
45 getParent
%
EC2""AConfiguration<C>2Component<C>2
Attribute<C, A>Part<C, P>B2.2 "%4"
 &+!%
A/BConfiguration2Component2AttributePart
!2&6R92!"0%"%
5.3.2.2. Accessing Meta-Data and State Information
4  "
"%& !"!
Component27""AttributePart!*
// get the descriptor of an element
ComponentDescriptor<C> elementDescriptor = element.getMetadata();
// whether this element or any of its sub-elements
// has been specified in some way by the user
boolean specified = element.isSpecified();
// get the current JavaBean type of the component
Class<? extends C> currentType = element.getType();
// whether the current type is abstract
boolean notInstantiable = element.isAbstract();
// whether the element has been instantiated,
// aka the underlying bean has a non-null value
boolean instantiated = element.isInstantiated();
D5getMetadata2C 
%4isSpecified 2
!26""
%4getTypeisAbstract5
"!"%"2
/1 """%4
isInstantiated!"A
R;%;%#%#2N-OR;%<%'2N369 +OB%
5.3.2.3. Specifying Options
+" &+2
" %D2 
%!   !!2!
9R<%R4&
#G?
R;%<%'2N369 +O! 
&+*
// specify the type of a component
bike.setType(ElectroBike.class);
// specify attribute values
Component<Frame> frame = bike.getPartComponent("frame");
Attribute<Frame, Color> color = frame.getAttribute("color");
color.setValue(Color.SILVER);
frame.setAttribute("label", "MyBike");
// specify part values
Wheels slickTyres = ... // get slick tyres instance ...
bike.getPart("wheels").setValue(slickTyres);
PluralPart<Bike, Equipment> bikeEquipment =
(PluralPart<Bike, Equipment>) bike.getPart("equipment");
bikeEquipment.setCardinality(1);
Component<Equipment> equip1 =
((Indexed<Component<Equipment>>) bikeEquipment).get(1);
equip1.setType(Lock.class);
Lock lock = ... // get lock instance
equip1.setValue(lock);
Component<Motor> motor = bike.getPartComponent("motor");
motor.setAttributeValue("fuelType", FuelType.DIESEL);
motor.setAttributeValue("power", 200);
D  setType    Component 2  "   "  /
1%4" "
5"C22Bike6%& 2
"2"
/1%42 62ElectroBike
"bike.setType(ElectroBike.class)%
E62!HHHH
Attribute5setValuesetAttributeValueCom-
ponent%
2!"%4 Part
5setValue!%&57"
 setCardinalityPluralPart2!"
Part%"2 !2!
%
"289    /12
"" C%2
R;%;%#2N, O
 %
5.3.2.4. Working with Facets
!2!"""&+%
+" 2!2"
%
4 AR;%$%$2NOB%
D5  6%
+ 9 
#G@
The Product Facet
4Product%4!
   !6"Product*
Component<Bike> bike = ...
Product<Bike> bikeProduct = bike.getFacet(Product.class);
String description = bikeProduct.getDescription();
Collection<Attribute<Bike, ?>> characteristicAttributes =
bikeProduct.getAttributes(Attribute.IDENTIFICATION);
2Product%4getDescription
!@Product.Description%02
 !
*&+"@Product.Description
2"Product2
"2"&+%
A/BProduct&6R92
!"0%"%
The Configuration Facet
DConfiguration2 
*
Component<Frame> frame = ...
Configuration<Frame> frameConfiguration =
frame.getFacet(Configuration.class);
SpecificationMethod specificationMethod =
frameConfiguration.getSpecificationMethod();
assertTrue(specificationMethod.equals(CONFIGURABLE));
Attribute<Frame, Color> color = frame.getAttribute("color");
AttributeType colorAttributeType =
frameConfiguration.getAttributeType(color);
assertTrue(colorAttributeType.equals(AttributeType.VARIABLE));
Collection<Attribute<Frame, ?>> parameters =
frameConfiguration.getAttributes(AttributeType.PARAMETER);
assertTrue(parameters.contains(frame.getAttribute("label")));
Component<Bike> bike = ...
Configuration<Bike> bikeConfiguration =
bike.getFacet(Configuration.class);
PartType wheelsPartType =
bikeConfiguration.getPartType(bike.getPart("wheels"));
assertTrue(wheelsPartType.equals(PartType.CONFIGURED));
&2 ! Component
5getFacet%4Configuration
 2 2
R;%;%$2N9 , O%
4getSpecificationMethod!
 "22SELECTABLE2CONFIGURABLECONSTRUCTIBLE%4
"/"SpecificationMethod%
"2"REGULAR2VARIABLE2PARAMETERCALCULATED
"AttributeType7
9R<%R4&
#GF
 getAttributeType%4Configuration
getAttributes(AttributeType) 
"%
4 PartType    "  REGULAR  CONFIGURED 
   %&Configuration
    2     getPartType(Part) 
getParts(PartType) 5" "
"%
A/BConfiguration&
6R92!"0%"%
The Data Facet
4 Data2&+ 2
%"2
2R;%;%;2N, O%D5
*
Component<Bike> bike = ...
Data<Bike> bikeData = bike.getFacet(Data.class);
Domain<Class<? extends Bike>> bikeTypeDomain =
bikeData.getComponentTypeDomain();
assertTrue(bikeTypeDomain.isEnumerable() &&
bikeTypeDomain.getSize() == 3 &&
bikeTypeDomain.contains(MountainBike.class) &&
bikeTypeDomain.contains(CityBike.class) &&
bikeTypeDomain.contains(ElectroBike.class));
Component<Frame> frame = bike.getPartComponent("frame");
assertTrue(frameData.getDomainScope().equals(PROPERTY));
Attribute<Frame, Color> color = frame.getAttribute("color");
Domain<Color> colorDomain =
frameData.getAttributeValueDomain(color);
assertTrue(colorDomain.isEnumerable() &&
colorDomain.getDomainType().equals(SYMBOLIC));
for (Color definedColorValue : Color.values())
assertTrue(colorDomain.contains(definedColorValue));
Attribute<Frame, String> label = frame.getAttribute("label");
Domain<String> labelDomain =
frameData.getAttributeValueDomain(label);
assertTrue(!labelDomain.isEnumerable() &&
!labelDomain.isBounded() &&
labelDomain.getDomainType().equals(LITERAL));
Part<Bike, Wheels> wheels = bike.getPart("wheels");
Domain<Wheels> wheelsDomain =
bikeData.getPartValueDomain(wheels);
assertTrue(wheelsDomain.isEnumerable(10));
Iterable<Wheels> wheelsValues = wheelsDomain.getValues();
...
& 2     Data    Bike      
Component.getFacet(Class)%2!5 
 getComponentTypeDomain%4Bike5"
+ 9 
#GG
"!2!!"6"
"6 Bike2"MountainBike2CityBikeElectroBike%
E62!5 Frame%
@Configurable!@Domain
2""A36R;%#;2N
36&OB2
2"DomainScope.PROPERTY%&
 getAttributeValueDomain(Attribute)2!
.DomainC%4color
2"Color"%4label5
222%
"2       "  Data %   
getPartValueDomain(Part)Data2DomainC
 5%47
 "2!R;%;%;2N, O%
! 2102
 getValuesDomainC%
1"2Data!
2R;%;%;%'2NO*
Component<Bike> bike = ...
Data<Bike> bikeData = bike.getFacet(Data.class);
Class<? extends Bike> defaultBikeType =
bikeData.getDefaultComponentType();
Component<Frame> frame = bike.getPartComponent("frame");
Data<Frame> frameData = frame.getFacet(Data.class);
Attribute<Frame, Double> height = frame.getAttribute("height");
Double defaultHeightValue =
frameData.getDefaultAttributeValue(height);
Component<Wheels> wheels = bike.getPartComponent("wheels");
Data<Wheels> wheelsData = wheels.getFacet(Data.class);
Wheels defaultWheelsValuePartLevel =
bikeData.getDefaultPartValue(wheels);
Wheels defaultWheelsValueComponentLevel =
wheelsData.getDefaultComponentValue();
3726"!
%4"7
 Data5getDefaultComponentType%2
!getDefaultAttributeValue(Attribute)
%:!25 getDefaultPartValue(Part)
%22@Default.Query
5/12"" 
@Default.Query "%2
 getDefaultComponentValue 5
%
4A/BData!Domain
&6R92!"0%"%
The Validation Facet
"2  2 !
Validation%4!!  *
9R<%R4&
'((
Component<Bike> bike = ...
Validation<Bike> bikeValidation =
bike.getFacet(Validation.class);
// obtain constraints defined on component level
Collection<Constraint<Bike>> componentConstraints =
bikeValidation.getComponentConstraints();
// obtain constraints defined for a particular attribute
Attribute<Bike, String> label = bike.getAttribute("label");
Collection<Constraint<String>> labelConstraints =
bikeValidation.getAttributeConstraints(label);
// obtain constraints defined for a particular attribute
Part<Bike, Wheels> wheels = bike.getPart("wheels");
Collection<Constraint<Wheels>> wheelsConstraints =
bikeValidation.getPartConstraints(wheels);
// perform validation
bikeValidation.validate();
// retrieve constraint violations
for (ConstraintViolation violation :
bikeValidation.getViolations())
{
log.message("Constraint " + violation.getConstraint() +
" on target " + violation.getTarget() +
" is not satisfied.");
}
& 2Validation Component5getFacet(Class)
%4Validation
*getComponentConstraintsConstraint
%4getAttributeConstraints(Attribute)2
2 !          2 ! 
getPartConstraints(Part)%
4   "    . Constraint 
2           
% 4   Constraint 2        
Constraint.validate()%0!2
6"289 5
"" 22!
 %8!2!
"2" 6" 
Validation5validate%
"22"2 getViolations%
"622Con-
straintViolationgetTarget2"getConstraint%
4A/BValidation!
ConstraintConstraintViolation&6R92
!"0%"%
5.3.2.5. Working with the Configuration Agenda
4&+2 2!
 %89  2
+ 9 
'(#
&+%5 Agenda2!2
2ConfigurationSession*
ConfigurationSession<Bike> session =
configurator.createSession(Bike.class);
Agenda<Bike> agenda = session.getAgenda();
Iterator<Task<Object>> openTasks = agenda.selectItems(
new Filter()
{
public boolean select(Task<?> task)
{
return !(task instanceof CompositeTask) &&
!task.isComplete();
}
}).iterator();
// simplified configuration process
while (openTasks.hasNext()) {
Task<Object> task = openTasks.next();
Domain<Object> domain = task.getDomain();
if (domain.isEnumerable())
{
Object chosenValue = letUserSelectValue(
task.getDescription(),
domain.getValues());
task.setValue(chosenValue);
}
else if (domain.isBounded())
{
Object enteredValue = letUserEnterValue(
task.getDescription(),
domain.getValueType(),
domain.getLowerBound(),
domain.getUpperBound());
task.setValue(enteredValue);
}
else
{
Object enteredValue = letUserEnterValue(
task.getDescription(),
domain.getValueType());
task.setValue(enteredValue);
}
}
assertTrue(session.getConfiguration().isComplete());
2!AgendaConfigurationSession%E62!
AR;%<%$2N& 44"O!B2"
 Agenda5 %
42!"" *! 
65% 5.2!
L2
L2
L"  "%
9R<%R4&
'('
4%2!2
 %
8 2 
 %46%
5.3.3. Configuration Submission and Further Processing
2!5! 2
2%E!2! 
2""""%
0!"89 &+!! 
 *
ConfigurationSession<Bike> session = ...
// assert configuration validity and completeness
Configuration<Bike> configuration = session.getConfiguration();
assertTrue(configuration.isValid() &&
configuration.isComplete());
// persist configuration
session.store(id);
// submit configuration for further processing
session.submit();
// close session
session.close();
4. 2ConfigurationSession
C%E62""2! 2
isValid2 isComplete%
true22 5"
2  %1
7!@Stored"@Submitted2 Configura-
tion"%
4@Submitted Configuration"""6= 
 /16"*
public class ERPConnector
{
@Inject
private ERP erp;
public void process(
@Observes @Submitted Configuration<Bike> configuration)
{
Bike configuredBike = configuration.getValue();
erp.order(bike);
...
}
}
62ERPConnector" %
2 " 2 Bike
+ *36   89 
'($
6 Configuration5getValue%4/1
 C2"7
%ERP.order(Bike)%
"2 ConfigurationSession.close()%4
close!89 7%
4&+! %5"6 
 2/1%62!5
2!6 89 5+%
5.4. SPI Usage: Extending and Integrating Open-
Configurator
&R<%'2N&8!O289  "
626"9  %
2!566
!%D5 + %
Example Plugin: the JPA Meta Model Facet
&62!! 26/+&
  " ComponentDescriptor%9
!*
Example 5.1. SPI Usage Example
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import javax.persistence.EntityManagerFactory;
import javax.persistence.metamodel.ManagedType;
import configurator.spi.Initialization;
import configurator.spi.metadata.ComponentDescriptorImplementor;
/**
* A plugin that exposes the JPA metamodel of a managed component
* type as a facet of that component.
*/
public class JPAMetaModelFacetPlugin
{
@Inject
private EntityManagerFactory emf;
public <C> void registerFacet(
@Observes @Initialization
ComponentDescriptorImplementor<C> implementor)
{
if (emf == null)
return;
Class<C> componentType = implementor.getComponentType();
ManagedType<C> managedType =
emf.getMetamodel().managedType(componentType);
if (managedType != null)
implementor.addFacet(ManagedType.class, managedType);
}
}
9R<%R4&
'(;
4  /25"89 
%
D 2"C"!8
9 !%62 "
EntityManagerFactory"/+&%
1"    ComponentDescriptorImplementor .  A 
R<%'%;2N)31OB2  .
%4""2 6
22!%4C 
2!22
" .AR<%'%;2NOB%
& /" .2
 ManagedType/+&'%
4ManagedTypeA"B 
 .addFacet(Class<F> type, F facet)%E
ManagedType5"89 "
"/"%
&   52
89 2"92" 2!
ComponentDescriptor .%
4! 2!*
Component<JavaBean> component =
session.getConfiguration().getRootComponent();
ComponentDescriptor<JavaBean> descriptor = component.getMetadata();
if (descriptor.hasFacet(ManagedType.class))
{
ManagedType<JavaBean> facet =
descriptor.getFacet(ManagedType.class);
PersistenceType persistenceType = facet.getPersistenceType();
// ...
}
D ManagedType.class%&62!
7"A"222%BJavaBean
%
&762!2!"6
.! "%
, 66 +,"6
!23-+9&"2 A
B!%
5.5. Summary
2!89 56
%3"2 "
/12!R;%;2N,
9O2 %
2! "89 
%D   
!2 *
"
'(<
L /2 &+42
L /+&2
L 12
L9%
+"2!)-"2.-"/ 
 !52!!C6%
&"2!.89 2
%,2!2!
"!%4 
."89 *
0 4"
 &+2"  
%4".2"2
 %
0 89 !
!"%4
. !/33 2 /+&21
/&[1%
!"10 !6 ! 
 !"6289 )
%"%4 +"
."9"%
1 0 "289 "
 2" 
 6 +%
4  &+!+2!C
! %D62! !89
  *
#% 8   " %
'% +  
%
$%    %
D2 A 22
2%B". !  
&+ ! %&"2!!2 2
 &+" "%
"2!6689 !%
629R?2#$2!!
"  +%4 
2!"  2!22
 %
'(?
'(@
6
Evaluation and Validation
2!89  !
!5 2 %
!!".  
 "%4!2! !
77%
"22!!*
L 6"H1 H
2 #2
L   +2
%
D!!2*
L !7! 2
L  &+ 2!
 %
D!" 
 %"2!5!6"
  .%
6.1. Case Study: Bike Configurator for the iPad
&62! 
","1%%
6.1.1. MyCustomBike Inc. - the Custom Bike Company
 ,"91% !"
2""A!'B%E","
#4"- 562I- '(#(2%'?<J%
'I*==%!% =!=+J2/"#(2'(#'%
9R?%R3
'(F
91%"2"!
." "7%&" 
"2!""!2 "2
6 2!%
& 2!6 
 ,"91%
"" %
&"2,"91% "  A
!a'(a;(B2!"
2"2  .
%&2 67!
 2 !7 2
%
,"91%2!2
 " &+
  7"% 
"  H"H2 
" 62!"%
,2 256  
2!.7
,"91%5%
6.1.2. MyCustomBike Inc.'s Product Range
4 "".2
!." %4 2*
L - 
L ,A,41B
L 9"
L 3AB
3""..22 7%1"2
! A R?%#2N9
1OB*
L 
L )
L 1
L 9U+
L U0
L D
L U
L ,U1"
L 37
466 2!6
2R1%#2N9O%
41,
'(G
Figure 6.1. Components of a Bike$
6.1.3. The Bike Domain Model
 R?%'2N,:9 1,O!
6 %
46R1%'2N9O%
4! 89 *
0
L0 ,Bike@Selectable2
  SeatpostSaddle2 StemHandlebar2 Brake2 Gearing2 CranksPedals2 Wheels2
EquipmentMotorBattery%
L 0 4Bike5Frame@Configurable%
80
L@0 &5descriptionprice 22
%
L90 !2 %
L10 4Frame 2"String2
label%
L 0 4weightBike!Frame5size
"%
$4! !"%2*==!!!%"%=%& %
9R?%R3
'#(
Figure 6.2. UML Class Diagram for the Bike Domain Model
$0
L 0 &
 @Domain.Query%
L80 4 Frame
 @Domain.Query   "      
"/%
$0
L 0 D65"2
!"  %E"2
Bike"A RacingBike2MountainBike2CityBike
ElectroBikeBEquipmentA!"Mudguards2LightCarrierB%02
!77
  %
L80
L%* 4  "  !  2   Frame.material2
Frame.color2Brake.type%/"%3
""%
L7*4Gearing.gears6AB
%
L9*4labelFrameAB
%
$0
L5"04!2
6 "%42" 
%36MotorBattery.power2MotorBattery.maximumSpeed
LightCarrier7%
4),9 9
'##
L!0 ,6
%& !/"2!"
A% %2Frame.color2Frame.material2SeatpostSaddle.type%B2
6Frame.label%4
@Domain.Query%
LC0 4Frame.label " 
"String%
$0
2@Default.Query%
&"2Bike"MountainBikeRacingBike
wheels% Frame2
%
0
L@0 &!@Relational2
%
L@7&60 DBike27"
 @Required@Optional%&@Se-
lectable2!
2  
"!"%0!2@ConfigurableFrame2@Variable
@Required%
L 2< 930 4  Frame.label    !
@javax.validation.constraints.Size6 
%
L &"0 4Gearing.gears!
@Min=@Max26"! 
"%
10
L$0 &description 
@Product.Description%
L1045price@Product.Price%
L80 4Bike.image%
025@Asset%
4!.R?%$2N9 +O2
!!6 %
6.2. The Generic Mobile Configurator Client
1  1 2!!"
    +2!!
"%
6.2.1. Technology
   +2!
04,:</!!%4
!"2!" "8;
"%"!%4!
!%
;*==!!!%%===2& <2'(#'%
9R?%R3
'#'
4  
4%
Vaadin
! "04,:<2"&/&[?
AB6!%2!
"AB/57!  
04,:/!%"2
) D4A)D4B@2 "" /
 "./2!!%
02 "2"
044+%!!
 /! FD4G%+"2
! 2!6
" %8)D45"2!
/2
 !! "%
!" %2"
5 !%4
"!/2
5!A-+9B
!%#(
Vaadin Touchkit
,2#@(##2 4
#'2 04,:<&
++%D4!2
!U/2  
!/33A"9 "2R<%#%;2
N96"C/33A9BOB%
  89  !2     4  
 !!" /2  &+!
%& /25 "
%,2 
"!5!
89 !"  
&+2AB"%
:5 2! 89 
%
6.2.2. Architecture
4=04,:<
R<%'2N&8!O" "%&
<&%=" 69  
?&% !" , ! <,:2     *==%!% =!
=&C6VA+  B2/"#<2'(#'%
@*==%  %=!=2/"#<2'(#'%
F*==%!% =!=! VA/B2/"#<2'(#'%
G&%%>  2*==!!!%% =!=2/"#<2'(#'%
#(2!2!
 "H1H2*==%==/"#<2'(#'%
##*==%="2/"#<2'(#'%
#'*==%=2/"#<2'(#'%
&
'#$
2;2!! R?%$2N)
,9 &O*
Figure 6.3. Generic Mobile Configurator Architecture
$#0 42!
!89 /+&%D/+&2
,"`:#$%4
 22[,:%
:#0 4"89 !%
6 2!"
""%
1#0  $2
! 
%4 2!
 "%
4." "
%4
!5/C%4
!".
" !%
4"!9 &+%
#04!"!) 
D4A)D4B%2!
!!.! "
 "%,2
. 04,:<28,#;9#</%
#$*==!!!%"7%2/"#?2'(#'%
#;&%-C
#<&% %"%
9R?%R3
'#;
42!"/
6"/33?D+!2
/1&@%##?%4!"04,:<
!!2!""%
6.2.3. User Interface
0 52!!!
  % R?%;2N,
9 DO " *
Figure 6.4. Mobile Configurator Wireframe
80 4! !
2 *
L40+ "  %
&!%
L<%04! %
4! !%
L 0 4 
 %! 2!5"%
L 04 ! %
 %4 7
 "%
L0 4 "  %
#?*==!!!%C% =C2/"#?2'(#'%

'#<
0 4" %
!! 2" 
" %
80 4! 
 %!  "
2 %,2 
!!2!2
%&2!"
5AgendaCAR<%$%'%<2ND !9 
& OB%
Figure 6.5. Hierarchical Agenda Navigation
4  %42 
! . *2
2 "%3
!5% 
R?%<2N0& E O 
  %
'<0 42! !2
 * 2
!6="%"2
  
%2"! 
%&62! 
"%
$0 4 "
%4 !
5%
%
90 & 2.
!" %D 
..2 2
5!@Product.Asset2!
%
9R?%R3
'#?
0 4!
 %2""
  %,2
 A -2
R$%$%'%'2N=-OB%"2 
2!!
 2  2!
    !
%
 R?%?2N36")9 O!6"
  %
Figure 6.6. Exemplary Screenshot of the Generic Configurator
6.3. Configuration Procedures
D"!!6 !1 
%D! 2!!!*
L 9 !  "
L 9  
L 4    
L  !
L & 7
L 
9 E!19 
'#@
6.3.1. Creating a New Bike Configuration
4 "!% R?%@2N9 
9 E!9 O! %
! H&H%
 5! 22
@Configurable @Product2!!
 %0!2Bike""
2!ConfigurationSession%
DConfigurationSessionCConfiguration
   %2
"%"2Agenda! 
2 " %4
 !!AgendaC
 22Bike5"%
Figure 6.7. Initial Configurator State after Creating a New Configuration
4Electro Bike"% R?%F2N9 
4"O!%
E!2"2 
" /1 bike.getWeight2
bike.getImagebike.getPrice%02"
" "*
L! !2
L 2
L"%
9R?%R3
'#F
&H,U1"H  %
ElectroBikeMotorBattery""%4
6Bike"A R?%'2N,:9
 1,OB%
Figure 6.8. Configuration State after Type Selection
9  19
'#G
6.3.2. Configuring the Bike Frame Component
 R?%G2N 9O!
Frame2!@Configurable%D
!"2!
 HH6%
4!5"
2!!%E 
 "" 2 %
Figure 6.9. Specification Dialog of the Frame Component
9R?%R3
''(
6.3.3. Triggering and Resolving a Configuration Error
:5Frame5label*
26  ';A"
@Size(max=24)"5 B%4
 2!"%
 R?%#(2N.9O"
*
Figure 6.10. Visualization of Constraint Violations
4"!  !
"A6B%2 " 
%&"
 6 " "
%4 "%
 D
''#
6.3.4. Selecting Wheels
4Wheels6!@Se-
lectable% 2   
5%
 R?%##2ND O! SelectCom-
ponentTask*
Figure 6.11. Wheels Selection Dialog
4  2Wheels! 2"
%
4Wheels%9"2
!5wheels%42wheels
" " %
9R?%R3
'''
6.3.5. Adding an Equipment
E62!!!2!25equipment2
!  %
 R?%#'2N++O!57
*
Figure 6.12. Plural Part Specification
2H+H7%4
 75SpecifyPartQuantityTask%4"
7  ".
 "%&7"!6Equipment%
! Equipment"2"Mudguards2
LightCarrier2""!"7
%& Mudguards2 SelectCom-
ponentTaskMudguards%
&2!7" 
%
9
''$
6.3.6. Submission and Checkout
E!272
" %
 R?%#$2N9 O!!
 %
Figure 6.13. Configuration Submission
& H&H 2 2
" !! %&  
2"*
L   2
L ! +#@2
L 6 [,:2
L  %
& H&H2 
 2! 
% !2"
 %
4  ! %! 2!5
"  %
#@&%-4
9R?%R3
'';
6.4. Validation
89 5 !2
 %&2!!
 +%D5
! %
6 D%
0 2!5!2 
"89 ! %& 2
 "."C 
  %
 2"/! !"
  /+&/&[1"7%2
!2""""
C26/%
@  (     "0 ,2 
89 !"6
"  65"%42
" " %2
!2"" %
@0 &.
 "/12 !
C2! 6"
% 2  !
7C!
%D289 !" 
"  2"2
 6 %
&"2!
%E2"!2 
A3B".2!  !
 2 "6 2   2
2 2,:  !
%&2 5" /2
! A9,B"
#F)#G%4! 6 !
! "C""%
810 4 
 !"289 
!&+   %
2!!2
2 "
 .%
"2! 89  "!
!72 %3
2!!7
 %
#F*==%% 2/"#G2'(#'%
#G*== %2/"#G2'(#'%
"
''<
6.5. Summary
2! ""89 !
"%4" . 
","91%%
&" 6" ,"91%52
!"5 2!!7" ,:
 %4/A&6R12#)-63B
"2!2!9R;2
2.%4"2
!"89  %
E62!  2!
%&  04,:29/!
2  &5+
"%D. 2 
 "2!!!"!
R<%'2N&8!O%4" 5
"%
42!! 6 %
4 !"
%
"2!."2!
!2 
C%
622!!!
%
''?
''@
7
Summary and Outlook
42!!!" 
7%,2!!".
 ! "%
1 !Q2!! 
2 C!%
7.1. Discussion
2!!" ."%
62!!6! 7*
L0 89 
!!.7"P
L0 0!P
:5 " 7%
7.1.1. Methodology Suitability
R'%#%$2N9.++9 O!
  .   % 1     2
! !     "2        
.      % & 2 ! !   2 !
89 5 ."%
22"2
2.!89 !*
0 &2!
"%.2"
9R@%R"8
''F
 @Selectable%  2
"" 
2""  %
0 +.!%
.2@Configurable2
!""@Configured@Variable@Parameter
%4.6A2B
 @Domain6!%
 0 & " .    @Con-
structible"%&  ""
"2
5%
.%02"@Parameter
%
.2"2
2 C22 
 .%
42R'%#%$%#2N9.&O2
6!*
Example 7.1. Modeling Customizable Products with OpenConfigurator Concepts
@Configurable
@Product
@Domain.Query
public class CustomizableProduct
{
private FixedArea regularPart;
private String regularAttribute;
@Required
@Configured
private ObligatoryElement constrainedConfiguredPart;
@Optional
@Variable
private OptionalElement variableAttribute;
@Parameter
@Max(100)
private int parametricAttribute;
@Configured
@TypeDomain({ SolutionA.class, SolutionB.class })
private Principle configuredAbstractTypedPart;
@Configured
private Service configuredPart;
@Configured
private Shape constructiblePart;
// ... getters & setters
}
, ""
''G
@Selectable
public abstract class Principle { ... }
public class SolutionA extends Principle { ... }
public class SolutionB extends Principle { ... }
@Constructible
public class Shape
{
@Configured
private Collection<Vertex> vertices;
// ... getters & setters
}
@Configured
public class Vertex
{
@Parameter
@Max(1000)
private int x, y;
// ... getters & setters
}
0 &"%89 
%4.AB
 "AB"" 
!@Product%
5"0 & 22
 %4" 
6"%
60 & 2"
2"@Required@Optional%
0 96 2 @Parame-
ter%,"25"
%
10 & C 
.%4
%022!=6
"2%,!"2
"%4"22
!"%
0 & @Configured%
$"0 96!@Constructible
%  
%42 %4"
Shape2! @Constructible%4
 2!%
!"2
 !2 %
9R@%R"8
'$(
"0 1"2)6
 %8!"6
%4289 5"%
"289 2.
 %
4!2 2.
 89 5%
7.1.2. Implementation Characterization
R$%$%$2N9 .O2!6"
.  %489 
 2! 2!!.! 
 %
 R@%#2N989 !, 169 
O! 6   89 5
6%E!"" 
 9R?2#$
 .%
8"0 -  )289 5
!"1'11'9
% 6"2 
6"% 2
2! "
. 2"62 
 6AB"%,2 2
!62  
6%-  
2!"2 
""%-" 
2!!89  " "
!%
0 -289 
!.!* 2!"
2! %0!22
!2 .%!
22" .%4
  2!!2
!&++ 2! 
%4" 2
! 04,:<2!! 
 ! !!2A !U
 B%D".2 "
%
9.
'$#
Figure 7.1. Classification of OpenConfigurator
within the Morphological Box for Configurators
9R@%R"8
'$'
0 &!R@%#%#2N, ""O2 
 2.89 
%! !"
 "%-  2
* 
7"I>
.'(##J%,22
 %E289 5!""
 "" " ! 2!"
I>.'(##J%62 
"7! 
%4  "%4!
 ! C" %D22
89 5%
0 E62!5
"89 2 !*"2!
 "2 2!
6"% 2
89 5!"
2!"!6.!
 .%
,2! """
. "" A"
2 B%
-  289 A""B
22 * 
 2!!   7"
"2 %2
 .2 
%42!2
!%4"
 ".622
!7    
% 25 !5&+ 
 2! %
4."89  6
"* 2A7B2A
7B6  %  
2!
%
-  "289 ""
 "%-"2!
*!25
5%0!2"2
 2"
6%02"2
%
  "
!AR@%'2N8OB%:
" 62
%0!2!
""" %4!"25
 D
'$$
"
"%
89 "
%4C!!%E2!
 2!22"
.%
-289 62 
%4  ."
"2!"@Product.Asset 
" %25"
!!"
 %42!
""2*"
2!@Product.Price%
0 "2!
%9"2H89 !H"2
.=!%,2
89 "
%-   2!
.22 "C2
"7%D""
2 5"
!%&2 C
!AR@%'2N8OB%
4.  "! 6
 !"89 
%,2"!%
D!!R@%'2N8O2"
  7 
89 !%
7.1.3. Strengths and Weaknesses
"2!!" !89 
 "%D5 !
6!%!!!
*
0  "8
9 %
#0 . !
 "%
0 !" "
%
8 !*2!
7%
9R@%R"8
'$;
7.1.3.1. Strengths
D   "*
Conceptualization
C  A  0 "2H3" /H*"
 / 2 "
 2  "%4!!
  !!6 / %
8C  2/22/33 /+&2
91"!2.%
4 "789 
!  "%
A0 4"
 %4"C
 /5 ""!%
4%D2  ,:
 ""2 
  "2 %
E2 ".
!66 !  5  
 !"%D  
""%
=A0 D
 2 "
* !  
"22 %
,2  ! 2
!  22
"%4!
2""  
 %
47 "" 
"%
10 8.C2
 "! " !"2
"!%,2! 
! !6AR;%;%;%#2N
OB%D !". 
 7"6 
C576"%
&2 " 
 !2%& 2"
22!
%
Technical
40 ,  !!C
%2!
 "2 !
 D
'$<
 2! "%&6
9R?2#$!%
4 " "
2"2 6 "%
$0 ,2! 2 2 
  "%/ "2
 3#%4!
2 2   /%
" 89 /2. 
 2%62! /' 
"  " 35
  ! %4289 !
"52!"
 %4!%
D89 27"5"
!%4"!%"2 
"2"C
!"%
Implementation
C0 489 ! %42
"%32!
5"%4
!/2" 
"%
97"289 ! "
2!  "2!
C%
5"A"0 2!
 2"9$2! "62"
"%
D ".! 
"6 %422
 "%
$0 "2! 89 5"
&+"""   
56"%
D2!"6 
/6"%2!
!%
#&%" -#
'*==!!!%C% =2/"''2'(#'%
$&%6-""C2R<%#%;2N96"C/33
A9BO%
9R@%R"8
'$?
7.1.3.2. Weaknesses
& 89 5 "
2" 2
!%D!6
7! %
Conceptualization
40 1 C"7 
 ! 
5C*  %D
 89 52
 "2 !
" H H
 %
2! "2%4"2
"6 2 %
!2! 2!
 2% %2 
!%
@%0 &" "
  2!"
%8  2   
2  2! %
D!" "2 H H
AB2! !" 
%62! 
 "  2"
"HHHH%42
! 2" [,:2
89 !%
Technical
80 8 "! 
/%D2!"2
  89 !26
" !  6%42
    "2 DXDX);
"2"%2!
%
E2! 2 
2"2!6%46
" ! 2"
2 %,2!2"
"   2
6%& ""8
9 2" 
"" A9B"2"
7%
:%0 489 
"722!
;&%>?%">?1
8
'$@
* ""
%2"%
0!2! *2"
 ""7%4!"
!%2 5!
  ""2 
  % 2% %2 
"!"=%D2
2
!%
Implementation
10 +"89 25
"" *"%D
.25"%! 6
" *
L0 4 ."%2
"%&2.
"%
L0 & 
 %
L0 622
H"H5
"%
L'&0 9"289 
5 29+<"
%42 5"
"%
+"22"! 2
7"2 ?%D
" 
2 %1"
 2"%
D! R@%'2
N8O%
)6 2! " 
! !"%4 2!
"%"2"!
C"! %
7.2. Outlook
"2!!89 
!%D!!
2" %
289  
 %D
.   %
<&%%
?R$%$%$%;2N9 9O2H8"="H%
9R@%R"8
'$F
4 !2!!*
50 R$%$%'2NO2! 62!
 %D"  9
R?2#$2"2"
"5"%42 7
2689 !
"%
0 ,2R$%$%$2N9 .O2!6
6 %R@%#%'2N
9.O2!.!  
 %4.!!5
 %
D2! 2
!*
L 1& 0 &"R@%#%$%'2ND
O2C 9+
 2!!"
 %D! R@%'%#2N9+=9
 O%
L@0  " 2.
 !
!%5""5 "
2!!"7 A+B
 %D! 2
"- I- '(#(J2R@%'%'2N- 
O%
L90 &6 "
.%3"  2
" "
I-'(#(J%
:5!%
7.2.1. CSP/Constraint Solver Integration
9  A9+B 
 A&B%  A9+B
 "!"@%49+
 !C"
C"F%
&.%/".$*-*/2!$
2-!%
&%&
5 5"
%
4 2
%4  9+A
@22I>#GG'J2I1b'((<J%
FI#GG@J2I#GGFJ2I/#GGGJ2I#GGGJ2I '((#J2I/'(('J2I&'(('J2I:'((<J2
I!'(##J%
- 
'$G
I-'((?2%<(JB%4"7 !"
9+2 AI4'((GJB%
1"2 9+"!*! 
2! 
%4""
%
0!2" ! AB
9+62A*I '((#J2I1!'((FJB*
L#0 2
!9+%
L#0  2
"""  5
%
D9+62%
%.%%/IE"#GGGJ-%
.-%/G62 
6%
&  "
"-I-'((?J%-" 
 2"
  %
89 " !
 %0!25! 
""%262
!"/9+H/-$$#*9+  &+H#(2!
 !!%4!"2 
%,2
289 !"
26  
/"%
7.2.2. Recommendation Integration
2-   2"
 2!"2
" "I- '(#(J%
 .##72-
" 
"  " %4
6  AH
H#'B
A%I'((?2%;<;@JB%&"26"
 ! 
%&"7%
D""2!
!""!A"2
G *==%!% =!=9VV]"V9+2   /" '$2
'(#'%
#(*==C% ==C=PW$$#2/"'$2'(#'%
##H.HI'((?2%#'J%
#'%I4#GG;2%;FJ
9R@%R"8
';(
&.%#$B2 "
!%42 - 2"
 !6"*2 7
""7 "%
12- 6
 2 62
"  !%4
 "7
"   %36*
L " 2!5
2
L  2"2
L .  2! 2% %2
5%
(2
2 26"
%-6
28B#;2 ! 
2%
489 !" "
%D 2
 "!27
- 5!A%I- '(#(2%F(2#<(#<'JB -9>
%,2!289 !!"
"%4" - 5
C%
7.3. Conclusion
+ ! 2
2 .%4 2 "
6!! 
%
4 "  
2 ". "%4
!   .
!2!  6
 %4 H89 H%
4 2!"..2!
 62! A9R'2
B%,2! 
2A9R$2B%4 
 72" "%
4 "9R;2
2.C%
2  
%4 C2!2
2%
#$*==!!!%.%=2&'<2'(#'%
#;"8B
9
';#
.2!*
#% 9.C     
%
'% !2 
"2"2 57%
97"2.2!
6  
%
42./2!/
2 2 *
L +AB
L +AB
L +9."A B
L +AB
L +-AB
1!9R$22!
!569R<2 
!"%4 !
 %4"2
2  2!
 %1  2
&+.26 *
A /+& "B
A 1B%
D"29R?2#$2!!
!.!"
 .%
D289  " "
. 2 "2"6
"!"%32"  !"
"2  "%
489 !A"B
! %"2!
2
*!5!22
" %89  
6"2."6"%
';'
';$
A
Constraints
4"89 6!  %
&6R&%R9
';;
Table A.1. Logical/Arithmetical Comparison Constraints

8
@23 $ !"
@Equals a.equals(b) a7b%@Equals(value="#{_this.b}",
condition="#{_this.unicolor}")
Color a;
Color b;
boolean unicolor;
@NotEquals not a.equals(b) a7b%@NotEquals("#{_this.b}")
Color a;
Color b;
@Min a >= b a7 
b%
@Min("#{_this.b}")
int a;
int b;
@Max a =< b a7
b%
@Max("10")
int a;
';<
Table A.2. Cardinality Constraints
8 @23 $ !"
@Cardinality |a| == b .a7b%@Cardinality(5)
Collection<Item> items;
@Cardinality.Min |a| >= b .a7 
b%
@Cardinality.Min(1)
Collection<Item> items;
@Cardinality.Max |a| =< b .a7
b%
@Cardinality.Max("#{_this.available}")
Collection<Item> items;
int available;
@Optional |a| >= 0 3"2
""
%
E"2
!!"
""%
@Optional
Collection<Equipment> equipment;
@Required |a| >= 12%%a != null 32"
%
@Required
Frame frame;
&6R&%R9
';?
Table A.3. Compatibility Constraints
8 @2
3
$ !"
@Compatible.Type typeOf(a) = b 4"b "
a%
!2a5"b
"%
,!
6%
8" CompatiblePart 
    % Part 
IncompatiblePart%
class Part { ... }
class CompatiblePart extends Part { ... }
class IncompatiblePart extends Part { ... }
class Product
{
@Compatible
.Type(CompatiblePart.class)
Part part;
}
@Compatible.
ElementType all e in a:
typeOf(e) = b ea2"b
 "e%
!2ea"b
"%
,!
6%
8" CompatiblePart 
%Part
IncompatiblePart%
class Part { ... }
class CompatiblePart extends Part { ... }
class IncompatiblePart extends Part { ... }
class Product
{
@Compatible
.ElementType(CompatiblePart.class)
Collection<Part> parts;
}
';@
8 @2
3
$ !"
@Compatible. Matches condition(a) =
true acondition%a
H_Hcondition%
MatchingPart  
    %
NotMatchingPart 
%
class Part {
abstract boolean matches(); }
class MatchingPart extends Part {
boolean matches() { return true; } }
class NotMatchingPart extends Part {
boolean matches() { return false; } }
class Product
{
@Compatible.Matches("#{_.matches()}")
Part part;
}
...
@Compatible.
ElementMatches all e in a:
condition(e) =
true
ea2
econdition%4
e
H_currentHcondition%4
aH_H%
MatchingPart  
    %
NotMatchingPart 
%
...
class Product
{
@Compatible
.ElementMatches("#{_.matches()}")
Collection<Part> parts;
}
&6R&%R9
';F
Table A.4. Incompatibility Constraints
8 @2
3
$ !"
@Incomaptible.
TypeNot typeOf(a) not b 4"b "
a%
!2a5"b"
"%
,!
6%
class Part { abstract boolean matches(); }
class MatchingPart extends Part {
boolean matches() { return true; } }
class IncompatiblePart extends Part {
boolean matches() { return false; } }
class Product {
@Incompatible.TypeNot(IncompatiblePart.class)
Part part;
}
@Incompatible.
ElementTypeNot all e in a:
typeOf(e) not b ea2"b
 "e%
!2ea
"b""%
,!
6%
class Product {
@Incompatible
.ElementTypeNot(
IncompatiblePart.class)
Collection<Part> parts;
}
@Incompatible.
MatchesNot not condition(a)
= true acondition%
aH_H
condition%
class Product {
@Incompatible
.MatchesNot(
"#{_.matches()}")
Part part;
}
@Incompatible.
ElementMatchesNot all e in a: not
condition(e) =
true
ea2
econdition%4
e
H_currentHcondition%4
aH_H
class Product {
@Incompatible
.ElementMatchesNot(
"#{_.matches()}")
Collection<Part> parts;
}
';G
Table A.5. Complex Constraints
8 @23 $ !"
@Satisfies eval(script) = true 1%&
 value
true%
@Satisfies("#{_this.x < _this.y}")
class Product {
int x;
int y;
}
@Relational exists(a, R) 1%&
aR%
@Selectable
@Relational
@Domain.Query
class Product {
int x;
int y;
}
'<(
'<#
B
Example Domain Model: Bike
B.1. Component Specifications
46#6
9R?2#$%
#4"""%2*==!!!%"%=2
/"#F2'(#'%
&6R1%R36,*1
'<'
9
'<$
B.2. Source Code
Class Bike
package example;
import java.math.BigDecimal;
import java.util.Collection;
import configurator.configuration.annotation.Calculated;
import configurator.configuration.annotation.Configurable;
import configurator.product.annotation.Product;
import configurator.product.annotation.Product.Asset;
import configurator.product.annotation.Product.Attribute;
import configurator.product.annotation.Product.Price;
import configurator.validation.annotation.Optional;
import configurator.validation.annotation.Required;
@Configurable
@Product
public abstract class Bike
{
private Frame frame;
private Gearing gearing;
private Brake brake;
private CranksPedals cranksPedals;
private StemHandlebar stemHandlebar;
private Wheels wheels;
private SeatpostSaddle seatpostSaddle;
private Collection<Equipment> equipment;
private int weight;
private byte[] image;
private BigDecimal price;
@Required
public Frame getFrame()
{
return frame;
}
public void setFrame(Frame frame)
{
this.frame = frame;
}
@Required
public Gearing getGearing()
{
return gearing;
}
public void setGearing(Gearing gearing)
{
this.gearing = gearing;
}
@Required
public Brake getBrake()
{
return brake;
}
&6R1%R36,*1
'<;
public void setBrake(Brake brake)
{
this.brake = brake;
}
@Required
public CranksPedals getCranksPedals()
{
return cranksPedals;
}
public void setCranksPedals(CranksPedals cranksPedals)
{
this.cranksPedals = cranksPedals;
}
@Required
public StemHandlebar getStemHandlebar()
{
return stemHandlebar;
}
public void setStemHandlebar(StemHandlebar stemHandlebar)
{
this.stemHandlebar = stemHandlebar;
}
@Required
public Wheels getWheels()
{
return wheels;
}
public void setWheels(Wheels wheels)
{
this.wheels = wheels;
}
@Required
public SeatpostSaddle getSeatpostSaddle()
{
return seatpostSaddle;
}
public void setSeatpostSaddle(SeatpostSaddle seatpostSaddle)
{
this.seatpostSaddle = seatpostSaddle;
}
@Optional
public Collection<Equipment> getEquipment()
{
return equipment;
}
public void setEquipment(Collection<Equipment> equipment)
{
this.equipment = equipment;
}
@Calculated
@Product.Attribute(level = Attribute.STANDARD)
public int getWeight()
9
'<<
{
return weight;
}
@Asset
public byte[] getImage()
{
return image;
}
@Price
public BigDecimal getPrice()
{
return price;
}
}
Class Brake
package example;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import configurator.configuration.annotation.Selectable;
import configurator.configuration.annotation.Variable;
import configurator.data.annotation.Default;
import configurator.data.annotation.Domain;
import configurator.model.annotation.Ignore;
import configurator.product.annotation.Product.Description;
import configurator.product.annotation.Product.Price;
import configurator.validation.annotation.Relational;
@Relational
@Domain.Query
@Default.Query("select b from Brake b where b.type = 'V_BRAKE'")
@Selectable
@Entity
public class Brake
{
public static enum Type
{
V_BRAKE,
DISC_BRAKE
}
private long id;
private String description;
private Brake.Type type;
private BigDecimal price;
@Ignore
@Id
@GeneratedValue
public long getId()
{
return id;
}
&6R1%R36,*1
'<?
@Description
public String getDescription()
{
return description;
}
@Variable
public Brake.Type getType()
{
return type;
}
public void setType(Brake.Type type)
{
this.type = type;
}
@Price
public BigDecimal getPrice()
{
return price;
}
}
Class Carrier
package example;
public class Carrier extends Equipment
{
}
Class CityBike
package example;
import configurator.configuration.annotation.Configurable;
import configurator.product.annotation.Product;
@Configurable
@Product
@Product.Name("City Bike")
public class CityBike extends Bike
{
}
Class CranksPedals
package example;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import configurator.configuration.annotation.Selectable;
import configurator.configuration.annotation.Variable;
import configurator.data.annotation.Default;
import configurator.data.annotation.Domain;
import configurator.model.annotation.Ignore;
9
'<@
import configurator.product.annotation.Product.Description;
import configurator.product.annotation.Product.Price;
import configurator.validation.annotation.Relational;
@Relational
@Domain.Query
@Default.Query("select c from CranksPedals c where c.type = 'Regular'")
@Selectable
@Entity
public class CranksPedals
{
public static enum Type
{
Classic,
Regular,
Deluxe
}
private long id;
private String description;
private CranksPedals.Type type;
private BigDecimal price;
@Ignore
@Id
@GeneratedValue
public long getId()
{
return id;
}
@Description
public String getDescription()
{
return description;
}
@Variable
public CranksPedals.Type getType()
{
return type;
}
public void setType(CranksPedals.Type type)
{
this.type = type;
}
@Price
public BigDecimal getPrice()
{
return price;
}
}
Class ElectroBike
package example;
import configurator.configuration.annotation.Configurable;
import configurator.product.annotation.Product;
import configurator.validation.annotation.Required;
&6R1%R36,*1
'<F
@Configurable
@Product
@Product.Name("Electro Bike")
public class ElectroBike extends CityBike
{
private MotorBattery motorBattery;
@Required
public MotorBattery getMotorBattery()
{
return motorBattery;
}
public void setMotorBattery(MotorBattery motorBattery)
{
this.motorBattery = motorBattery;
}
}
Class Equipment
package example;
import java.math.BigDecimal;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.MappedSuperclass;
import configurator.configuration.annotation.Selectable;
import configurator.data.annotation.Domain;
import configurator.model.annotation.Ignore;
import configurator.product.annotation.Product.Description;
import configurator.product.annotation.Product.Price;
import configurator.validation.annotation.Relational;
@Relational
@Domain.Query
@Selectable
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Equipment
{
private long id;
private String description;
private BigDecimal price;
@Ignore
@Id
@GeneratedValue
public long getId()
{
return id;
}
@Description
public String getDescription()
{
return description;
9
'<G
}
@Price
public BigDecimal getPrice()
{
return price;
}
}
Class Frame
package example;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
import javax.validation.constraints.Size;
import configurator.configuration.annotation.Calculated;
import configurator.configuration.annotation.Configurable;
import configurator.configuration.annotation.Parameter;
import configurator.configuration.annotation.Variable;
import configurator.data.annotation.Default;
import configurator.data.annotation.Domain;
import configurator.model.annotation.Ignore;
import configurator.product.annotation.Product.Description;
import configurator.product.annotation.Product.Price;
import configurator.validation.annotation.Optional;
import configurator.validation.annotation.Relational;
import configurator.validation.annotation.Required;
@Relational(properties = { "description", "material", "price" })
@Domain.Query
@Configurable
@Entity
public class Frame
{
public static enum Material
{
Titanium,
Aluminum
}
public static enum Color
{
Gold,
Silver,
Black,
White,
Red,
Blue
}
public static enum Geometry
{
XS(16),
S(18),
M(20),
&6R1%R36,*1
'?(
L(22);
private int size;
private Geometry(int size)
{
this.size = size;
}
public int getSize()
{
return size;
}
}
private long id;
private String description;
private Frame.Material material;
private Frame.Color color;
private Frame.Geometry geometry;
private String label;
private BigDecimal price;
@Ignore
@Id
@GeneratedValue
public long getId()
{
return id;
}
@Description
public String getDescription()
{
return description;
}
@Required
@Variable
@Default("Aluminum")
public Frame.Material getMaterial()
{
return material;
}
public void setMaterial(Frame.Material material)
{
this.material = material;
}
@Transient
@Required
@Variable
@Default("Black")
public Frame.Color getColor()
{
return color;
}
public void setColor(Frame.Color color)
{
this.color = color;
}
9
'?#
@Transient
@Required
@Variable
@Default("M")
public Frame.Geometry getGeometry()
{
return geometry;
}
public void setGeometry(Frame.Geometry geometry)
{
this.geometry = geometry;
}
@Transient
@Size(max = 24)
@Calculated
public int getSize()
{
if (geometry != null)
return geometry.size;
return 0;
}
@Transient
@Optional
@Parameter
@Default("MyBike")
public String getLabel()
{
return label;
}
public void setLabel(String label)
{
this.label = label;
}
@Price
public BigDecimal getPrice()
{
return price;
}
}
Class Gearing
package example;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import configurator.configuration.annotation.Selectable;
import configurator.configuration.annotation.Variable;
import configurator.data.annotation.Default;
import configurator.data.annotation.Domain;
import configurator.model.annotation.Ignore;
&6R1%R36,*1
'?'
import configurator.product.annotation.Product.Description;
import configurator.product.annotation.Product.Price;
import configurator.validation.annotation.Max;
import configurator.validation.annotation.Min;
import configurator.validation.annotation.Relational;
@Relational
@Domain.Query
@Default.Query("select g from Gearing g where g.type = 'HubGear' and g.gears = 7")
@Selectable
@Entity
public class Gearing
{
public static enum Type
{
SingleSpeed,
HubGear
}
private long id;
private String description;
private Gearing.Type type;
private int gears;
private BigDecimal price;
@Ignore
@Id
@GeneratedValue
public long getId()
{
return id;
}
@Description
public String getDescription()
{
return description;
}
@Variable
public Gearing.Type getType()
{
return type;
}
public void setType(Gearing.Type type)
{
this.type = type;
}
@Max(value = "1", condition="#{_this.type == 'SingleSpeed'}")
@Min(value = "2", condition="#{_this.type == 'HubGear'}")
@Variable
public int getGears()
{
return gears;
}
public void setGears(int gears)
{
this.gears = gears;
}
9
'?$
@Price
public BigDecimal getPrice()
{
return price;
}
}
Class Light
package example;
public class Light extends Equipment
{
}
Class MotorBattery
package example;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import configurator.configuration.annotation.Selectable;
import configurator.configuration.annotation.Variable;
import configurator.data.annotation.Domain;
import configurator.model.annotation.Ignore;
import configurator.product.annotation.Product.Description;
import configurator.product.annotation.Product.Price;
import configurator.validation.annotation.Relational;
@Relational
@Domain.Query
@Selectable
@Entity
public class MotorBattery
{
private long id;
private String description;
private int power;
private String battery;
private int maximumSpeed;
private String range;
private int weight;
private BigDecimal price;
@Ignore
@Id
@GeneratedValue
public long getId()
{
return id;
}
@Description
public String getDescription()
{
return description;
}
&6R1%R36,*1
'?;
@Variable
public int getPower()
{
return power;
}
public void setPower(int power)
{
this.power = power;
}
@Variable
public String getBattery()
{
return battery;
}
public void setBattery(String battery)
{
this.battery = battery;
}
@Variable
public int getMaximumSpeed()
{
return maximumSpeed;
}
public void setMaximumSpeed(int maximumSpeed)
{
this.maximumSpeed = maximumSpeed;
}
@Variable
public String getRange()
{
return range;
}
public void setRange(String range)
{
this.range = range;
}
public int getWeight()
{
return weight;
}
public void setWeight(int weight)
{
this.weight = weight;
}
@Price
public BigDecimal getPrice()
{
return price;
}
}
9
'?<
Class MountainBike
package example;
import configurator.configuration.annotation.Configurable;
import configurator.data.annotation.Default;
import configurator.product.annotation.Product;
@Configurable
@Product
@Product.Name("Mountain Bike")
public class MountainBike extends Bike
{
@Default.Query("select w from Wheels w where w.type = 'Cross'")
public Wheels getWheels()
{
return super.getWheels();
}
}
Class Mudguards
package example;
public class Mudguards extends Equipment
{
}
Class RacingBike
package example;
import configurator.data.annotation.Default;
import configurator.product.annotation.Product;
@Product.Name("Racing Bike")
public class RacingBike extends Bike
{
@Default.Query("select w from Wheels w where w.type = 'Race'")
public Wheels getWheels()
{
return super.getWheels();
}
}
Class SeatpostSaddle
package example;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import configurator.configuration.annotation.Selectable;
import configurator.configuration.annotation.Variable;
import configurator.data.annotation.Default;
import configurator.data.annotation.Domain;
import configurator.model.annotation.Ignore;
import configurator.product.annotation.Product.Description;
import configurator.product.annotation.Product.Price;
&6R1%R36,*1
'??
import configurator.validation.annotation.Relational;
@Relational
@Domain.Query
@Default.Query("select s from SeatpostSaddle s " +
"where s.type = 'Regular' and s.color = 'Black'")
@Selectable
@Entity
public class SeatpostSaddle
{
public static enum Type
{
Regular,
Trekking,
Race
}
public static enum Color
{
Brown,
Black
}
private long id;
private String description;
private Type type;
private String material;
private Color color;
private BigDecimal price;
@Ignore
@Id
@GeneratedValue
public long getId()
{
return id;
}
@Description
public String getDescription()
{
return description;
}
@Variable
public SeatpostSaddle.Type getType()
{
return type;
}
public void setType(SeatpostSaddle.Type type)
{
this.type = type;
}
@Variable
public String getMaterial()
{
return material;
}
public void setMaterial(String material)
{
9
'?@
this.material = material;
}
@Variable
public Color getColor()
{
return color;
}
public void setColor(Color color)
{
this.color = color;
}
@Price
public BigDecimal getPrice()
{
return price;
}
}
Class StemHandlebar
package example;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import configurator.configuration.annotation.Selectable;
import configurator.configuration.annotation.Variable;
import configurator.data.annotation.Default;
import configurator.data.annotation.Domain;
import configurator.model.annotation.Ignore;
import configurator.product.annotation.Product.Description;
import configurator.product.annotation.Product.Price;
import configurator.validation.annotation.Relational;
@Relational
@Domain.Query
@Default.Query("select s from StemHandlebar s where s.type = 'Regular'")
@Selectable
@Entity
public class StemHandlebar
{
public static enum Type
{
Classic,
Regular,
Sportive
}
private long id;
private String description;
private Type type;
private BigDecimal price;
@Ignore
@Id
@GeneratedValue
&6R1%R36,*1
'?F
public long getId()
{
return id;
}
@Description
public String getDescription()
{
return description;
}
@Variable
public StemHandlebar.Type getType()
{
return type;
}
public void setType(StemHandlebar.Type type)
{
this.type = type;
}
@Price
public BigDecimal getPrice()
{
return price;
}
}
Class Wheels
package example;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import configurator.configuration.annotation.Selectable;
import configurator.configuration.annotation.Variable;
import configurator.data.annotation.Default;
import configurator.data.annotation.Domain;
import configurator.model.annotation.Ignore;
import configurator.product.annotation.Product.Description;
import configurator.product.annotation.Product.Price;
import configurator.validation.annotation.Relational;
@Relational
@Domain.Query
@Default.Query("select w from Wheels w where w.type = 'Urban'")
@Selectable
@Entity
public class Wheels
{
public static enum Type
{
Urban,
Cross,
Race
}
private long id;
9
'?G
private String description;
private Type type;
private BigDecimal price;
@Ignore
@Id
@GeneratedValue
public long getId()
{
return id;
}
@Description
public String getDescription()
{
return description;
}
@Variable
public Wheels.Type getType()
{
return type;
}
public void setType(Wheels.Type type)
{
this.type = type;
}
@Price
public BigDecimal getPrice()
{
return price;
}
}
'@(
'@#
C
OpenConfigurator API/SPI
Interface OpenConfigurator
package configurator;
public interface OpenConfigurator
{
/**
* TODO emit BootstrapImplementor event TODO emit
* ConfiguratorImplementor event
*/
public Configurator initialize();
}
Interface Bootstrap
package configurator.bootstrap;
import configurator.Configurator;
import configurator.spi.Initialization;
/**
* Bootstraps the configurator instance. The bootstrap sequence:
* <ol>
* <li>invoke {@link #initialize()}</li>
* <li>obtain {@link Configurator} instance by calling
* {@link #getConfigurator()}</li>
* </ol>
*/
public interface Bootstrap
{
/**
* Triggers initialization of a configurator instance. Emits a
* {@link Configurator} {@link Initialization} event.
*/
void initialize() throws BootstrapException;
/**
&6R9%R89 &+=+
'@'
* Obtain the initialized configurator instance.
*/
Configurator getConfigurator();
}
Interface Configurator
package configurator;
import configurator.model.Configuration;
/**
* The main entry point to the configurator API. Allows to create
* configuration sessions. TODO emit events: @Preparation
* ConfigurationSessionImplementor, @Preparation
* Component/Attribute/Part, @Initialization Component/Attribute/Part,
* @Initialization ConfigurationSessionImplementor
*/
public interface Configurator
{
<T> ConfigurationSession<T> createSession(Class<T> componentType);
<T> ConfigurationSession<T> restoreSession(
Configuration<T> configuration);
}
Interface ConfigurationSession
package configurator;
import java.io.Serializable;
import configurator.model.Configuration;
import configurator.task.Agenda;
/**
* (c) 2012 Copyright by Vivian Steller
*/
/**
* Manages the runtime state of a configuration.
*
* @author Vivian Steller
* @since 1.0
*/
public interface ConfigurationSession<T> extends Serializable
{
Class<T> getConfiguredType();
Configuration<T> getConfiguration();
Agenda<T> getAgenda();
void store(String id);
void load(String id);
void restore(Configuration<T> configuration);
void restore(T instance);
void submit();
void close();
'@$
}
Interface Configuration
package configurator.model;
/**
* TODO rename to Model<T>
*/
public interface Configuration<T>
{
/*
* Allows traversal of the configuration.
*/
Component<T> getRootComponent();
/*
* Validates the configuration.
*/
boolean isValid();
/*
* Whether all components, attributes and parts contained within the
* configuration have been specified.
*/
boolean isComplete();
/*
* Allows accessing the underlying configured object.
*/
T getValue();
}
Interface Element
package configurator.model;
public interface Element<T>
{
Component<?> getParent();
T getValue();
void setValue(T value);
}
Interface Component
package configurator.model;
import java.util.Collection;
import configurator.event.Events;
import configurator.event.Listener;
import configurator.metadata.ComponentDescriptor;
/**
* Represents a component of type <code>C</code>. This interface allows
* you to generically manage instances of JavaBean style classes.
* Implementations automatically take care of instantiation, state as
* well as dynamic type changes.<br/>
* <br/>
* While <code>C</code> is considered the base type for this component's
* value, the actual value can have any subtype of <code>C</code>. See
&6R9%R89 &+=+
'@;
* {@link #getType()} for more information.<br/>
* <br/>
* Additionally, the interface supports registering of observers for
* various events that indicate changes to the component's state.<br/>
* <br/>
* Implementations of this class do <i>not</i> have to be implemented
* thread-safe but serializable.<br/>
* <br/>
* <i>Modeling note: methods are designed to be idempotent</i>
*
* @param <C>
* type represented by this component
*/
public interface Component<C> extends VariableTyped<C>, Facetted,
Element<C>
{
/**
* Descriptor containing metadata about the current component's type
* (returned by {@link #getType()}). As the component's type can
* dynamically change at runtime, also the descriptor returned by
* this method varies. However, the descriptor always reflects the
* currently set type of this component which may be any subtype of
* <code>C</code>.<br/>
* <br/>
* The returned {@link ComponentDescriptor} is <i>immutable</i>.
*
* @param <T>
* type corresponding to the value's current type
* (returned by {@link #getType()})
* @return the {@link ComponentDescriptor} associated to the current
* type
*/
<T extends C> ComponentDescriptor<T> getMetadata();
/**
* Gets the base type of the value managed by this component.
*
* @return the component value's base type
*/
Class<C> getBaseType();
/**
* Gets the current type of the value managed by this component.
*
* @param <T>
* the value's current type
* @return the component value's current type
* @see #setType(Class)
*/
<T extends C> Class<T> getType();
/**
* Sets the type of the value managed by this component. The passed
* type must be a subclass of this component's base type
* <code>C</code> and may be declared abstract.<br/>
* <br/>
* The component supports switching between any type for that the
* rules above apply. Especially these type changes are supported:
* <ul>
* <li><i>down the type hierarchy</i>: setting the type to a subtype
* of the component's current type (returned by {@link #getType()})</li>
* <li><i>up the type hierarchy</i>: setting the type to a supertype
* of the component's current type (returned by {@link #getType()})
'@<
* as long as the supertype is a subtype of the base type
* <code>C</code></li>
* <li><i>horizontally in the type hierarchy</i>: setting the type
* to another subtype of the component's base type which is not
* necessarily a subtype or supertype of the component value's
* current type (returned by {@link #getType()})</li>
* </ul>
* The component dynamically adds or removes attributes and parts
* from the component depending on the type change. Further, upon a
* type change the {@link #getMetadata()} method returns the
* descriptor of the newly set type so that the new type is
* reflected.<br/>
* <br/>
* Calling this method triggers the following events:
* {@link TypeChanged}, {@link Changed}
*
* @param <T>
* the value's type to set
* @param type
* the type of the component's value to set
*/
<T extends C> void setType(Class<T> type);
/**
* Whether the current component's type is instantiatable or
* abstract.
*
* @return <code>true</code> if the current type is abstract
* (non-instantiatable)
*/
boolean isAbstract();
/**
* Whether the component is instantiated or not. Instantiated means
* that the component manages an underlying bean instance of type
* <code>C</code> (or a subtype thereof).
*
* @return <code>true</code> if the component is instantiated
* @see #getValue()
* @see #setValue(Object)
*/
boolean isInstantiated();
/**
* Whether the user did specify any property value of this component
* or any of it's sub-components (parts). This method basically
* returns <code>true</code> if any <code>set*</code>-method, such
* as {@link #setAttributeValue(String, Object)},
* {@link #setPartValue(String, Object)}, {@link #setValue(Object)}
* or {@link #setType(Class)} has been invoked.
*
* @return <code>true</code> if the user specified any of this
* component's properties
*/
boolean isSpecified();
/**
* Accesses the instance managed by this component. The bean might
* have been automatically instantiated during the configuration
* process or alternatively must have been explicitly set by the
* user using the {@link #setValue(Object)} method.
*
* @return the underlying bean instance or <code>null</code> if the
&6R9%R89 &+=+
'@?
* component has not been instantiated yet
* @see #setValue(Object)
*/
C getValue();
/**
* Explicitly sets the underlying bean instance. The component's
* attributes and parts are populated with the given value in order
* to reflect the bean instance's state.<br/>
* <br/>
* Calling this method triggers the following events if changes to
* the component's current state are detected: {@link ValueChanged},
* {@link TypeChanged}, {@link Changed}
*
* @param value
* the value to populate this component with
*/
void setValue(C value);
/**
* If this component is a part of another component this method
* returns the containing component otherwise <code>null</code>.
*
* @return the component containing this component if present,
* otherwise <code>null</code>
*/
Component<?> getParent();
/**
* Resets the component's state. The component's type is reset to
* the base type <code>C</code>. The managed instance is set to
* <code>null</code>.<br/>
* <br/>
* Calling this method triggers the following events: {@link Reset},
* {@link Changed}
*/
void reset();
// F A C E T S
/**
* Checks whether the given facet type is defined for the component.
*
* @param facetType
* the facet type to check availability for
* @return <code>true</code> if the component can be viewed as the
* given facet type
*/
boolean hasFacet(Class<?> facetType);
/**
* Obtains the facet view of the given type for this component. The
* returned facet <b>must be</b> cached by the implementation so
* that multiple invocations to this method always return the same
* instance.
*
* @param facetType
* the type of the facet
* @return the component as facet of the given type
*/
<F> F getFacet(Class<F> facetType);
// A T T R I B U T E S
'@@
/**
* Gets the (singular and plural) attributes of this component. The
* attributes returned correspond to the ones that are defined by
* the component's current type (returned by {@link #getType()}).<br/>
* <br/>
* The returned collection is <i>unmodifiable</i>.
*
* @return the attributes of the component
*/
Collection<Attribute<C, ?>> getAttributes();
/**
* Gets a specific (singular or plural) attribute of this component.
* If the component's current type (returned by {@link #getType()})
* doesn't contain the specified attribute an exception is thrown.
*
* @param <A>
* the type of the attribute's value
* @param attributeName
* the name of the attribute to retrieve (may denote a
* singular or plural attribute)
* @return the attribute with the given name
* @throws ModelException
* if the component's type doesn't contain an attribute
* with the given name
*/
<A> Attribute<C, A> getAttribute(String attributeName)
throws ModelException;
/**
* Gets the value of a specific singular attribute of this
* component. If the component's current type (returned by
* {@link #getType()}) doesn't contain the specified attribute or
* the given attribute name doesn't denote a singular attribute an
* exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getAttribute(attributeName).getValue()
* </code>
*
* @param <A>
* the type of the attribute's value
* @param attributeName
* the name of the attribute whose value to retrieve
* (must denote a singular attribute)
* @return the named attribute's value
* @throws ModelException
* if the component's type doesn't contain a singular
* attribute with the given name
* @see SingularAttribute#getValue()
*/
<A> A getAttributeValue(String attributeName) throws ModelException;
/**
* Sets the value of a specific singular attribute of this
* component. If the component's current type (returned by
* {@link #getType()}) doesn't contain the specified attribute or
* the given attribute name doesn't denote a singular attribute an
* exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getAttribute(attributeName).setValue(value)
&6R9%R89 &+=+
'@F
* </code>
*
* @param <A>
* the type of the attribute's value
* @param attributeName
* the name of the attribute whose value to retrieve
* (must denote a singular attribute)
* @throws ModelException
* if the component's type doesn't contain a singular
* attribute with the given name
* @see SingularAttribute#setValue(Object)
*/
<A> void setAttributeValue(String attributeName, A value)
throws ModelException;
/**
* Gets the values of a specific plural attribute of this component.
* If the component's current type (returned by {@link #getType()})
* doesn't contain the specified attribute or the given attribute
* name doesn't denote a plural attribute an exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getAttribute(attributeName).getValue()
* </code>
*
* @param <A>
* the type of the attribute's value
* @param attributeName
* the name of the attribute whose value to retrieve
* (must denote a plural attribute)
* @return the named attribute's values
* @throws ModelException
* if the component's type doesn't contain a plural
* attribute with the given name
* @see PluralAttribute#getValue()
*/
<A> Collection<A> getAttributeValues(String pluralAttributeName)
throws ModelException;
/**
* Sets the values of a specific plural attribute of this component.
* If the component's current type (returned by {@link #getType()})
* doesn't contain the specified attribute or the given attribute
* name doesn't denote a plural attribute an exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getAttribute(attributeName).setValue(value)
* </code>
*
* @param <A>
* the type of the attribute's value
* @param attributeName
* the name of the attribute whose value to retrieve
* (must denote a plural attribute)
* @throws ModelException
* if the component's type doesn't contain a plural
* attribute with the given name
* @see PluralAttribute#setValue(Object)
*/
<A> void setAttributeValues(String pluralAttributeName,
Collection<A> values) throws ModelException;
/**
'@G
* Resets a specific (singular or plural) attribute of this
* component. If the component's current type (returned by
* {@link #getType()}) doesn't contain the specified attribute an
* exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getAttribute(attributeName).reset()
* </code>
*
* @param attributeName
* the name of the attribute to reset (may denote a
* singular or plural attribute)
* @throws ModelException
* if the component's type doesn't contain an attribute
* with the given name
* @see Attribute#reset()
*/
void resetAttribute(String attributeName) throws ModelException;
// P A R T S
/**
* Gets the (singular and plural) parts of this component. The parts
* returned correspond to the ones that are defined by the
* component's current type (returned by {@link #getType()}).<br/>
* <br/>
* The returned collection is <i>unmodifiable</i>.
*
* @return the parts of the component
*/
Collection<Part<C, ?>> getParts();
/**
* Gets a specific (singular or plural) part of this component. If
* the component's current type (returned by {@link #getType()})
* doesn't contain the specified part an exception is thrown.
*
* @param <P>
* the type of the part's value
* @param partName
* the name of the part to retrieve (may denote a
* singular or plural part)
* @return the part with the given name
* @throws ModelException
* if the component's type doesn't contain an part with
* the given name
*/
<P> Part<C, P> getPart(String partName) throws ModelException;
/**
* Gets the referenced component of a specific singular part of this
* component. If the component's current type (returned by
* {@link #getType()}) doesn't contain the specified part or the
* given part name doesn't denote a singular part an exception is
* thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* ((SingularPart) this.getPart(partName)).getPartComponent()
* </code>
*
* @param <P>
* the type of the part's value
* @param partName
&6R9%R89 &+=+
'F(
* the name of the part whose component to retrieve (must
* denote a singular part)
* @return the named part's referenced component
* @throws ModelException
* if the component's type doesn't contain a singular
* part with the given name
* @see SingularPart#getPartComponent()
*/
<P> Component<P> getPartComponent(String partName)
throws ModelException;
/**
* Gets the value of a specific singular part of this component. If
* the component's current type (returned by {@link #getType()})
* doesn't contain the specified part or the given part name doesn't
* denote a singular part an exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getPart(partName).getValue()
* </code>
*
* @param <P>
* the type of the part's value
* @param partName
* the name of the part whose value to retrieve (must
* denote a singular part)
* @return the named part's value
* @throws ModelException
* if the component's type doesn't contain a singular
* part with the given name
* @see SingularPart#getValue()
*/
<P> P getPartValue(String partName) throws ModelException;
/**
* Sets the value of a specific singular part of this component. If
* the component's current type (returned by {@link #getType()})
* doesn't contain the specified part or the given part name doesn't
* denote a singular part an exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getPart(partName).setValue(value)
* </code>
*
* @param <P>
* the type of the part's value
* @param partName
* the name of the part whose value to retrieve (must
* denote a singular part)
* @throws ModelException
* if the component's type doesn't contain a singular
* part with the given name
* @see SingularPart#setValue(Object)
*/
<P> void setPartValue(String partName, P value)
throws ModelException;
/**
* Gets the referenced components of a specific plural part of this
* component. If the component's current type (returned by
* {@link #getType()}) doesn't contain the specified part or the
* given part name doesn't denote a plural part an exception is
* thrown.<br/>
'F#
* <br/>
* This method is a shortcut for: <code>
* ((PluralPart) this.getPart(partName)).getPartComponents()
* </code>
*
* @param <E>
* the type of the part's collection elements
* @param partName
* the name of the part whose component to retrieve (must
* denote a plural part)
* @return the named part's referenced components
* @throws ModelException
* if the component's type doesn't contain a plural part
* with the given name
* @see PluralPart#getPartComponents()
*/
<E> Collection<Component<E>>
getPartComponents(String pluralPartName)
throws ModelException;
/**
* Gets the values of a specific plural part of this component. If
* the component's current type (returned by {@link #getType()})
* doesn't contain the specified part or the given part name doesn't
* denote a plural part an exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getPart(partName).getValue()
* </code>
*
* @param <E>
* the type of the part's collection elements
* @param partName
* the name of the part whose value to retrieve (must
* denote a plural part)
* @return the named part's values
* @throws ModelException
* if the component's type doesn't contain a plural part
* with the given name
* @see PluralPart#getValue()
*/
<E> Collection<E> getPartValues(String pluralPartName)
throws ModelException; // shortcut
// for
// getPart(partName).getValue()
/**
* Sets the values of a specific plural part of this component. If
* the component's current type (returned by {@link #getType()})
* doesn't contain the specified part or the given part name doesn't
* denote a plural part an exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getPart(partName).setValue(value)
* </code>
*
* @param <E>
* the type of the part's collection elements
* @param partName
* the name of the part whose value to retrieve (must
* denote a plural part)
* @throws ModelException
* if the component's type doesn't contain a plural part
&6R9%R89 &+=+
'F'
* with the given name
* @see PluralPart#setValue(Object)
*/
<E> void setPartValues(String pluralPartName, Collection<E> values)
throws ModelException;
/**
* Resets a specific (singular or plural) part of this component. If
* the component's current type (returned by {@link #getType()})
* doesn't contain the specified part an exception is thrown.<br/>
* <br/>
* This method is a shortcut for: <code>
* this.getPart(partName).reset()
* </code>
*
* @param partName
* the name of the part to reset (may denote a singular
* or plural part)
* @throws ModelException
* if the component's type doesn't contain an part with
* the given name
* @see Part#reset()
*/
void resetPart(String partName) throws ModelException;
/**
* Accepts a component hierarchy visitor and invokes its methods for
* any attribute and part found in this component (in
* <em>breadth-first</em> order). Recursively calls
* {@link #accept(Visitor)} on any of the part's components.
*
* @param visitor
* the visitor to invoke
*/
void accept(Visitor visitor);
// L I S T E N E R S
/**
* Registers a listener for the {@link Changed} event.
*
* @param listener
* the listener to register
* @see Changed
*/
void addChangeListener(ChangeListener<C> listener);
/**
* Unregisters a listener for the {@link Changed} event.
*
* @param listener
* the listener to unregister
* @see Changed
*/
void removeChangeListener(ChangeListener<C> listener);
/**
* Registers a listener for the {@link ValueInstantiated} event.
*
* @param listener
* the listener to register
* @see ValueInstantiated
*/
'F$
void addValueInstantiationListener(
ValueInstantiationListener<C> listener);
/**
* Unregisters a listener for the {@link ValueInstantiated} event.
*
* @param listener
* the listener to unregister
* @see ValueInstantiated
*/
void removeValueInstantiationListener(
ValueInstantiationListener<C> listener);
/**
* Registers a listener for the {@link ValueChanged} event.
*
* @param listener
* the listener to register
* @see ValueChanged
*/
void
addValueChangeListener(
ValueChangeListener<C> valueChangedListener);
/**
* Unregisters a listener for the {@link ValueChanged} event.
*
* @param listener
* the listener to unregister
* @see ValueChanged
*/
void removeValueChangeListener(
ValueChangeListener<C> valueChangedListener);
/**
* Registers a listener for the {@link TypeChanged} event.
*
* @param listener
* the listener to register
* @see TypeChanged
*/
void
addTypeChangeListener(TypeChangeListener<C> typeChangeListener);
/**
* Unregisters a listener for the {@link TypeChanged} event.
*
* @param listener
* the listener to unregister
* @see TypeChanged
*/
void
removeTypeChangeListener(
TypeChangeListener<C> typeChangeListener);
/**
* Registers a listener for the {@link Reset} event.
*
* @param listener
* the listener to register
* @see Reset
*/
void addResetListener(ResetListener<C> listener);
&6R9%R89 &+=+
'F;
/**
* Unregisters a listener for the {@link Reset} event.
*
* @param listener
* the listener to unregister
* @see Reset
*/
void removeResetListener(ResetListener<C> listener);
/**
* Event listener for the {@link Changed} event.
*
* @param <C>
* type of the changed component's value
* @see Changed
* @author Vivian Steller
* @since 1.0
*/
interface ChangeListener<C> extends Listener
{
void handle(Changed<C> event);
}
/**
* Event listener for the {@link ValueInstantiated} event.
*
* @param <C>
* type of the instantiated value
* @see ValueInstantiated
* @author Vivian Steller
* @since 1.0
*/
interface ValueInstantiationListener<C> extends Listener
{
void handle(ValueInstantiated<C> event);
}
/**
* Event listener for the {@link ValueChanged} event.
*
* @param <C>
* type of the changed value
* @see ValueChanged
* @author Vivian Steller
* @since 1.0
*/
interface ValueChangeListener<C> extends Listener
{
void handle(ValueChanged<C> event);
}
/**
* Event listener for the {@link TypeChanged} event.
*
* @param <C>
* base type of the component's value whose type has
* changed
* @see TypeChanged
* @author Vivian Steller
* @since 1.0
*/
interface TypeChangeListener<C> extends Listener
'F<
{
void handle(TypeChanged<C> event);
}
/**
* Event listener for the {@link Reset} event.
*
* @param <C>
* type of the reset component's value
* @see ValueInstantiated
* @author Vivian Steller
* @since 1.0
*/
interface ResetListener<C> extends Listener
{
void handle(Reset<C> event);
}
// E V E N T S
// Change
/**
* Event indicating that the component's state changed.<br/>
* <br/>
* This event is fired upon any component state changes, e.g. value
* changed, type changed etc. Usually other events such as
* {@link ValueChanged} or {@link TypeChanged} have been fired
* before.<br/>
* <br/>
* Change detection is implemented transitively, that is, if one of
* the component's attributes or parts changes, the change is
* propagated to the component and the respective event is fired.
*
* @param <C>
* base type managed by the component
* @author Vivian Steller
* @since 1.0
*/
static class Changed<C> extends
Events.Changed<Component<C>, ChangeListener<C>>
{
public Changed(Component<C> source)
{
super(source);
}
protected void call(ChangeListener<C> listener)
{
listener.handle(this);
}
}
// Value Instantiation
/**
* Event indicating that the component's value has been
* instantiated.<br/>
*
* @param <C>
* base type managed by the component
* @author Vivian Steller
* @since 1.0
*/
&6R9%R89 &+=+
'F?
static class ValueInstantiated<C>
extends
Events.ValueInstantiated<Component<C>, C,
ValueInstantiationListener<C>>
{
public ValueInstantiated(Component<C> source, C newValue)
{
super(source, newValue);
}
protected void call(ValueInstantiationListener<C> listener)
{
listener.handle(this);
}
}
// Value Change
/**
* Event indicating that the component's value changed.<br/>
* <br/>
* Change detection is implemented transitively, that is, if one of
* the component's attributes or parts changes, the change is
* propagated to the component and the respective event is fired.
*
* @param <C>
* base type managed by the component
* @see Component#getValue()
* @author Vivian Steller
* @since 1.0
*/
static class ValueChanged<C> extends
Events.ValueChanged<Component<C>, C, ValueChangeListener<C>>
{
public ValueChanged(Component<C> source, C oldValue, C newValue)
{
super(source, oldValue, newValue);
}
protected void call(ValueChangeListener<C> listener)
{
listener.handle(this);
}
protected static <C> ValueChanged<C> create(
Component<C> source,
C oldValue, C newValue)
{
return new ValueChanged<C>(source, oldValue, newValue)
{
};
}
}
// Type Change
/**
* Event indicating that the component's type changed.<br/>
*
* @param <C>
* bae type managed by the component
* @see Component#getType()
* @author Vivian Steller
* @since 1.0
*/
'F@
static class TypeChanged<C> extends
Events.TypeChanged<Component<C>, C, TypeChangeListener<C>>
{
public TypeChanged(Component<C> source,
Class<? extends C> oldType, Class<? extends C> newType)
{
super(source, oldType, newType);
}
protected void call(TypeChangeListener<C> listener)
{
listener.handle(this);
}
}
// Reset
/**
* Event indicating that the component has been reset.<br/>
*
* @param <C>
* base type managed by the component
* @see Component#reset()
* @author Vivian Steller
* @since 1.0
*/
static class Reset<C> extends
Events.Reset<Component<C>, ResetListener<C>>
{
public Reset(Component<C> source)
{
super(source);
}
protected void call(ResetListener<C> listener)
{
listener.handle(this);
}
}
// V I S I T O R
/**
* Visitor interface that is used to implement the visitor design
* pattern on component hierarchies.
*
* @author Vivian Steller
* @since 1.0
*/
static interface Visitor
{
/**
* Invoked by {@link Component#accept(Visitor)} for each
* component in the hierarchy.
*
* @param component
* the component to be visited
*/
void visit(Component<?> component);
/**
* Invoked by {@link Component#accept(Visitor)} for each
* attribute in the hierarchy.
*
&6R9%R89 &+=+
'FF
* @param attribute
* the attribute to be visited
*/
void visit(Attribute<?, ?> attribute);
/**
* Invoked by {@link Component#accept(Visitor)} for each part in
* the hierarchy.
*
* @param part
* the part to be visited
*/
void visit(Part<?, ?> part);
}
}
Interface Attribute
package configurator.model;
import configurator.event.Events;
import configurator.event.Listener;
import configurator.metadata.AttributeDescriptor;
/**
* Represents an attribute of type <code>A</code>. This interface allows
* you to generically manage <i>simple typed</i> properties of
* JavaBean-style instances.<br/>
* <br/>
* Opposed to {@link Part}s, attributes are "atomic" and not further
* divisible, which means that their value has to be set "at once".
* Further more, again in contrast to {@link Part}s whose value's type
* may vary at runtime, the type of the attribute's value is fixed.<br/>
* <br/>
* There exist two subtypes of this interface {@link SingularAttribute}
* and {@link PluralAttribute} to distinguish between non-collection
* valued and collection valued attributes.<br/>
* <br/>
* Additionally, this interface supports registering of observers for
* various events that indicate changes to the attribute's state.<br/>
* <br/>
* Implementations of this class do <i>not</i> have to be implemented
* thread-safe but serializable.<br/>
* <br/>
* <i>Modeling note: methods are designed to be idempotent</i>
*
* @param <C>
* base type of the component containing the attribute
* @param <A>
* type of the value managed by this attribute
* @see SingularAttribute
* @see PluralAttribute
*/
public abstract interface Attribute<C, A> extends Element<A>
{
/**
* Descriptor containing metadata about the attribute.<br/>
* <br/>
* The returned {@link AttributeDescriptor} is <i>immutable</i>.
*
* @param <T>
* type that declares the attribute
* @param <A>
'FG
* type of this attribute's value
* @return the {@link AttributeDescriptor} associated to the
* attribute
*/
<T extends C> AttributeDescriptor<T, A> getMetadata();
/**
* Name of the attribute.
*
* @return the name of the attribute
*/
String getName();
/**
* Component that this attribute is attached to.
*
* @return the component containing this attribute
*/
Component<C> getParent();
/**
* Whether the attribute value is instantiated (non-
* <code>null</code>) or not.
*
* @return <code>true</code> if the attribute is instantiated
* @see #getValue()
* @see #setValue(Object)
*/
boolean isInstantiated();
/**
* Whether the user did specify the value of this attribute.
*
* @return <code>true</code> if the user specified the value of this
* attribute
*/
boolean isSpecified();
/**
* Accesses the value managed by this attribute. The value must have
* been explicitly set by the user using the
* {@link #setValue(Object)} method or the containing component's
* type is instantiated and provides a default value for the
* attribute.
*
* @return the current attribute's value or <code>null</code> if the
* attribute's value has not been set yet
* @see #setValue(Object)
*/
A getValue();
/**
* Sets the value of the attribute. <br/>
* Calling this method triggers the following events if changes to
* the attribute's state are detected: {@link Changed}
*
* @param value
* the attribute value to set
*/
void setValue(A value);
/**
* Resets the attribute's state. The attribute value is set to
&6R9%R89 &+=+
'G(
* <code>null</code> or the default value (refer to
* {@link #getValue()}).<br/>
* <br/>
* Calling this method triggers the following events:
* {@link Changed}
*/
void reset();
// L I S T E N E R S
/**
* Registers a listener for the {@link Changed} event.
*
* @param listener
* the listener to register
* @see Changed
*/
void addChangeListener(ChangeListener<C, A> listener);
/**
* Unregisters a listener for the {@link Changed} event.
*
* @param listener
* the listener to unregister
* @see Changed
*/
void removeChangeListener(ChangeListener<C, A> listener);
/**
* Event listener for the {@link Changed} event.
*
* @param <C>
* base type of the component containing the attribute
* @param <A>
* type of the changed attribute's value
* @see Changed
* @author Vivian Steller
* @since 1.0
*/
interface ChangeListener<C, A> extends Listener
{
void handle(Changed<C, A> event);
}
// E V E N T S
// Change
/**
* Event indicating that the attribute's state changed.
*
* @param <C>
* base type of the component containing the attribute
* @param <A>
* type of the changed attribute's value
* @author Vivian Steller
* @since 1.0
*/
class Changed<C, A> extends
Events.Changed<Attribute<C, A>, ChangeListener<C, A>>
{
public Changed(Attribute<C, A> source)
{
super(source);
'G#
}
protected void call(ChangeListener<C, A> listener)
{
listener.handle(this);
}
}
}
Interface Part
package configurator.model;
import configurator.event.Events;
import configurator.event.Listener;
import configurator.metadata.PartDescriptor;
/**
* Represents a part relationship between a component of type
* <code>C</code> and one or more other components of type
* <code>P</code>. This interface allows you to generically manage
* <i>complex typed</i> properties of JavaBean-style instances.<br/>
* <br/>
* Opposed to {@link Attribute}s, parts are "complex" and may itself
* contain other attributes or parts (or more precisely the referenced
* part component can do so). The value of a part may explicitly set or
* may be automatically instantiated by the framework while the user
* specifies the concrete type, specific attribute or sub-part values.
* Further more, in contrast to {@link Attribute}s whose value's type is
* fixed, the part's type may vary at runtime according to the rules
* defined by {@link Component#setType(Class)}.<br/>
* <br/>
* There exist two subtypes of this interface {@link SingularPart} and
* {@link PluralPart} to distinguish between non-collection valued and
* collection valued parts.<br/>
* <br/>
* Additionally, this interface supports registering of observers for
* various events that indicate changes to the part's state.<br/>
* <br/>
* Implementations of this class do <i>not</i> have to be implemented
* thread-safe but serializable.<br/>
* <br/>
* <i>Modeling note: methods are designed to be idempotent</i>
*
* @param <C>
* base type of the component containing the part
* @param <P>
* base type of the value managed by this part
* @see SingularPart
* @see PluralPart
* @author Vivian Steller
* @since 1.0
*/
public abstract interface Part<C, P> extends Element<P>
{
/**
* Descriptor containing metadata about the part. Although the part
* component's type can vary at runtime, the descriptor returned by
* this method remains constant as it represents information about
* the part itself and not information about the component
* referenced by this part.<br/>
* <br/>
* The returned {@link PartDescriptor} is <i>immutable</i>.
&6R9%R89 &+=+
'G'
*
* @param <T>
* type that declares the part
* @param <P>
* base type of this part's value
* @return the {@link PartDescriptor} associated to the attribute
*/
<T extends C> PartDescriptor<T, P> getMetadata();
/**
* Name of the part.
*
* @return the name of the part
*/
String getName();
/**
* Component that this part is attached to.
*
* @return the component containing this part
*/
Component<C> getParent();
/**
* Whether the part value is instantiated (non-<code>null</code>) or
* not.<br/>
* <br/>
* This method delegates to the referenced part component(s).
*
* @return <code>true</code> if the part is instantiated
* @see #getValue()
* @see #setValue(Object)
*/
boolean isInstantiated();
/**
* Whether the user did specify the value of this part or any of the
* part component's attributes or parts.<br/>
* <br/>
* This method delegates to the referenced part component(s).
*
* @return <code>true</code> if the user specified any of this
* part's properties
*/
boolean isSpecified();
/**
* Accesses the instance(s) managed by this part. The bean might
* have been automatically instantiated during the configuration
* process or must have been explicitly set by the user using the
* {@link #setValue(Object)} method. Alternatively, the method
* returns a default value if the containing component's type is
* instantiated and provides a default value for the part<br/>
* <br/>
* This method delegates to the referenced part component(s).
*
* @return the underlying bean instance or <code>null</code> if the
* part has not been instantiated yet
* @see #setValue(Object)
*/
P getValue();
/**
'G$
* Explicitly sets the underlying bean instance. The part
* component(s)' attributes and parts are populated with the given
* value in order to reflect the bean instance's state.<br/>
* <br/>
* Calling this method triggers the following events if changes to
* the part's current state are detected: {@link ValueChanged},
* {@link Changed} and the events triggered by calling this part
* component(s)' {@link Component#setValue(Object)} method.<br/>
* <br/>
* This method delegates to the referenced part component(s).
*
* @param value
* the value to populate this part with
*/
void setValue(P value);
/**
* Resets the part's state. The part component(s)' type is reset to
* their base type <code>P</code>. The managed instance is set to
* <code>null</code> or the default value (refer to
* {@link #getValue()}).<br/>
* <br/>
* Calling this method triggers the following events:
* {@link Changed} and the events triggered by calling this part
* component(s)' {@link Component#reset()} method. <br/>
* This method delegates to the referenced part component(s).
*/
void reset();
// E V E N T S
/**
* Registers a listener for the {@link Changed} event.
*
* @param listener
* the listener to register
* @see Changed
*/
void addChangeListener(ChangeListener<C, P> listener);
/**
* Unregisters a listener for the {@link Changed} event.
*
* @param listener
* the listener to unregister
* @see Changed
*/
void removeChangeListener(ChangeListener<C, P> listener);
/**
* Registers a listener for the {@link ValueChanged} event.
*
* @param listener
* the listener to register
* @see ValueChanged
*/
void addValueChangeListener(ValueChangeListener<C, P> listener);
/**
* Unregisters a listener for the {@link ValueChanged} event.
*
* @param listener
* the listener to unregister
&6R9%R89 &+=+
'G;
* @see ValueChanged
*/
void removeValueChangeListener(ValueChangeListener<C, P> listener);
/**
* Event listener for the {@link Changed} event.
*
* @param <C>
* base type of the component containing the part
* @param <P>
* base type of the changed part's referenced component
* @see Changed
* @author Vivian Steller
* @since 1.0
*/
interface ChangeListener<C, P> extends Listener
{
void handle(Changed<C, P> event);
}
/**
* Event listener for the {@link ValueChanged} event.
*
* @param <C>
* base type of the component containing the part
* @param <P>
* base type of the changed part's referenced component
* @see ValueChanged
* @author Vivian Steller
* @since 1.0
*/
interface ValueChangeListener<C, P> extends Listener
{
void handle(ValueChanged<C, P> event);
}
// Change
/**
* Event indicating that the part's state changed.<br/>
* <br/>
* This event is fired upon any part state changes which corresponds
* to the state changes of this part's referenced component(s).<br/>
* <br/>
* Change detection is implemented transitively, that is, if one of
* the part component(s)' attributes or parts changes, the change is
* propagated to the part and the respective event is fired.
*
* @param <C>
* base type of the component containing the part
* @param <P>
* base type of the changed part's referenced component
* @author Vivian Steller
* @since 1.0
*/
class Changed<C, P> extends
Events.Changed<Part<C, P>, ChangeListener<C, P>>
{
public Changed(Part<C, P> source)
{
super(source);
}
protected void call(ChangeListener<C, P> listener)
'G<
{
listener.handle(this);
}
}
// Value Change
/**
* Event indicating that the part's value changed.<br/>
* <br/>
* Change detection is implemented transitively, that is, if one of
* the part component(s)' attributes or parts changes, the change is
* propagated to the part and the respective event is fired.
*
* @param <C>
* base type managed by the component
* @param <P>
* base type of the changed part's referenced component
* @see Part#getValue()
* @author Vivian Steller
* @since 1.0
*/
class ValueChanged<C, P> extends
Events.ValueChanged<Part<C, P>, P, ValueChangeListener<C, P>>
{
public ValueChanged(Part<C, P> source, P oldValue, P newValue)
{
super(source, oldValue, newValue);
}
protected void call(ValueChangeListener<C, P> listener)
{
listener.handle(this);
}
}
}
Interface ComponentDescriptor
package configurator.metadata;
import java.util.Map;
import configurator.model.Facetted;
/**
* Holds meta data for a configurable type <code>C</code>.
*/
public interface ComponentDescriptor<C> extends Facetted
{
/**
* The type that this descriptor describes.
*
* @return the Java class that is described by this component
* descriptor
*/
Class<C> getValueType();
/**
* Attributes of <code>C</code>. Maps attribute names to the
* respective descriptors.<br/>
* <br/>
* The returned map is <i>unmodifiable</i>.
*
&6R9%R89 &+=+
'G?
* @return the map of attributes of <code>C</code>
*/
Map<String, AttributeDescriptor<C, ?>> getAttributes();
/**
* Parts of <code>C</code>. Maps part names to the respective
* descriptors.<br/>
* <br/>
* The returned map is <i>unmodifiable</i>.
*
* @return the map of parts of <code>C</code>
*/
Map<String, PartDescriptor<C, ?>> getParts();
boolean hasFacet(Class<?> facetType);
<F> F getFacet(Class<F> facetType);
}
Interface AttributeDescriptor
package configurator.metadata;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Member;
import java.util.Collection;
import configurator.model.Typed;
import configurator.util.ValueDelegate;
/**
* Holds meta data of an attribute of component <code>C</code>. The
* attribute's value is of type <code>A</code>.
*
* @param <C>
* type of the class that declares the attribute
* @param <A>
* type of the attribute's value
*/
public abstract interface AttributeDescriptor<C, A>
{
/**
* Descriptor that contains the attribute.
*
* @return the descriptor that contains the attribute
*/
ComponentDescriptor<C> getComponentDescriptor();
/**
* Type that declares the attribute.
*
* @return the type that declares the attribute
*/
Class<C> getDeclaringType();
/**
* Member that this attribute is built from.
*
* @return the Java bean member that this attribute is built from
*/
Member getDeclaringMember();
'G@
/**
* Annotated element that this attribute is built from.
*
* @return the annotated Java bean element that this attribute is
* built from
*/
AnnotatedElement getDeclaringAnnotatedElement();
/**
* Name of the attribute.
*
* @return the name of the attribute
*/
String getName();
/**
* Type of the attribute which corresponds to type of the field or
* accessor method that this attribute maps to. E.g.
* <code>Collection<A></code> if this is a collection attribute.
*
* @return the type of the attribute
*/
Class<A> getValueType();
/**
* Whether this attribute is a collection.
*
* @return <code>true</code> if this attribute is {@link Collection}
* valued
*/
boolean isCollection();
/**
* Whether this attribute is read-only or can be written.
*
* @return <code>true</code> if this is a read-only attribute
*/
boolean isReadOnly();
/**
* Factory method to create a {@link ValueDelegate} that is capable
* of reading or writing the attribute value on the given type
* <code>C</code>.
*
* @param instance
* the instance from/to which the attribute value is
* read/written
* @return {@link ValueDelegate} that operates on the given instance
* or <code>null</code> if either instance is
* <code>null</code> or instance doesn't contain the
* property, referenced by this attribute.
*/
ValueDelegate<A> createValueDelegate(C instance);
/**
* @param <C>
* type of the class that declares the attribute
* @param <A>
* type of the attribute's value
* @author Vivian Steller
* @since 1.0
*/
interface SingularAttributeDescriptor<C, A> extends
&6R9%R89 &+=+
'GF
AttributeDescriptor<C, A>, Typed<A>
{
}
/**
* @param <C>
* type of the class that declares the attribute
* @param <A>
* type of the attribute's value
* @param <E>
* element type of the collection
* @author Vivian Steller
* @since 1.0
*/
interface PluralAttributeDescriptor<C, A, E> extends
AttributeDescriptor<C, A>, Typed<E>
{
}
/**
* Builder interface for creating (immutable)
* {@link AttributeDescriptor}s.
*
* @author Vivian Steller
* @since 1.0
*/
public static interface Builder<C, A, T>
{
/**
* Specifies the component descriptor that owns the attribute
* being built. The passed component descriptor might not be
* fully initialized yet, that is, not all attributes, parts and
* facets have been instantiated and added to the component
* descriptor.
*
* @param componentDescriptor
* the (not necessarily fully initialized) component
* descriptor that owns the built attribute
* @return the builder for fluent invocations
*/
Builder<C, A, T> owningDescriptor(
ComponentDescriptor<C> componentDescriptor);
/**
* Specifies the property that the built descriptor is bound to.<br/>
* <br/>
* The specification of the property is <em>required</em>.
*
* @param property
* the property to that the built instance should be
* bound
* @return the builder for fluent invocations
*/
Builder<C, A, T> property(Property<A> property);
/**
* Specifies the component type that declares the attribute.<br/>
* <br/>
* The specification of the component type is <em>optional</em>
* and defaults to the property's
* {@link Property#getDeclaringClass()} property.
*
* @param declaringType
'GG
* the component type that declares the attribute
* @return the builder for fluent invocations
*/
Builder<C, A, T> declaringType(Class<C> declaringType);
/**
* Specifies the name of the built attribute.<br/>
* <br/>
* The specification of the name is <em>optional</em> and
* defaults to the property's {@link Property#getName()}
* property.
*
* @param name
* the name of the built attribute
* @return the builder for fluent invocations
*/
Builder<C, A, T> name(String name);
/**
* Specifies the type of the built attribute's bound property.<br/>
* <br/>
* The specification of the member type is <em>optional</em> and
* defaults to the property's {@link Property#getJavaClass()}
* property.
*
* @param memberType
* the member type of the built attribute's bound
* property
* @return the builder for fluent invocations
*/
Builder<C, A, T> memberType(Class<A> memberType);
/**
* Specifies the type of the built attribute.<br/>
* <br/>
* The specification of the type is <em>optional</em> and is by
* default determined from to the property's
* {@link Property#getJavaClass()} property.
*
* @param baseType
* the base type of the built attribute
* @return the builder for fluent invocations
*/
Builder<C, A, T> baseType(Class<T> baseType);
/**
* Retrieves the attribute descriptor instance built by this
* builder. If this method is called by framework, the component
* descriptor passed to the builder via the
* {@link #owningDescriptor(ComponentDescriptor)} method may not
* be fully initialized, that is, not all attributes, parts and
* facets have been instantiated yet.<br/>
* <br/>
* Refer to {@link #initialize()} which is called when the
* component descriptor is fully initialized.
*
* @return the (not necessarily fully initialized) attribute
* descriptor
*/
AttributeDescriptor<C, A> build();
/**
* Finally initializes the attribute descriptor built by this
&6R9%R89 &+=+
$((
* builder. Invoked when the descriptor that this attribute is
* part of, has been fully initialized, that is, all attributes,
* parts and facets (whose initialize method may or may not have
* been called though) are available.
*
* @return the fully initialized attribute descriptor
*/
AttributeDescriptor<C, A> initialize();
}
}
Interface PartDescriptor
package configurator.metadata;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Member;
import java.util.Collection;
import configurator.model.Typed;
import configurator.util.ValueDelegate;
/**
* Holds meta data of a part of component <code>C</code>. The part's
* value is of type <code>P</code>.
*
* @param <C>
* type of the class that declares the part
* @param <P>
* type of the part's value
*/
public abstract interface PartDescriptor<C, P>
{
/**
* Descriptor that contains the part.
*
* @return the descriptor that contains the part
*/
ComponentDescriptor<C> getComponentDescriptor();
/**
* Type that declares the part.
*
* @return the type that declares the part
*/
Class<C> getDeclaringType();
/**
* Member that this part is built from.
*
* @return the Java bean member that this part is built from
*/
Member getDeclaringMember();
/**
* Annotated element that this part is built from.
*
* @return the annotated Java bean element that this part is built
* from
*/
AnnotatedElement getDeclaringAnnotatedElement();
/**
$(#
* Name of the part.
*
* @return the name of the part
*/
String getName();
/**
* Base type of the part which corresponds to type of the field or
* accessor method that this part maps to. E.g.
* <code>Collection<P></code> if this is a collection part.
*
* @return the base type of the part's value
*/
Class<P> getValueType();
/**
* Whether this part is a collection.
*
* @return <code>true</code> if this part is {@link Collection}
* valued
*/
boolean isCollection();
/**
* Factory method to create a {@link ValueDelegate} that is capable
* of reading or writing the part value on the given type
* <code>C</code>.
*
* @param instance
* the instance from/to which the part value is
* read/written
* @return {@link ValueDelegate} that operates on the given instance
* or <code>null</code> if either instance is
* <code>null</code> or instance doesn't contain the
* property, referenced by this part.
*/
ValueDelegate<P> createValueDelegate(C instance);
/**
* @param <C>
* type of the class that declares the part
* @param <A>
* type of the part's value
* @author Vivian Steller
* @since 1.0
*/
interface SingularPartDescriptor<C, P> extends
PartDescriptor<C, P>, Typed<P>
{
}
/**
* @param <C>
* type of the class that declares the part
* @param <A>
* type of the part's value
* @param <E>
* element type of the collection
* @author Vivian Steller
* @since 1.0
*/
interface PluralPartDescriptor<C, P, E> extends
PartDescriptor<C, P>, Typed<E>
&6R9%R89 &+=+
$('
{
}
/**
* Builder interface for creating (immutable) {@link PartDescriptor}
* s
*
* @author Vivian Steller
* @since 1.0
*/
public interface Builder<C, P, E>
{
/**
* Specifies the component descriptor that owns the part being
* built. The passed component descriptor might not be fully
* initialized yet, that is, not all attributes, parts and
* facets have been instantiated and added to the component
* descriptor.
*
* @param componentDescriptor
* the (not necessarily fully initialized) component
* descriptor that owns the built attribute
* @return the builder for fluent invocations
*/
Builder<C, P, E> owningDescriptor(
ComponentDescriptor<C> componentDescriptor);
/**
* Specifies the property that the built descriptor is bound to.
* <br/>
* The specification of the property is <em>required</em>.
*
* @param property
* the property to that the built instance should be
* bound
* @return the builder for fluent invocations
*/
Builder<C, P, E> property(Property<P> property);
/**
* Specifies the component type that declares the part.<br/>
* <br/>
* The specification of the component type is <em>optional</em>
* and defaults to the property's
* {@link Property#getDeclaringClass()} property.
*
* @param declaringType
* the component type that declares the part
* @return the builder for fluent invocations
*/
Builder<C, P, E> declaringType(Class<C> declaringType);
/**
* Specifies the name of the built part.<br/>
* <br/>
* The specification of the name is <em>optional</em> and
* defaults to the property's {@link Property#getName()}
* property.
*
* @param name
* the name of the built part
* @return the builder for fluent invocations
*/
$($
Builder<C, P, E> name(String name);
/**
* Specifies the type of the built part's bound property.<br/>
* <br/>
* The specification of the member type is <em>optional</em> and
* defaults to the property's {@link Property#getJavaClass()}
* property.
*
* @param memberType
* the member type of the built part's bound property
* @return the builder for fluent invocations
*/
Builder<C, P, E> memberType(Class<P> memberType);
/**
* Specifies the type of the built part.<br/>
* <br/>
* The specification of the type is <em>optional</em> and is by
* default determined from to the property's
* {@link Property#getJavaClass()} property.
*
* @param baseType
* the base type of the built part
* @return the builder for fluent invocations
*/
Builder<C, P, E> baseType(Class<E> baseType);
/**
* Retrieves the part descriptor instance built by this builder.
* If this method is called by framework, the component
* descriptor passed to the builder via the
* {@link #owningDescriptor(ComponentDescriptor)} method may not
* be fully initialized, that is, not all attributes, parts and
* facets have been instantiated yet.<br/>
* <br/>
* Refer to {@link #initialize()} which is called when the
* component descriptor is fully initialized.
*
* @return the (not necessarily fully initialized) part
* descriptor
*/
PartDescriptor<C, P> build();
/**
* Finally initializes the attribute descriptor built by this
* builder. Invoked when the descriptor that this part is part
* of, has been fully initialized, that is, all attributes,
* parts and facets (whose initialize method may or may not have
* been called though) are available.
*
* @return the fully initialized attribute descriptor
*/
PartDescriptor<C, P> initialize();
}
}
Interface Product
package configurator.product;
import java.util.Collection;
&6R9%R89 &+=+
$(;
import javax.enterprise.util.TypeLiteral;
import configurator.model.Attribute;
import configurator.model.Part;
public interface Product<T>
{
/**
* Name of the product. Usually the attribute annotated with
* {@link info.openconfigurator.products.annotation.Product.Name}.
*
* @return the name of the product
*/
String getName();
/**
* Description of the product. Usually the attribute annotated with
* {@link info.openconfigurator.products.annotation.Product.Description}
* .
*
* @return the description of the product
*/
String getDescription();
Asset getImage();
/**
* Attributes of the product. Usually attributes annotated with
* {@link info.openconfigurator.products.annotation.Product.Attribute}
* .
*
* @return the attributes of the product
*/
Collection<Attribute<T, ?>> getAttributes();
/**
* Attributes of the product with the given level(s). Usually
* attributes annotated with
* {@link info.openconfigurator.products.annotation.Product.Attribute}
* whereby the annotation's level attribute is specified.<br/>
* <br/>
* The level is interpreted as bit mask.
*
* @param level
* the level(s) to retrieve
* @return the attributes of the product fulfilling the given levels
*/
Collection<Attribute<T, ?>> getAttributes(int level);
/**
* Parts of the product.
*
* @return the parts of the product
*/
Collection<Part<T, ?>> getParts();
public static class Literal
{
public static <T> Class<Product<T>> forType(Class<T> type)
{
return new TypeLiteral<Product<T>>()
{
}.getRawType();
$(<
}
}
}
Interface Configuration (Facet)
package configurator.configuration;
import java.util.Collection;
import configurator.model.Attribute;
import configurator.model.Part;
public interface Configuration<T>
{
SpecificationMethod getSpecificationMethod();
AttributeType getAttributeType(Attribute<T, ?> attribute);
Collection<Attribute<T, ?>> getAttributes(AttributeType type);
PartType getPartType(Part<T, ?> part);
Collection<Part<T, ?>> getParts(PartType type);
SpecificationMethod
getSpecificationMethod(Part<T, ?> configuredPart);
}
Interface Data
package configurator.data;
import configurator.model.Attribute;
import configurator.model.Part;
public interface Data<T>
{
// D O M A I N S
DomainScope getDomainScope();
/**
* The initial component type domain. Domains contain values that
* were subject to initial constraint application. Though, no user
* specification has happened so far, which could have lead to
* domain changes.
*/
Domain<Class<? extends T>> getInitialComponentTypeDomain();
Domain<Class<? extends T>> getComponentTypeDomain();
/**
* The initial component value domain. Domains contain values that
* were subject to initial constraint application. Though, no user
* specification has happened so far, which could have lead to
* domain changes.
*/
Domain<T> getInitialComponentValueDomain();
Domain<T> getComponentValueDomain();
/**
* The initial attribute value domain. Domains contain values that
&6R9%R89 &+=+
$(?
* were subject to initial constraint application. Though, no user
* specification has happened so far, which could have lead to
* domain changes.
*/
<A> Domain<A> getInitialAttributeValueDomain(
Attribute<T, A> attribute);
<A> Domain<A> getAttributeValueDomain(Attribute<T, A> attribute);
// not yet implemented
Domain<Integer> getInitialAttributeQuantityDomain(
Attribute<T, ?> attribute);
// not yet implemented
Domain<Integer>
getAttributeQuantityDomain(Attribute<T, ?> attribute);
/**
* The initial part type domain. Domains contain values that were
* subject to initial constraint application. Though, no user
* specification has happened so far, which could have lead to
* domain changes.
*/
<P> Domain<Class<? extends P>> getInitialPartTypeDomain(
Part<T, P> part);
<P> Domain<Class<? extends P>> getPartTypeDomain(Part<T, P> part);
/**
* The initial part value domain. Domains contain values that were
* subject to initial constraint application. Though, no user
* specification has happened so far, which could have lead to
* domain changes.
*/
<P> Domain<P> getInitialPartValueDomain(Part<T, P> part);
/**
* May return <code>null</code>/unbound domain, if domain is not
* explicitly defined using @Domain.Query on neither the part nor
* the referenced component type. In this case, attribute level
* domain definitions are assumed.
*/
<P> Domain<P> getPartValueDomain(Part<T, P> part);
// not yet implemented
Domain<Integer> getInitialPartQuantityDomain(Part<T, ?> part);
// not yet implemented
Domain<Integer> getPartQuantityDomain(Part<T, ?> part);
// D E F A U L T S
Class<? extends T> getDefaultComponentType();
T getDefaultComponentValue();
<A> A getDefaultAttributeValue(Attribute<T, A> attribute);
// not yet implemented
Integer getDefaultAttributeQuantity(Attribute<T, ?> attribute);
<P> Class<? extends P> getDefaultPartType(Part<T, P> part);
$(@
<P> P getDefaultPartValue(Part<T, P> part);
// not yet implemented
Integer getDefaultPartQuantity(Part<T, ?> part);
}
Interface Domain
package configurator.data;
/**
* Represents a domain of something.
*/
public interface Domain<T> extends Cloneable
{
Class<T> getValueType();
DomainType getDomainType();
boolean isOrdered();
boolean isNumeric();
/**
* Determines the number of values contained in the domain.
*
* @return the number of values.
*/
int getSize();
boolean isEmpty();
boolean isFixed();
T getValue();
boolean isEnumerable();
/**
* Whether the domain's values are enumerable or not.
*
* @param threshold
* the maximum number of items, the domain is considered
* enumerable.
* @return <code>true</code> if the domain's value are enumerable
* and the number of items is less than or equal to
* <code>threshold</code>.
*/
boolean isEnumerable(int threshold);
Iterable<T> getValues();
boolean contains(T value);
/**
* Whether the domain's size is unlimited or not.
*
* @return <code>true</code> if the domain is limited,
* <code>false</code> otherwise.
*/
boolean isBounded();
boolean isBoundedAbove();
&6R9%R89 &+=+
$(F
boolean isBoundedBelow();
T getUpperBound();
T getLowerBound();
}
Interface Validation
package configurator.validation;
import java.util.Collection;
import configurator.model.Attribute;
import configurator.model.Part;
public interface Validation<T>
{
Collection<Constraint<T>> getComponentConstraints();
/**
* Important: must also include those constraints, defined on type
* level that reference attribute as target ?? this would
* potentially require existence of a bean instance (which is
* assumed for component level constraints anyway)?
*/
<A> Collection<Constraint<A>> getAttributeConstraints(
Attribute<T, A> attribute);
<P> Collection<Constraint<P>> getPartConstraints(Part<T, P> part);
/**
* Explicitly triggers validation of all constraints defined for
* this component, its attributes and parts.
*/
void validate();
/**
* Whether the element itself has validation errors.
*/
boolean hasViolations();
/**
* Returns the violations reported for that component. Includes
* violations of all component, attribute and part constraints but
* not those of nested components.
*/
Collection<ConstraintViolation<?>> getViolations();
}
Interface Constraint
package configurator.validation;
import java.util.Collection;
import configurator.model.Element;
public interface Constraint<T>
{
ConstraintDescriptor getMetadata();
/**
$(G
* The element that defines the constraint.
*/
Element<T> getTarget();
void validate();
/**
* Whether the constraint is satisfied (valid) or not.
*/
boolean isSatisfied();
Collection<ConstraintViolation<T>> getViolations();
}
Interface ConstraintViolation
/**
* (c) 2012 Copyright by Vivian Steller
*/
package configurator.validation;
import configurator.model.Element;
/**
* @author Vivian Steller
* @since 1.0
*/
public interface ConstraintViolation<T>
{
Constraint<T> getConstraint();
Element<T> getTarget();
String getMessage();
}
Interface Agenda
package configurator.task;
import configurator.model.Component;
/**
* Represents the main entry point of the task based API.
*/
public interface Agenda<T> extends Binding<Component<T>>
{
<E> Iterable<Task<E>> getRootItems();
<E> Iterable<Task<E>> selectItems(Filter filter);
void accept(Task.Visitor visitor);
}
Interface Task
package configurator.task;
import java.util.Collection;
import configurator.data.Domain;
import configurator.validation.ConstraintViolation;
public interface Task<T>
&6R9%R89 &+=+
$#(
{
// structural
Task<?> getParent();
// task
String getLabel();
String getDescription();
Domain<T> getDomain();
T getValue();
void setValue(T value);
// task properties
boolean isObsolete();
boolean isOptional();
// task status
boolean isSpecified();
boolean isValid();
boolean isComplete();
// validation errors
Collection<ConstraintViolation<T>> getErrors();
// visitor
void accept(Visitor visitor);
public static interface Visitor
{
boolean visit(Task<?> task);
}
}
$##
Bibliography
I&'((;J&13:20%B$
   "C""D .>% :EEF0:EEG/%  >K2  
. "+2+2'((;%
I&'(('J&:&E&E82,2%8(
%2'(('%
I&#GG?J&E3-8E2,%+E321%/%!-
6=--*
7*," *3 4)%!++2
#GG?%
I&#GG@J &E-3&3E2 ,  ,"2 0&E3E2 9 42 
,8-43E3E2E0%8+:!%
H8-%#GG@2%#'?%
I&'((;J&>&E3E24%2,cEE4d24%28EE3E24%  
   !%
>%$-*%
9.%9H/%'((;%
I&6V0'(($J&[3:0&0E28 % + 
>  %"%'(($2#2%'G$'%
I1b'((<J1&-4e>2-%3%2'((<%
I1'((#J13E3>29%I!
$%2'((#%
I1'((;J1:39>3-24%2%+ "*2
.6%%'((;%
I1'((<J1:39>3-242%"
% ^1,2'((<%
I1'(((J18->32-%+ *".
!%#%'(((2%F%
I1!'((FJ1-8DE29%% %2'((F%
I1 #GG$J1E)3-2&%#)JB!"
%+2\2#GG$%
I9#GG#J90:2+%33-902-%4 6"%BA
%#GG#2%;2%<'?F%
1 "
$#'
I'((GJ&&,2+2%&3+4&!1+,*&-
-"%3.3&EK/>
*5"&D>#83.#8
3&EK/%'((G%
I#GF@J&2",%4%&D"2#GF@%
I'((<J 8,90>32 D    908::2 &% 1 - 3
%)D 2'((<%
I3. '((FJ3\&)--32%2%&9+ "
%>%%'((F2%#G%
I '(((J3:3-E)2&%2-3-902)%3%2/&EE&902%,:
  !  "%
",%#B#%'(((2%#(2
;2%;;GZ;@(%
I '((#J3:3-E)2&62%-
%2'((#%
I '(((J3:E)2-"4%!%-7%
!%"922'(((%
I.'(('J8-\&29&:&8-2.%,  "
7*4 "
%",#%'(('2%@?2#2%F@GF%
I) V3'(($J)38-)3:E3-28-&!)0%> +
 1%"%'(($2#2%$$$?%
I0'(#(J0&::3-1&902&21&3-242-3903-42,%9
 "1+,*4+&%,%
#68%'(#(2%''2?@2%<#G<;?%
I0#GGFJ03E2)%280:8E2:%2,9>3EE&2/%+ 
C %%%#GGF2%#(@Z#'?%
I0#GG@J 0:31-&E2 % )% "    
6 -  #  
% 2#GG@%
I0K'((#J08:40d3-2E\:e)X2b%6%
%&:10E 2'((#%
I0 #GG?J08,1-)29%D313-2/%+%=L
%#GG?2%?<$Z??;%
I0'((FJ0&,2:2,8-43E3E2E02-2/%
% 2'((F%
I'((?J 0:2 9%2  % >.  , 9.* 3 
 .1 9 +.>%-;
%'((?2%?(2$2%#?<Z#F;%
I '((#J2%"91>%2'((#%
I/-'GG'((GJ>E)2)%,%8:KK6)-"2,##%2
'((G%
$#$
I/-$($'((GJ13-E&-23%+343-8E2%/-$($*12#%(2
-%3$#)1%'((G%
I/-$#@'((GJ3,903:2:A%:B%,%8H5M6,!"*$:DE*4
8%/+&+36)2,"2'((G%
I/#GGGJ/80E2%)3>32%8 ;3%2
#GGG%
I/'(('J /80E2 % B  8  
D%2'(('%
I/VD '(($J/83Df++E)2%D 9 )0%+6
 + %"%'(($2
#2%;G<'%
I/Y '(($J/g-)3E3E2>%&%,- +%
@>%*:H:F,:EEH* 
;-*-D#%'(($%
I>'(#(J>E+:39022%83 &!99
 1+,%:K"%
'(#(%
I>'(#'J>8:12/20f1E3-2+2-3903-42,%&")
  9+&!"
%:E""%%'(#'%
I>#GG?J>840&2%.*4
E1"9"/%#,%#GG?2
%#;2<2%;;';<(%
I>T'((<J>-&4890h:2,9&-8E29%16
)*%!%% 2'((<%
I> '(#(J >-)2 &% #   1 J %
22/2'(#(%
I>#GG'J>,&-2%!%!%%2#GG'%
I>.'(##J>fE\:32-3903-42,%+0:!*!
!C! %,%
#68%'(##2%'$2;2%'(<Z';;%
I:.'(#(J :&E\2 &2 D313-2 12  -3903-42 ,% D!
4++!"%#*3
*"%655">3-%
5G"#%!-!%#:E5E%'(#(%
I:'((;J:39>E3-24%243),&EE2-%290:9043-2/%- 6"
" .
%"#* 
!%%'((;%
I:'((?J:39>E3-24%B>B
%32'((?%
I:'((<J:2/ 6%!7!!-3
%%2'((<%
1 "
$#;
I:'(($J:E3,&EE2A0 %B%
D !  # :EE5:EEFD %43 GN:D 4 
,%,2'(($%
I:'((?J:E3,&EE22 -390D&:2-2  \c02,%A%B%
"OB)P3#;%
  2'((?%
I:'((?J:E3,&EE2%1&,13-)3-2)%+%
:E3,&EE2%2-390D&:2-%2\c02,%%"O
B)P3#;%  2'((?%
I:'((?J:E3,&EE2%1&,13-)3-2)%&.
+%:E3,&EE2%2-390D&:2-%2\c02,%%
"OB)P3#;%
  2'((?%
I:'(#'J:80-,&EE2,-3903-42,%3"!1
+, %:E""%
%'(#'%
I,#GG(J,&03-2,%:%+ "%!"%#GG(2%##2
;2%;G%
I,V0'(($J,90&3:0f::3E>-3,3-2!1
)0%3 + % "
%'(($2#2%$@;(%
I,'(#'J,E1-82E2>8:12/2-3903-42,%4!
"9>! D%5"&>!
.!&5:/*3&5:>%'(#'%
IE"#GGGJE&-3X3>2&6%%%%2#GGG%
IE'(('JE::32%# 1    # 
   ;% +%% 2 4 
,2,2'(('%
I8)V&'((;J2%9=6 >%8)&2
'((;%
I+#GF'J+9842&%4.8 %-3
%#GF'2%;'2$2%'?@'F;%
I+#GGFJ+::3-24%B6- >
Q%02#GGF%
I+'((#J+::3-24%D#B
"% 2'((#%
I+'(($J+::3-24%6#B
"% 2'(($%
I+'(($J+::3-2484>829%B
D7>D"+ )2'(($%
I+'((?J+::3-2%6#B"
% 2'((?%
I+#GG'J+E321%/%6 743%0
1-!+2#GG'%
$#<
I+#GGGJ+E321%/):,8-32/0% #)#6>" 
R#3%%01+2#GGG%
I+'((FJ+8:&>21C%B1%
%)20D2-.!
A0)B2'((F%
I+#GF(J+8-43-2,3%6(
%+2#GF(%
I+#GGFJ+8-43-2,3%!6%%
%+2#GGF%
I+"'(#(J+-X2- 2%4!6+,%D
!%#&5E4"%#%'(#(%
I+'((;J+:,2%#3%4
,22'((;%
I-#GGFJ-3903-42,&&,2+%&3+46 "
9 D!D: 9%,""%
*%">%%#GGF2%#(2'2%G$#'G%
I-'(#(J-3903-42,2%4+&9,1
+, 9%#"%!
!",%'(#(2%<2$2%?;FF%
I-'(#'J-3903-42,D313-21% # 4)  
!"%6** % 2'(#'%
I-!'(('J-390D&:2-%+::3-2%4%>DK *
+.%>LB*>*%%
'(('2%'@Z<#%
I-!'((?J-390D&:2-%2%>.
+%:E3,&EE2%2-390D&:2-%2\c02,%%"
OB)P3#;% 
 2'((?%
I-!'((?J-390D&:2-%2%, !. 
+%:E3,&EE2%2-390D&:2-%2\c02,%%"
OB)P3#;% 
 2'((?%
I-!'((GJ-390D&:2-+::3-2%">L6"
*"4!%) 2'((G%
I- '(#(J-3EE313-)2%!*8%32
'(#(%
I- '(($J-8)8::24%+::3-2%4%BJ
$6  :EEHS %* #   
%B%492'(($%
I- '((;J-8)8::24%+::3-2%+ i
*& ""%"
#* 
%*-%'((;%
I-'((?J -E432 D  % ?!%  #  4 T % 
;TB%2'((?%
1 "
$#?
I#GGFJ&1E2D3)3:2-%4!
%2#GGF%
I'((?J 9033-2 9% B 6 #  
  $  J  P
%J%: %2'((?%
I!'(##J 90E33D32 "  084342 +% 4  ! 
3"%2'(##%
I'((#J9002)90D3E>2%)P6%
 %02'((#%
I!.#GG?J90D&-\3290dE:313E2+%
$%0 &)2#GG?%
IK'(((J90dE:313E2+% " 96   %
     ;  J%
 2'(((%
I#GG@J4,+4E3-2,%&!!  %!
%#GG@2%#(2'2%###Z#'<%
I'((#J3E8E29%/3E3E24%4
%>
%'((#2%#ZF%
I4'((GJ4&9>2)%%2'((G%
I4#GG;J43-3>82/%,.%">%#GG;2%
';$2#'2%;<Z;F%
I4V1'(($J 408-43E 1:39>3-2 0!     . ,% >
+ ,9.
%"%'(($2#2%'#';%
I4J408E3E2/%2%D9 "%%%
I4#GG@J408E3E2/%8EE3E24%6"%
%%0"4 "2#GG@%
I4#GF;J48:3-2&%  >%12#GF;%
I#GG#J:-902>%424E)2>%2,&E&)3,3E42%
"%"-0"5KK5D!
%#D-#-./-#%#GG#2$G2
%@$@G%
I#GGGJ3-8E2,2&-)3-20jk2&:&E8E82,%4%
%2#GGG%
I\!"#G??J \D9>X2 .% # # * 4   >%
>2#G??%
 2            
  `0!%
2#$%& '(#'

,*<$G#$'