1<?xml version="1.0" encoding="UTF-8"?>
2<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="Bank" nsURI="http://www.example.org/bank" nsPrefix="bank">
4
5 <!-- OCL Constraints Documentation -->
6 <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
7 <details key="documentation" value="Bank Account metamodel demonstrating OCL constraints including invariants, derivation rules, and pre/post conditions."/>
8 </eAnnotations>
9
10 <!-- Bank: Container for customers and accounts -->
11 <eClassifiers xsi:type="ecore:EClass" name="Bank">
12 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
13 <details key="constraints" value="uniqueAccountNumbers uniqueCustomerIds"/>
14 </eAnnotations>
15 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
16 <!-- Invariant: All account numbers must be unique -->
17 <details key="uniqueAccountNumbers" value="self.accounts->isUnique(accountNumber)"/>
18 <!-- Invariant: All customer IDs must be unique -->
19 <details key="uniqueCustomerIds" value="self.customers->isUnique(customerId)"/>
20 </eAnnotations>
21 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
22 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
23 <eStructuralFeatures xsi:type="ecore:EAttribute" name="swiftCode" lowerBound="1"
24 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
25 <eStructuralFeatures xsi:type="ecore:EReference" name="customers" upperBound="-1"
26 eType="#//Customer" containment="true" eOpposite="#//Customer/bank"/>
27 <eStructuralFeatures xsi:type="ecore:EReference" name="accounts" upperBound="-1"
28 eType="#//Account" containment="true" eOpposite="#//Account/bank"/>
29 </eClassifiers>
30
31 <!-- Customer: Bank customer with accounts -->
32 <eClassifiers xsi:type="ecore:EClass" name="Customer">
33 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
34 <details key="constraints" value="validEmail adultCustomer"/>
35 </eAnnotations>
36 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
37 <!-- Invariant: Email must contain @ symbol -->
38 <details key="validEmail" value="self.email.indexOf('@') > 0"/>
39 <!-- Invariant: Customer must be at least 18 years old -->
40 <details key="adultCustomer" value="self.age >= 18"/>
41 </eAnnotations>
42 <eStructuralFeatures xsi:type="ecore:EAttribute" name="customerId" lowerBound="1"
43 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
44 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
45 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
46 <eStructuralFeatures xsi:type="ecore:EAttribute" name="email" lowerBound="1"
47 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
48 <eStructuralFeatures xsi:type="ecore:EAttribute" name="age" lowerBound="1"
49 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
50 <eStructuralFeatures xsi:type="ecore:EReference" name="bank" eType="#//Bank"
51 eOpposite="#//Bank/customers"/>
52 <eStructuralFeatures xsi:type="ecore:EReference" name="accounts" upperBound="-1"
53 eType="#//Account" eOpposite="#//Account/owner"/>
54 <!-- Derived: Total balance across all accounts -->
55 <eStructuralFeatures xsi:type="ecore:EAttribute" name="totalBalance" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"
56 changeable="false" volatile="true" transient="true" derived="true">
57 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
58 <details key="derivation" value="self.accounts->collect(balance)->sum()"/>
59 </eAnnotations>
60 </eStructuralFeatures>
61 <!-- Derived: Number of active accounts -->
62 <eStructuralFeatures xsi:type="ecore:EAttribute" name="activeAccountCount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
63 changeable="false" volatile="true" transient="true" derived="true">
64 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
65 <details key="derivation" value="self.accounts->select(isActive)->size()"/>
66 </eAnnotations>
67 </eStructuralFeatures>
68 </eClassifiers>
69
70 <!-- AccountType: Enum for account types -->
71 <eClassifiers xsi:type="ecore:EEnum" name="AccountType">
72 <eLiterals name="SAVINGS" value="0"/>
73 <eLiterals name="CURRENT" value="1"/>
74 <eLiterals name="FIXED_DEPOSIT" value="2"/>
75 </eClassifiers>
76
77 <!-- Account: Bank account with balance constraints -->
78 <eClassifiers xsi:type="ecore:EClass" name="Account">
79 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
80 <details key="constraints" value="positiveBalance validAccountNumber sufficientMinimumBalance"/>
81 </eAnnotations>
82 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
83 <!-- Invariant: Balance must not be negative -->
84 <details key="positiveBalance" value="self.balance >= 0"/>
85 <!-- Invariant: Account number must be 10 digits -->
86 <details key="validAccountNumber" value="self.accountNumber.size() = 10"/>
87 <!-- Invariant: Savings accounts must maintain minimum balance -->
88 <details key="sufficientMinimumBalance" value="self.accountType = AccountType::SAVINGS implies self.balance >= self.minimumBalance"/>
89 </eAnnotations>
90 <eStructuralFeatures xsi:type="ecore:EAttribute" name="accountNumber" lowerBound="1"
91 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
92 <eStructuralFeatures xsi:type="ecore:EAttribute" name="accountType" lowerBound="1"
93 eType="#//AccountType" defaultValueLiteral="SAVINGS"/>
94 <eStructuralFeatures xsi:type="ecore:EAttribute" name="balance" lowerBound="1"
95 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble" defaultValueLiteral="0.0"/>
96 <eStructuralFeatures xsi:type="ecore:EAttribute" name="minimumBalance"
97 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble" defaultValueLiteral="100.0"/>
98 <eStructuralFeatures xsi:type="ecore:EAttribute" name="isActive"
99 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
100 <eStructuralFeatures xsi:type="ecore:EReference" name="bank" eType="#//Bank"
101 eOpposite="#//Bank/accounts"/>
102 <eStructuralFeatures xsi:type="ecore:EReference" name="owner" lowerBound="1" eType="#//Customer"
103 eOpposite="#//Customer/accounts"/>
104 <eStructuralFeatures xsi:type="ecore:EReference" name="transactions" upperBound="-1"
105 eType="#//Transaction" containment="true" eOpposite="#//Transaction/account"/>
106 <!-- Derived: Total deposits -->
107 <eStructuralFeatures xsi:type="ecore:EAttribute" name="totalDeposits" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"
108 changeable="false" volatile="true" transient="true" derived="true">
109 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
110 <details key="derivation" value="self.transactions->select(t | t.transactionType = TransactionType::DEPOSIT)->collect(amount)->sum()"/>
111 </eAnnotations>
112 </eStructuralFeatures>
113 <!-- Derived: Total withdrawals -->
114 <eStructuralFeatures xsi:type="ecore:EAttribute" name="totalWithdrawals" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"
115 changeable="false" volatile="true" transient="true" derived="true">
116 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
117 <details key="derivation" value="self.transactions->select(t | t.transactionType = TransactionType::WITHDRAWAL)->collect(amount)->sum()"/>
118 </eAnnotations>
119 </eStructuralFeatures>
120 <!-- Operation with pre/post conditions -->
121 <eOperations name="withdraw" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
122 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
123 <!-- Precondition: Amount must be positive -->
124 <details key="pre" value="amount > 0"/>
125 <!-- Precondition: Must have sufficient funds -->
126 <details key="pre" value="self.balance >= amount"/>
127 <!-- Postcondition: Balance is reduced -->
128 <details key="post" value="self.balance = self.balance@pre - amount"/>
129 </eAnnotations>
130 <eParameters name="amount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
131 </eOperations>
132 <eOperations name="deposit">
133 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
134 <!-- Precondition: Amount must be positive -->
135 <details key="pre" value="amount > 0"/>
136 <!-- Postcondition: Balance is increased -->
137 <details key="post" value="self.balance = self.balance@pre + amount"/>
138 </eAnnotations>
139 <eParameters name="amount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
140 </eOperations>
141 </eClassifiers>
142
143 <!-- TransactionType: Enum for transaction types -->
144 <eClassifiers xsi:type="ecore:EEnum" name="TransactionType">
145 <eLiterals name="DEPOSIT" value="0"/>
146 <eLiterals name="WITHDRAWAL" value="1"/>
147 <eLiterals name="TRANSFER" value="2"/>
148 </eClassifiers>
149
150 <!-- Transaction: Individual transaction record -->
151 <eClassifiers xsi:type="ecore:EClass" name="Transaction">
152 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore">
153 <details key="constraints" value="positiveAmount validDescription"/>
154 </eAnnotations>
155 <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL">
156 <!-- Invariant: Transaction amount must be positive -->
157 <details key="positiveAmount" value="self.amount > 0"/>
158 <!-- Invariant: Description must not be empty -->
159 <details key="validDescription" value="self.description.size() > 0"/>
160 </eAnnotations>
161 <eStructuralFeatures xsi:type="ecore:EAttribute" name="transactionId" lowerBound="1"
162 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
163 <eStructuralFeatures xsi:type="ecore:EAttribute" name="transactionType" lowerBound="1"
164 eType="#//TransactionType"/>
165 <eStructuralFeatures xsi:type="ecore:EAttribute" name="amount" lowerBound="1"
166 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
167 <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" lowerBound="1"
168 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
169 <eStructuralFeatures xsi:type="ecore:EAttribute" name="timestamp" lowerBound="1"
170 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
171 <eStructuralFeatures xsi:type="ecore:EReference" name="account" lowerBound="1" eType="#//Account"
172 eOpposite="#//Account/transactions"/>
173 </eClassifiers>
174</ecore:EPackage>