Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » Complex Map Modeling
Complex Map Modeling [message #416479] Tue, 05 February 2008 04:58 Go to next message
Jeff Lins is currently offline Jeff LinsFriend
Messages: 39
Registered: July 2009
Member
I have an abstract class that two other classes extend. I need a method
in this abstract class like this:

protected abstract EMap<MyClass, ?> getMap();


Then, I have two classes (not abstract) that extend this abstract class
that need to look like this:

Class 1
protected EMap<MyClass, ?> getMap();
public void setMap(EMap<MyClass, ADifferentClass>)

Class 2
protected EMap<MyClass, ?> getMap();
public void setMap(EMap<MyClass, SomeOtherClass>)


Is it possible to model something like this in EMF? I've modeled maps
before but nothing like this.
Re: Complex Map Modeling [message #416480 is a reply to message #416479] Tue, 05 February 2008 05:32 Go to previous messageGo to next message
Marcelo Paternostro is currently offline Marcelo PaternostroFriend
Messages: 602
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------050305050800070104040105
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

There are a few considerations that I have to make before answering your
question:

- You won't be able to model protected methods or attributes. The basic
idea is that everything that you model is, ultimately, accessible to the
clients of your code.

- As extensions of the abstract class, Class1 and Class2 inherit the get
method so you don't need to defined it again on each class.

- Is there a modeled attribute for the map or are you thinking on using
operations? If you are using an attribute, EMF would generate a
set(Map<MyClass,?>) method in the abstract class which would conflict
with the setters you want to define in the subclasses (a "Java" conflict
not an "EMF" one ;-). So I will assume that you are modeling operations.

All that said, I am attaching here a project with an ecore model that
has what I think you are trying to do.

Cheers,
Marcelo

Gigaplex wrote:
> I have an abstract class that two other classes extend. I need a method
> in this abstract class like this:
>
> protected abstract EMap<MyClass, ?> getMap();
>
>
> Then, I have two classes (not abstract) that extend this abstract class
> that need to look like this:
>
> Class 1
> protected EMap<MyClass, ?> getMap();
> public void setMap(EMap<MyClass, ADifferentClass>)
>
> Class 2
> protected EMap<MyClass, ?> getMap();
> public void setMap(EMap<MyClass, SomeOtherClass>)
>
>
> Is it possible to model something like this in EMF? I've modeled maps
> before but nothing like this.

--------------050305050800070104040105
Content-Type: application/x-zip-compressed;
name="prj.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="prj.zip"

UEsDBBQACAAIANEDRTgAAAAAAAAAAAAAAAAMAAAAYS8uY2xhc3NwYXRonZBB SwMxEIXPFfof
ltw7awXBw65FZIUWWqVde5U0Gbaj6SSdJGL/vdVaFKEevM0bvnnvMdXobeOK V5RInms1hHNV
IBtvibtaPbZ3gys1uu6fVcbpGINO673ofSvkJLvihdjWKopRxcfyMJanSeP5 SHrpAI2jEBGe
bQKnM5v1Ph0m8+bp9n7W3oxnzbz8zREnFNYOLK5yB5m+LlFgkTRbLXY5bXcB y8nFohkM4fIf
hYJFMF4QBLeZBO2Dyx1x/MvK5xRyOrqtiD/hqvz5wHdQSwcIY3PMwM4AAAB2 AQAAUEsDBBQA
CAAIANEDRTgAAAAAAAAAAAAAAAAKAAAAYS8ucHJvamVjdL2Sz4rCMBDGzwq+ g/Ru4t48xAru
4k1Z6O4DxGSsKc0fklT28TdJU6WI4EE8Zb4v8/EbhiGbP9nOL2Cd0GpdfKBl MQfFNBeqXhe/
P7vFqtiUsykxVjfA/Bc4ZoXxoTu4E6KohJISnN5oMC0lKF8SPFTRzWmXBB6p YydaXhlgUWX5
GaJU8eRkhrY1AtYK4wA13COmbSjohaYA2NsIIUFt3UW2yxqPDYLvKE9xDQe0 p0qcwPnte7EV
O4OkL4FmZ1h54PnOQu7uxeNt9/9xgNT3KBNH/m67WqjDXWCoI/F6C+O7+gdQ SwcIEUXx/eIA
AACWAgAAUEsDBBQACAAIANEDRTgAAAAAAAAAAAAAAAASAAAAYS9idWlsZC5w cm9wZXJ0aWVz
dY4xCgIxEEX7gblDwC01uYAKFgpbaGVpo8mwRrI7YZKA3t7EbmGd7r0Hw0dY qa3l+BE/PPMe
G5oZN9X1rkNAePhJ+8mG4iipndLrG4Ka38iOglkI5+P1sOkvp6UWQxnq6/cY /scoHEmyp4Tw
ukvSlsfoA2kWR9LWICQuYknrSkmsQeCSY8k/UbdX8QVQSwcIw7mUpIwAAADw AAAAUEsDBBQA
CAAIANEDRTgAAAAAAAAAAAAAAAATAAAAYS9wbHVnaW4ucHJvcGVydGllc61R QWrDMBC8G/yH
IY1vwb2XphCwC4HGDo4+oNobW1SRhOxEze8rWS20tx6s0+7O7uzsKE0e8Nxq c7eiH6aXNKSP
f/JQWu+7dZqEaLvACzxMo9UdoaMbSW3IPoUqUGhUNUM7cNUTpoFgbIAnQSPe aXJEypfFCCkU
gasuNMXZVZZlKKsC9StYs6tObztWFjg29bFs2L48wTes5sE8Thz4h+eAIvez 5g7FL7QBN4YC
t541hFCf5/AsZFwbJUaeAMzn+P7rGHX/Js2Xs27JT/iPX0sqN/LaC1V5g7H1 3psRB2+a9IDV
N9GR/Yacczl98ouRlGvbp8kXUEsHCNYC8N31AAAApgIAAFBLAwQUAAgACADR A0U4AAAAAAAA
AAAAAAAADAAAAGEvcGx1Z2luLnhtbE1PsW7DIBDdLfkfrqesQKsuHbC9RcpQ KUMzVwhfKQoG
BE6V/n0gdp3egO69e/ceJ4fr5OCHUrbBd/jCnxHI6zBabzo8fezZGw5928iB tLMx00P7WrR1
VIZPjLUNSB3ib7Lme+4rEv9hIXaHcdc2jC0r0V2M9csEJF1n8tUWYrB+7jAk w9dETtNX6UMi
bshTUjONn1HpszKENamUXDEssNQlWegAK48PVjuV8x/Pj+U5rkabpGS8h5Fc VU21EZOKuUbf
EYLo735SbJ9eLhLbSTdQSwcIJaXEHNAAAABVAQAAUEsDBBQACAAIANEDRTgA AAAAAAAAAAAA
AAAWAAAAYS9NRVRBLUlORi9NQU5JRkVTVC5NRlWQzWrDMBCE7wa/gy69VaIJ 9KKQS4svJSmh
ht4VeeMu1Y+7kkycp69sB9c9aZeZnW/QUTm8QIj8Eyigd5JtxFNZvCTXGODH u7qI20V6VxYk
e+hMatGNy6LUgz17g3p2qB0L6FoDMd/vI6U/4xq5gr4aFcJJxS/JxMrrGk8j kHyPDdA/5MFr
ZfCm4hQ3d1rED/hJSNBUV9BpdFSuR/LOgouSvW3rim/Ec1lU185T5Celv1Wb m3d5eCyL6RVo
O7MsOcWUxT2XzxjJPLUCtMEugNCeQFByES2MZ2sN7CXP2bDrMeAZDcZB7glg 4uces48f1G2o
o6Jccv62X1BLBwiUHlin+QAAAKwBAABQSwMEFAAIAAgA0QNFOAAAAAAAAAAA AAAAABIAAABh
L21vZGVsL21hcHMuZWNvcmXtVVtPwjAUfjfhPyz1GQrzxSwMgoKGRAIRSHyt 82w00m5pi8N/
7+kusClEMSHxwb2157uc850m6/a3Yu28gdI8lj7ptNrEARnEL1xGPlku7prX pN9rXHQhiBV4
oxkLXlkEzlZwb8dykdW4cPBDMak9LPpkZUziUZqmaSsWUStWEX2ajEkJ0XVI epUh3Ha7g7CH
ebACwZpcasNkADX1rJMaGYI1TzRkCiBCq+LSkYURRzKB4ATbLkSkXj6Oixs8 zBSEfFucexbS
hds105qHHOdzsFHPvCeoUSSQFUvdG6bRgz1ro1hgfGLUBnIVqzNNQDGDEekC HoGZsKQEWMg9
SFA8WKCDU/HduQ2ZYVnxR+NeUjqqGVgLSx+oaCNAGl03QXw2AT1O2Je6tNpt OSStTJnHR6v5
nZxodujgI5xvUNc66X2fx5PVX5KdMYUVYx1ziPgczNmz/0X631MGQx6GoLCW 51bb3aEVZdf7
NM66OPd/cUcp81jA1KxA/a29HX5PpygcGAx7qv0v8OoDUEsHCLhK2LmKAQAA agYAAFBLAwQU
AAgACADRA0U4AAAAAAAAAAAAAAAAFQAAAGEvbW9kZWwvbWFwcy5nZW5tb2Rl bL1UXYsTMRR9
X9j/EK7PNt0BQUrTRS2VBesWVPA1ztxJg/kiybbdf28mmfQDVxFdnKfJufec nHMnk/ntQSuy
Qx+kNQxuJlMgaFrbSSMYfPm8evkabhfXV3OBRtsO1ew9mvXwQg5azo7EJhGv r0h6kp4Js1Rk
sI3RzSjd7/cTq8XEekG/ru9gbKmKF33YKukC5l7UPW2m04bWLYFkwlJ6bKP1 jwwop8G3487Y
yXhWgwxYfwFlgY16ENLcLRnwEfnINTJYcxeARAwxnJOKutTO+oh+oCV3R6fJ 5aTWEmg9Ammt
dkpy0+IH3A0JXw1zba179FJs40qi6gKDnquAsBj0530iSlFyLnQyUrTm9KKQ W9PgNrz9zgUG
4jz28sBgAIB0Mjgb+DeFG293skO/4mOK6B+Ssaw5khmctnlBi42i/k7xEJK4 1Lmt2CzcXLpk
0re8pqgC9w49j+lghMI6rp9gUoExDR5oNUBPDp7w9EsXGbv5Ox+FS0NxcpSo s/bpdKSvG+r4
xvXvRKg+izSGOrl5jqjNP0RtniNq8z+ivlnKvkePJubq6ZT8CfmT1Xgft+jP udlJ/X+Gm43+
dLUl9AdQSwcIVW4Txb0BAAAYBQAAUEsDBBQACAAIANEDRTgAAAAAAAAAAAAA AAAfAAAAYS9z
cmMvcGFjay9BRGlmZmVyZW50Q2xhc3MuamF2YWVQQU7DMBC8W/IftqJSIZLj BxBFVJQDJ/oF
x5m4hsSObFcCIf5OalMqymU93h3N7KysKs6ookb7+SNYc0ht+cu/jdxcP/fr E5CczUq/KQM6
vfeccWan2YdEPpgaerRzRI1pWLAPqJ9eulfolIny7LgSgjoY68QxIojeaxKi uG8pYA6IcEkl
6x35gdIBNPkeI/ksRpsGU9t07XZnhwFh4dLjqGJsZNc2cplt6osRXP/P5jfX Q0RJUu+Xsi/R
bgzSRTor394Vel6jQAOHoBL6812O3Wg1WZcQBqVBVxKE97TsEunnJJx9cvZF Ul4TOfsGUEsH
CKLOaHvvAAAAmwEAAFBLAwQUAAgACADRA0U4AAAAAAAAAAAAAAAAFAAAAGEv c3JjL3BhY2sv
QmFzZS5qYXZhfZFNTsMwEIX3kXKHIVRqGxH7AKThR2LBAtErOM4kdZvYlj1B IMTdcWJKi5C6
sT2e0fP3nnmepwnkUEpjP5zqdlTFmv+9mC8Xz81iOvA0sUIeRIcw7bdpkiZq sMYR7MWbYCOp
nr0Ie94wrmMoe2U9MhzacDYO2dNrvUdJ8yA/olwVBdTYKV2MHl3RGAlFEbEe wKF16FGTIGU0
mBZohzCYBnswsxgsSxyqsq4ehceS11XJQ71kJ3HUzT/pX5P3HqMttg3LNvq8 7pAmudU6zsT3
RO3JCUmbjNyIWWx1qNEJwuaY1Fj3SoLShK4VEmHSAXynQOHhJ4A0+QzjECOA iyHABRdwYjso
3WwyYyeWEFR27J7jwQwIEL6qnKhu4K6C4DTUq/X8J1/A+QycJt9QSwcIVBrQ FysBAAAqAgAA
UEsDBBQACAAIANEDRTgAAAAAAAAAAAAAAAAWAAAAYS9zcmMvcGFjay9DbGFz czEuamF2YX2R
307DIBTG75v0HT7jkm2NlHht0zj1xguTvQItpx2zBQJ00RjfXVacf5NdAIfD 4Xy/D3hR5BkK
VK2xr071u1CnPf+dmJOLR7k4BjzPrGifRU84rjd5lmdqtMYF7MVBlFNQQ/kk 7HzATwoXjKGh
Xmk2eXJMmhaMJbUNHFlHnnQQQRkN0yHsCKORNMA0e2oDlhWNddXU94Pw/rri TV3xmFmW3+1J
y3/Nv+hvPSXechunbTJw2VNIDVfrVDVrprAnTU4EkifTUzOoFkoHcp1oCekm 6CVEZY874SnP
3mI1kmuc9Y0z2PiJgr8wmHGAg1ESnkJ861Uc1RHgCpsH1XXk4mPOfDVGYdfz X7yD80/oPPsA
UEsHCJASJaIQAQAA+wEAAFBLAwQUAAgACADRA0U4AAAAAAAAAAAAAAAAFgAA AGEvc3JjL3Bh
Y2svQ2xhc3MyLmphdmF9kctuwyAQRfdI/odbNVISqzZSt0VWH6suqkbqF2CY OKS2sQBHrar+
e7Fp+pSyAIZhmHsu8DzPGHIIZYdXZ5pdqNKe/07MycW9XkwBz9gg1bNsCNN6 lbGMmW6wLmAv
D7Icg2nLBznMB/yocFYUqKkxfTF6coW2CkWR1G7gaHDkqQ8yGNvDbhF2hM5q amHrPamApaCu
EnV110rvLwWvK8FjZll+t6de/2v+RX/tKfGWmzhtkoHzhkJquFqnqlkzhQ31 5GQgfTQ91q1R
MH0gt5WKkG6CXkJU9riVnjL2FquRXOOkb5zAxk8U/IXBjAMcrNHwFOJbr+IQ E8AFnmxHj/H5
3IxXoZPDev6Kd3D+yZyxD1BLBwiCi3ESEAEAAPoBAABQSwMEFAAIAAgA0QNF OAAAAAAAAAAA
AAAAABsAAABhL3NyYy9wYWNrL1BhY2tGYWN0b3J5LmphdmG9lFtLwzAUx98L /Q5HEKaDtrhX
61C8wF6mqF8gTU+7aJuUJFOH+N3NbdjNObyxlzY5ObffP+3JhsM4giHkVHQL yeqZHvt9tmpw
xv1JuW8XWRx1hD6SGsG+j+MojljbCalByDpF2rBOYYptZdZCYnp5RagWcuE8 s2XJvSSBAmvG
k7lCmZSCQpL48vczhLwYh7A8K8ZQCQnamFtRYpM6r4mGToonVqICAlQi0eYc 9UyUzh0JnQEX
PCGF0tLkAtoQpUBU65lcL8jLz52cKvSU6Y153Hhsf1IjR2lKlktN5kXDKDCu UVaEIljvgAD4
ok1+BUsp4ujVhIEXAwKyYrxuUAtukihNuMkReq18VBqcv9YOttDAetfg+obV RifTu/uz6fkl
nHhuc7NN2vOY2D3jTB8cuvvsQ9yinktub4PjM4jiAY3oBsHrPsixHZ/b5VGe meXgH3Ckq/jT
ghtV8I7hO/KbPyCOdo04+i7iqI84+h3i2QWrKpTItc+5Q9jtpTdif4S4iMC/ Zv2dEHeiRbg2
v6jcuRDbS28Uwoa4iL4Oq8YtMthBtBz8at7ZgY8lFAtzwNQ/jqiA/qNyX861 MLKhRt3bBso3
yLLeaIujd1BLBwgl4TBaygEAABAHAABQSwMEFAAIAAgA0QNFOAAAAAAAAAAA AAAAABsAAABh
L3NyYy9wYWNrL1BhY2tQYWNrYWdlLmphdmHFmF1v2kgUhu+R+A9ns5XSZhd7 4/auFIUmRovU
kgqItHdosA/EG2Oj8SA1qvLfdz5sgz8x2HivwDNjzznPe+yZefWbm24HbqBv +dtX6qyf2UBd
68kG2fhubL8Tf/RuZ0usF7JGEL+fu51ux9lsfcrAp2sNLdfZBqjhZsX/+xQ1 894lQfD52Kgf
6qHyeXoU2G+9Hixx7Xi9XYC0Z/sW9HoqyPkzQn85CG/r68sBrHwKjDdvfBtd TY4aM7B8jxHH
C4BYFgaBT4P9QGQE/OW/aLEAmA8UtxQD9JiafeeqqQD6rjNAYj2DJXL5s6/z 63TXCgnbUQR/
BceGorfbZHqIZ6sbbcKjYq9b3I/o61EsEgl6dhbIXYBKEk0wGRGL+fRV9Ugg 8OJ49perULwr
1bNGDylhaEfS7pauY4HjMaQrYiGIZ4WMAX8yPnMAkVbdzi9+Gyi1INQkKg6P bFAL24t1hJKU
IB0gyBABZow63hpwMvxuwheQKV3JwikLJtiKfJ6m40tHNVvwSU6Nqw1cs8WP qTka/1MeW8AH
u8h8j1dBwIhnyZJm+6gvFGai0saT2Xw4uRfyypLm3w5XOxgxFteO57D3H3KT OHizwbHjF/76
153reC8Hz/xKAvkw6ONmIC76Ov/zdq1e3wZSjd/KxHT5vakEf18jEze8/1DG jb+r8HU4E6j+
ymXBPzZLpELEgNGdxT9SxI2+VkGk7XUi/+bST0UMdz61keYmsBiZw/nT1Fzc Pz5N5oXpVJZW
rju3sbjq8rLy7qesLLC65bjE99+Gs9ktp3JbU+QDDq3LrJLICJ2j/h+NqG8k 1TdaUN84XX2j
ovoGR2U0ob7xP6pvtKL+8MFZrXgIniIcl8G+HWTHZQsiJ4rKlZG693iJDB/G o5E5NSfzhQTN
yX6sWSy5tFovm3RiTa8TM3+Dj7yLJktFNINsb6NUskFUrpTkrccLZfb43Vw8 zv82p3GhfKpZ
KLmsWi+UdGIFhZJMdIo8HX46TJ0HZb3I+JMVI7ZI6b1iAxlSGUVZEMn9mZap DtFXprw6hkO8
pcwofiIItY3I7qxag3G4j8niUL3VgERbsEaQGNntRrtIjFIkxglIjPpIUqtY 2RrcGqX8VS3L
KxV7NXCZZbsuweTXvWxlag1g/tc+CzAZejV+6cWsFN9KmVz8P2FgUb4yoeqI nIt4lYotweYA
nTl5ofcROnYCwsFlDoHy8B9w5Xh8btdhfBq3yOwUQR/anbA3PKHM8kx1lpue qcEJ23PfV2x8
woH1eZantPcxv4U4RKt0LfdE8zaMIb2axtExtcpzOmYfnWwg5WCKQMWvYOgk xQaclt4w1OVW
1ZVpnF3KmznDnanCL7ZpEgRTO4xGGFbwNi7D0DiHoXEqQyOXodEYwxoOQeNY i3yCOk5BFdA5
lkECedFmpi7780/cjaMvOHfXOHlXAZ9zBE+AL9gFvYmfN9D1g1i6nf8AUEsH CD9f1yxIBAAA
xx0AAFBLAwQUAAgACADRA0U4AAAAAAAAAAAAAAAAHgAAAGEvc3JjL3BhY2sv U29tZU90aGVy
Q2xhc3MuamF2YWVQ0UrEMBB8D+QfVjw4LaT5AEtRxAef7sAvSNNpLmeblCQH ivjvtomnnL4k
s7vDzM7KquKMKmq0n9+DNYfUllpeNnJz89xvViA5m5V+VQa0/neccWan2YdE PpgaerRzRI1p
WLAPqJ923RE6ZaI8O14JQR2MdeIUEUTvNQlR3B8oYA6IcEkl6x35gdIBNPke I/ksRtsGU9t0
7YufQLtlHOhxVDE2smsbucy29a8RXP/P5ifXfURJUu+XZ1+iXRukVTorZ+Gb 28LOWxRo4BBU
Qn8+y6kbrSbrEsKgNOhSgfCWlk0ifR+Esw/OPknKPzzOvgBQSwcItGwf//EA AACYAQAAUEsD
BBQACAAIANEDRTgAAAAAAAAAAAAAAAAoAAAAYS9zcmMvcGFjay9pbXBsL0FE aWZmZXJlbnRD
bGFzc0ltcGwuamF2YbWSXWuDMBSG7wX/wxkUuhY0P6AiLZ2FQlnLuvuh8Wiz aRJiHBuj/31J
ROwX3dVu9Jx8vOc5bw6ZTn0PphBRIb8VKw867nJyvuAWR+t8ZAPiezKlH2mJ YP8hq2U18z3f
M4FQGoQqQ6QVkw2GWBcmFgrDZFmlTfP3OasWJtvsHaleXyi7cosnVhSokOte 8XR3Zz67js7d
JH2HD0EAGZaMB22DKsgFhSDoul1wsFWxNpqpZoKDKEAfEGqRYwXCscA4wjqO snioDw4gIlkc
EbM3DodKyPPrOpHs3ZWDq/MSOapUY95722YVo0CtNlw0aw0B/NJGvoETkwb+ qyu+92OEofMB
7joBd+jhEhUcLIBUQhsKzG+xPk7sEQcA0LQS1eNkZrOjfZt/pJpvP1EpluM5 YjeEgHv7ztQl
Z4gKdas4nAxRuGHaqFeNmbv1apW8JM+vb8vNYr8f+jgCITea971fUEsHCMe6 txVeAQAAXwMA
AFBLAwQUAAgACADRA0U4AAAAAAAAAAAAAAAAHQAAAGEvc3JjL3BhY2svaW1w bC9CYXNlSW1w
bC5qYXZhvVNNT9wwEL1Hyn+YSkjAqnHu3SgF2hyQWoIE/ADHHrKGxLbsyQJC /PfaCcsmINFT
e0lmxqP33nzlq1WawAoKYeyTU+2GysnPl4ExeHAuD6KRp4nl4p63CPHPVG+7 dZqkSTCMI7jj
W84GUh37ze38wbiWoeiU9ciwvw22cciqHx33/u95kYZVdXOHgs7fUY46zrjH 9TJ0GT6Xk9Yx
Pd/V+yXLoMFW6Wzw6DJpBGTZVPuphkiFPWripIwGcwu0QeiNxA7MKAAOC+zL oikjaZE3ZZEH
/5Dt0VHLj9iF3fXX7vt60qJGxwnlrrtD0ykBvPHkeOASsUEQmWLdgI8UwD3M erFXPOWlyXPA
gqlc+LRg+EQwvFcHoz4A6wwFapRvqo6OY3xkBfCDRXd0vI7eS+z7P5RyUm/R OSVxqWvaKsCr
OEMxOguJDmlwGmYLwn4pCuidZ2enV9V/0f466HAmRezjV/heQosU/IXWPIfr +mf9bT/lsI/K
Q4+0MfItp9J+cBieOMGTGUKJvdnijDkcFvTc3YOiefSivp4waOPMA2h8gJsA ZeMZoaxtTAtn
UD0KtNGYD/YlEO9WIE3+AFBLBwhT4hjDugEAAE8EAABQSwMEFAAIAAgA0QNF OAAAAAAAAAAA
AAAAAB8AAABhL3NyYy9wYWNrL2ltcGwvQ2xhc3MxSW1wbC5qYXZhvVNNT+Mw EL1Hyn+YlZAo
1cYR1yWK6EIPSCxBKvwAJ56mhiS2bKeAEP99xwmhbpG4waHpeGb05r35SOfz OII5ZJXSL0bW
G5eP73TfMTiPrsSRN9I40rx65DWC/2ey1c1ZHMURGco4eOBbznonG/aP6zCg TM2waqS2yLBd
k60MsuVFw60N8wbUxaVcr9Fg56Z4GP3LLR64hrTTA+ctfW5HskOFdBL8K0mg xFp2SW/RJEJV
kCSj+EUHXhK2VJs7qTpQa3AbhFYJbECVD1g5OM6wzbMyH8tmaZlnKXmO2Q4f O/EZPdNTi/Wu
tec1dmi4QzE1uC8bWUHlwWEscUWcAJ8doVrw+gfHB9MpLY5eCQNGofClVPiC KByygoEXgDbK
kX4UAa3ZiY8MdQFsr9HMTs786833/BvJnBdbNEYK3Gc2rhTgys+vGh57FA26 3nQQLAe7lo7Q
G8surher1emPsH8f8lZJARYdXcuMfpmf7W842P8cWq5DDWkKd8Vl8We3AbSj 0kKLbqPER86y
s71BCnEHL6on6a3aYsCHrpKgzSNIF3pvirsRw22MeoIOn+CeoLQ/LRSF9ml0 GsvnCrU3woG/
UeHdcsTRf1BLBwiNpfscxgEAAGYEAABQSwMEFAAIAAgA0QNFOAAAAAAAAAAA AAAAAB8AAABh
L3NyYy9wYWNrL2ltcGwvQ2xhc3MySW1wbC5qYXZhvVPbTuMwEH2PlH8YJCRK RRyJx20Ucdk+
ILEbpLIf4MRDakhsy3YKaMW/7zjZkqRIvMFD0/HM6Mw5c0mXyziCJWSVNq9W 1lufD+907uid
xzfiOBhpHBlePfEaIfwz2ZpmFUdxRIa2Hh75jrPOy4b94mYa0LZmWDXSOGTY PpCtLbL1dcOd
m+b1qFfc4Wru6hPPD5x39Lkb6BxENrrFwm/RjgXSvd6jJIESa6mSzqFNhK4g SQbtlwqCImxR
ee6lVqAfgGCg1QIb0OUjVh5OMmzzrMwHTlla5llKnhM24qMSH9Ezs++wGTt7 UaNCyz2KfX+7
spEVVAEchhI3xAnwxROqg9Cc3vHOdJ8WR38JAwah8KlU+IQoHLKCnheAsdqT fhQTWovTEOnr
ArjOoF2crsLrLfT8C8lcFDu0VgqcMxs2CnAT5lf1jxlFi76zCiabw26lJ/TG sevby83m/FvY
/x/yTksBDj0dy4J+WZjtGcyXN4eWm6mENIX74mfxY1wAWlHpoEW/1eI9Z61c Z5FC3MOr7kh5
q3c4oUM3SdD2CaSfen8X9wOG31r9DAqf4Q9BmXBcKAoT0ugy1i8VmmBM5/1G hcfdiKN/UEsH
CMR7MKHFAQAAZAQAAFBLAwQUAAgACADRA0U4AAAAAAAAAAAAAAAAJAAAAGEv c3JjL3BhY2sv
aW1wbC9QYWNrRmFjdG9yeUltcGwuamF2Yb1W227iMBB9R+IfpqjSJl0RVB5L WxVBqkXaharw
XgVnErwbksgxvWjVf19fEuKYS/eh5Sljezw+Z+Z44t7FRbsFF3BNsvyN0XjF b/W415xQk+eT
8FwavXYrD8ifIEaQX4+u82TQbrVbwsgYh4zFHpKE5gV6uI6EnTH0/FESFMXg I6/Z8jcS/qHb
gwbw8bESnOffB4Rn7G3yX0jzZBPT1PPl4EHZ5h5F+ULN9KrsnXW7sETh2N0U yLphRqDb1Zkc
piAh4BpTHnCapZBFwFcI6yzEBK6XtyW2697y1qvDYRruBruLMUUWcAyrOmyW CSVAZGpB5sQg
CvjKRZQCTPY1mIZ/u/VXRARNCMRJI4bimEIhDTEKNgmHSPtafLxyx+EkwBFO YLMCxQugZFbI
Q4gJFWhKueNKH4UZgEv80ijH0HAXDMzhDTjG0K2E5D0K5IWI5E2m88VwOvK9 GHmVOacjq95x
B1CdQCNwrMhnN5BuksStXLZoABjyDUstKINq/V0b5YcEnKzA8V8J5kovWFmu xdIQaI06yWKn
3jFohC5hpPhia8XRnu9S1ftkEAgVp6IWKcFKv6Uavrb8OzCNshebHNkh4J8M 5272jIzREA1s
ZasConLk6P4GqD4NnC9UVVSvSFkpg0YU2WTsuHZZSVCgIl5Jc/RzOJ9fXlXl 0+epGJeOOzi+
rb9vW//YtuF4cn/vP/rTxZOKYAUYjmkUIRO3X4U6Fmk+++U/zRY//Me9kebZ GmdCScwOVPab
q/r+8BXLXpRuJ0mCcZAMWbyRHWh7S5zOQmhS98FvHfgOdbanwRodV0x1vgEt IM04BPAcJDTU
/qoQncZV+Wo5lQrSNbQKaihHT6m2TbTrjUpCPb/NWpVZtXKSK2Fy6Fvqsjn0 aw59k0P/IIf+
KTlYmj6kdIOVtaboBVYUzXOPp03Y2nhK5s07eOBiGrybS4p20QyhWe/62aSb 207J2WhRINqD
MWxQLXE6xrornwRb30/HHGLOkNSgD/yKxg233XeSxe0AL7NRY/V6qCm9Q69n /XzbrX9QSwcI
ScNXIQ0DAAAuDAAAUEsDBBQACAAIANEDRTgAAAAAAAAAAAAAAAAkAAAAYS9z cmMvcGFjay9p
bXBsL1BhY2tQYWNrYWdlSW1wbC5qYXZh5Vlbb9s2FH4PkP9wegHqFIqy+LFp s7qO0xlYnMx2
gb0FtETbXG3REOmkbpH/vsObSMmyna5dPGAviUQdnvPxXD4e0ievXx8ewGt4 m/DFKmeTqTw3
7yflAT34spu+VA8nhwcLknwmEwrqf8zmi9nZ4cHhAT7wXALPJzFNZmwhaEzn Y3zmOY077RkR
4myX1Eea0Zwlw9WC7pS9XtCcSMaznZI3Bu9ulGothXi3sjC92tYFG49pTjNZ WZD++oEIWhnS
Yqd1g83KoDJ7SRLJ81XNF7+G8MuAz+m1nNLcoTk8OHFBfXZ8DCM6YdnxUtD8 OOUJHB+bALcy
UEulc1yHdiHwMaAamPOUzuDt6Nyae3syOo+9Opql68reT1TQiKSpS4/laMYS SBQkCLArhwL9
IlGLgNDLHkxJ/vDgG2oEsyDYuiTYghCqGEGjBFjk7A6HwOQmjDB49vEdZMuZ Cf7T2df+Ot07
guY+EZByee0TiiiV1nYk7ZziTISPdZUJSbKEbquoCHJELSQuNIV7JqdWzbf3 M5Z93sFicV/P
zVewNvIAo5U2unAFpNU6uv7U78IdmS1p7Fy0OO9xSd/oOWgkp4mEe4I6OCR6 SaE2YALuGNFD
QtFGYtWMDWnBnMopT90qXrCMSVB/GkcPEdxPWTIFMhMckLfHPJ8LO12JMDJj X0tMZI1G6A30
llzmmdDjgeeciNMzBp5RNIHI0xUSDcqJ+MdzRVD62JCEU6rM/YL2BrcYglDm hXHPY7KywqNm
kuZHALFElzas/giCjSSm3d5g2Oq1O0dnSvbhiWrI5AeMOJ9RVRSiiwvFkL3D ZJkJuqmAfGHg
I8lSnxvURL9cR4BphMPMZZKuNTNRfSHZCriqYAHLBWaWSUFMypQu1B4UAwz0 zmOnm2GaJUyV
co6rwEWIMUPcWFcJmWFeT7Q9l+qoFEcr06VLTNxSKOKgkHI1EeHgXHyg6AG0 PQwUpeg3uqEg
1FJYhj6pMZAyVbOzVYQSOJojGurwKGIxaItaYlLQ2Tgo/+txScL4HHfhkj3l j0gt1NvVrrRq
puSOQsYlrKjEFdMsrFFDSCz35GNcO2a5kJZkbAJp436q9hD1JtUsVJUFOaHy A+Q9x3SjC/HG
ZQGV5NjQLh/9he4RJhsQf5lbjE6LwcUKo+Tg4FtgKwLBNK9nhYJXos7YHAk0 p7iLIY1aVRhj
oXcEkumEDCLQze54EjCfz4l7hoiVXwluiUjMKp0L5HJKpPa8A2tZT/s/QP2T +K+WvIznbD22
OaYMNnCezQqCM1A2ytXyiGkhLY0E3AeeMS35Ie03HL8c2a0CGsGUozWajh0p xhMq3ddwSmyX
e2SJCqnqBK5HkmC+YSrZvTHM19KWu9b0YszDNbwr4VMSR41HgnTAij4Dk6Zq 7df1zmCHsjeQ
0fv1LcYvPyBwmS9p6BZD3QWD6IJIiSSuHoxg2QPxhtQJ9XaLzClKtNBdq3NL qoV6r0j+OUCJ
rQ7LUpaoNeDWkJDslWIxSKYkm9icrFoa55R+pYFam3VlsafZcE2h2PYUg6uO oKX6sNj86WY/
uMw5uA5ZeO7ZI7bmRmzNfWKrXDjUgaw9NO0Hbfk+og5s3bHqKbEGzbECHLzW oW0E348Uddrn
rmXfxtO21b6fbltK3NFQmyNofUMUdEKVbrRoqCdLgl1gqkjSdnmuGVGdL/Yj zHcvo6XUraPu
7H5C27ElhnecpbCl+yh1BtZTrjU4cxua9+CGHU3Xvj7Up7aHHeP4Mrd9evm+ yKAxr40PrUHH
bw6Ve52SZPv31mBwWpFtbpFtetlNdyWlSa2L7uVlp9/pDW/1fD99w/1Gafbg +qpzez38rdP3
s/eR7d2g5d+Y8Vwd5eyVxdY7heKU4wvDFoA/QZgy+E8XwI7Weq09tg5cK4Sy c6vFELRhpRZX
UNkjc9VDtq7s5YIZFDd4+GFfdHN50+9cdv8sfcV+s1HXXduik6sF1QdZjAEe 3AOBgTpd8qW6
O9bstVGwlabmRkSJCH2XZSp5vRx1NzxQsuoXB3RcTNK0oQ5hcdFKOfRhaT52 Xm0zG9CKI5Qz
wPnA3Q8a5mO4OB0p1GHr0lNPBMpanJjn5+rleQTdwW3rw2DYb7WHETzDt25v 2Olfttod/e1j
p9fpt4adi1t3LKiSg/9xBVFhViA8P1Qyr+5D0TAu+4os0PQvEZxqI5963T8+ GXvX/QukoAvn
yfBXHpicetIJxhv6hs013MrdqN4Ho6yiWa+iPo6TU61OSbTyyXJuKkYHcNIs hDao/C4lOmDe
a3wR4bzgTOXjGeZkBKZVLmJqXp+bQP5YWGtiWTZtoym+I5r/LIBPGDOncq2T /i7tyms3riJt
LNFT88e4qT7ezVK8m+V4N//VeDf/D/GunkX2F+7aTi2CSkIWCVAZ/ymZEKCp a/wiKHurwFIe
/ilQ/GaPOx9f5ontKEwo+3YsbBJsy/mAUyt3VIcHfwNQSwcIrGbnvjQHAADE IAAAUEsDBBQA
CAAIANEDRTgAAAAAAAAAAAAAAAAnAAAAYS9zcmMvcGFjay9pbXBsL1NvbWVP dGhlckNsYXNz
SW1wbC5qYXZhtVJba4MwFH4X/A9nUOgFTH5ARVqKsEKHZe69aDy12dSEGMfG 6H9fEinOdnRP
e0nOyeW7JXSx8D1YQMiE/FS8POmo7+l4wS1OtsXEFtT3ZMbeshLBzoTXslr6 nu+ZQigNQpUE
WcVliwTro6mFQhJvqqxt/z5n0Uic5K/I9PYK2dHtzbDv+ZfjnVTUmOgTqoGK Xgw+BAHkWPIm
6FpUQSEYBEFvdt2AJcUaG51pLhoQRzAwUIsCKxBOCkxDrKMwjywJOBZwNCHN o5CavSkZmLAp
bnlCeQlXDqGuSmxQZRqLS7RdXnEGzGLD2JGNA/BDG/QWfkQ0yL++4XtfBhb6 FOBuDnBHO1wL
BScVQCqhjQgsflE6m9sTjh+g7SSq2Xxpu7N9mH8UtUreUSle4Fhh/wEBU/vI zDUjiQp1pxr4
8b3IjmuDXrUkTZ7iQ/LyGD8fNrt1mg4+zkDprXff+wZQSwcIJ86tF1sBAABa AwAAUEsDBBQA
CAAIANEDRTgAAAAAAAAAAAAAAAAnAAAAYS9zcmMvcGFjay91dGlsL1BhY2tB ZGFwdGVyRmFj
dG9yeS5qYXZh7VhRb+I4EH5H4j/MSSs1VCLoeIWi9npdqS/t6tqHvppkAr5N YuSY5dCK/34z
tgNJKDRs2T61UpvEHs98/r7xeNTB5WW3A5cwjtRireVsbibue1AfsINf7uMv /DLodhYi+i5m
CPwMl0amo26n25HZQmkDSs9CjFK5KDDELAkjlWUqD3NlZLIOb2KxMKhHLc0f +CGtfcsVZJSW
Ub6KyCi9vqehYw4wUhrDu8fpvxiZqqHd36UdGZRU/dHvwxRnMu8vC9T9WEXQ 7zvanucI4+nE
BwcffTyYTiBRGgxNZyrGNLTW9+Rfqx8yxgJEDsKvIi1inEQahcGXlxeWgr4h QzNXsfWDIppD
lIqiAJU0vVp8mMf76K4L9Ip9oz/fnIRuZoY5aooXl/oup6mMfAy2rPMJ+J+h EAXs09zt/CQf
4NgCz0lEgDF2KMHnTujnD/MJR3YDTdRgcQMzakhEilYYYWgPlb06AP7DiloF emsZt1LInBbn
EZb0ltIkbp+/C7ojfZ/uoMfTllcAmUBQ3QdcXUG+TNOem/ZWAHWbKg0h3j88 Pd883N6NnPGG
H5smH/+gWeq8gNWcMg85e2VRMgD0KhYLgiumKW6T26wXW86UPUztqHpm13xu McOcZVM5aB/e
HQejl1ieBFkNwEhQeoBe4YuiTDI66RZqVVK3rHlw3lTM4TkPG6/Kf/34A7Wm alDJhalSKTL6
wqfCV6WfyW3w6HdhH8308FukxKgmQTNB/IaY2Woe1FyUrNEufHU84CUIynkP KcRbLh5BL5yh
ufMQgl4TVD2yd5aItHAze0nJ1aRYSUMF0MyFAfKEM3tsjbJEH62exW8vOryt J4tv7M/wxO3X
DcKV22iOq9dMgya7tZzgH58X5Q0TiQL/ot+A/1SzoeZlS6yjhW29g6A3Ko02 p8S02v4ZuEfb
uM76HJGHLvLwpMjDd0a++VsmCWoqUC6zG99tsTSWvRPUk8rwkQuSw1T/bAup vuodiGJMxDI1
t5yRd/sl6hgGb34w+ObYfb29n33l9XeG0FR7fAU4w8lfCC0ycF6rNxBVHgtg W93LylrtHN5G
1vpS2Orv8skzVjbKHmD1TvB4KnUojJV72dVtv2xXdg+wbWtXdVvE/+5OdR3j xc/rVObfXbNp
S9MYswm/jAf0srk4oS3wOXWoPeDWBwrlboMVt5o59ceFTOlWnuXU1ttjUoy8 S2moOaBQyTJl
3byJsEZ8t3OjQAdBul5hJcl5JLhwC3ozc++N9rxeifUpfQOvrTC3FX3bkzM7 LbrDuvi1Ur6v
OJPz+j3663L6ms+CutdPSQ9J6vg5WdTGPfmBsg53sg4/ZT0q6/DXZB1+sKzN JoX13Y2BHfxU
+pDSDfZOlvxQr/cx2jeaQZaeh8COfUp/XPo6eScrf6ClPo/wDL7UgQk4r3zn oLE1T822/y2C
NjAY7P+DrNv5H1BLBwiFTEgaOQQAAMkWAABQSwMEFAAIAAgA0QNFOAAAAAAA AAAAAAAAAB8A
AABhL3NyYy9wYWNrL3V0aWwvUGFja1N3aXRjaC5qYXZh7VnJbttIEL0b8D/U YAKYMixprGMk
a+LYCkZAxg4sHXwLWmRJ7JgiCXYzhmD436d64aol9HjLQReFbNb66lV3l9M9 Pj48gGMYuFG8
SvjCl0Pz3q0u6MUPY++DeugeHsTMvWMLBPVvJ5U86B8eHB7wZRwlEn6wn0wv dr5yIctfomTR
QTfgscAOLuf0HCXYGV0ETIj+r6SuZz/QrZjT3o/1SjdL5I92G2a44GE7FZi0 vciFdtskNfUR
BrPh5J5L1x90Z0OYRwlIWl1GHgZHAnjoY8IlC10En2PCEtdfdbTyWIJIY+VW aBWXBQE8fAp4
eAd/epEx6tggW5CvRGbhURuREbn4Gd2hNkGgezh0mcDb21uFOL3BEqUfeToy ZK4PrsIGonkR
54k2JSRLJA8XQG58/ZG5MmVBVcF41wos9CBOIhfRU2pprAU2Zqzl05AqCAzC KGyHKSWboEgD
CVzQk0yTED0Tyb3PKU5uYLFC1r3QGHSKymDordflk0DLpG/0881Qy3xZYEgx SfQy3qWzgLs2
RyVpizklSw8kA4YHYKvtEoLoGdggzg3DTqLAjmChHhTosEAhKwlpckaFkRRi KRXj375otpbj
vEiQbAmqDxVDmEqswfcaERsoCxCdllrWKALwOTjlsOHsDBQLWuazlQKoypSz 7uD4ajI9v7oY
9Y2wagH1U0uf+khsboUdPWDZGYVoySgMU6HE1D5wCSuOgaeoyaRdfgE4jUsd zZwnQq71SNYg
MFtRXBuTU/tHp0F9plDfXJTfbJ8pVcwGlUsXUh3UG6zTOimr9vfleFI58gYv V0QDq1HVTyew
u0aqq3JhKksUSsbJl9NS/VXupXqfbaqusbJAqR/4nLbv8eWmKtveA8BAYM2w OqIHxtQQcJLG
mExXMe1HZ1DxMSo+OZnVLKzsDcoGOlyMlrFcUW5/FwIAHs4ZFeWC8C9xtAUf K0JZnmWDFIXz
1/b09lx+Fpd5KA0alki/4rI5nMAp69RZqwKrnAmfzyejvNAPRcU/K8GZ+jkD R720Cqf9Qmya
oXCmTStBR2m1SjKqxzIpe2YVWlvIV1K3BbB1ztYft2Z08fV8MjndlJNunVOD 6anKyyw0ysyI
GmxPG2eXY/JEvVdCpbcVlZ5BpZej0muOSs9k1/ufqDTXe3lUzi/HX76MbkZX 0+8aoE34nF/y
+RwTDM2uDqz2TojVRBpBV9NxambfEZTJ9b+j79fTf0Y320GZREu8JneJwUBU XwmSqkAjRKoq
TtXm2+FhDXzMT/idBjcfdDf2nKoOYLShYxKTWTXuFcMgsLVZ42iAy6FqkUGX Ho6aHWNTn0Y+
GsQDXBKLaOaJwvzAVCD1rZxZUzGsz5L3nJ4pyiUP6YjaNvNsOytjlrBllpXS pZGY7gibp6fy
yfqCGOnZtZj/d/7porV2lW81GgDyDUyfktG2m38O+uvwwxxJe4Y8HaW34oi9 NNh7x7vypLfn
ydNRelOe9OzF6914UtxIzJ1wz5jn4PVW3KnfI+vX1fdik7rNgb6/7dn0fLze ik21O3jtmv9e
XLJp/DYUOoFZqmihXJjUCB5pJikWru7Z6jcl2UYgn8StRkwqj0zZ36wacucR ut3if0AOD/4D
UEsHCIoQeea5BAAAEB0AAFBLAQIUABQACAAIANEDRThjc8zAzgAAAHYBAAAM AAAAAAAAAAAA
AAAAAAAAAABhLy5jbGFzc3BhdGhQSwECFAAUAAgACADRA0U4EUXx/eIAAACW AgAACgAAAAAA
AAAAAAAAAAAIAQAAYS8ucHJvamVjdFBLAQIUABQACAAIANEDRTjDuZSkjAAA APAAAAASAAAA
AAAAAAAAAAAAACICAABhL2J1aWxkLnByb3BlcnRpZXNQSwECFAAUAAgACADR A0U41gLw3fUA
AACmAgAAEwAAAAAAAAAAAAAAAADuAgAAYS9wbHVnaW4ucHJvcGVydGllc1BL AQIUABQACAAI
ANEDRTglpcQc0AAAAFUBAAAMAAAAAAAAAAAAAAAAACQEAABhL3BsdWdpbi54 bWxQSwECFAAU
AAgACADRA0U4lB5Yp/kAAACsAQAAFgAAAAAAAAAAAAAAAAAuBQAAYS9NRVRB LUlORi9NQU5J
RkVTVC5NRlBLAQIUABQACAAIANEDRTi4Sti5igEAAGoGAAASAAAAAAAAAAAA AAAAAGsGAABh
L21vZGVsL21hcHMuZWNvcmVQSwECFAAUAAgACADRA0U4VW4Txb0BAAAYBQAA FQAAAAAAAAAA
AAAAAAA1CAAAYS9tb2RlbC9tYXBzLmdlbm1vZGVsUEsBAhQAFAAIAAgA0QNF OKLOaHvvAAAA
mwEAAB8AAAAAAAAAAAAAAAAANQoAAGEvc3JjL3BhY2svQURpZmZlcmVudENs YXNzLmphdmFQ
SwECFAAUAAgACADRA0U4VBrQFysBAAAqAgAAFAAAAAAAAAAAAAAAAABxCwAA YS9zcmMvcGFj
ay9CYXNlLmphdmFQSwECFAAUAAgACADRA0U4kBIlohABAAD7AQAAFgAAAAAA AAAAAAAAAADe
DAAAYS9zcmMvcGFjay9DbGFzczEuamF2YVBLAQIUABQACAAIANEDRTiCi3ES EAEAAPoBAAAW
AAAAAAAAAAAAAAAAADIOAABhL3NyYy9wYWNrL0NsYXNzMi5qYXZhUEsBAhQA FAAIAAgA0QNF
OCXhMFrKAQAAEAcAABsAAAAAAAAAAAAAAAAAhg8AAGEvc3JjL3BhY2svUGFj a0ZhY3Rvcnku
amF2YVBLAQIUABQACAAIANEDRTg/X9csSAQAAMcdAAAbAAAAAAAAAAAAAAAA AJkRAABhL3Ny
Yy9wYWNrL1BhY2tQYWNrYWdlLmphdmFQSwECFAAUAAgACADRA0U4tGwf//EA AACYAQAAHgAA
AAAAAAAAAAAAAAAqFgAAYS9zcmMvcGFjay9Tb21lT3RoZXJDbGFzcy5qYXZh UEsBAhQAFAAI
AAgA0QNFOMe6txVeAQAAXwMAACgAAAAAAAAAAAAAAAAAZxcAAGEvc3JjL3Bh Y2svaW1wbC9B
RGlmZmVyZW50Q2xhc3NJbXBsLmphdmFQSwECFAAUAAgACADRA0U4U+IYw7oB AABPBAAAHQAA
AAAAAAAAAAAAAAAbGQAAYS9zcmMvcGFjay9pbXBsL0Jhc2VJbXBsLmphdmFQ SwECFAAUAAgA
CADRA0U4jaX7HMYBAABmBAAAHwAAAAAAAAAAAAAAAAAgGwAAYS9zcmMvcGFj ay9pbXBsL0Ns
YXNzMUltcGwuamF2YVBLAQIUABQACAAIANEDRTjEezChxQEAAGQEAAAfAAAA AAAAAAAAAAAA
ADMdAABhL3NyYy9wYWNrL2ltcGwvQ2xhc3MySW1wbC5qYXZhUEsBAhQAFAAI AAgA0QNFOEnD
VyENAwAALgwAACQAAAAAAAAAAAAAAAAARR8AAGEvc3JjL3BhY2svaW1wbC9Q YWNrRmFjdG9y
eUltcGwuamF2YVBLAQIUABQACAAIANEDRTisZue+NAcAAMQgAAAkAAAAAAAA AAAAAAAAAKQi
AABhL3NyYy9wYWNrL2ltcGwvUGFja1BhY2thZ2VJbXBsLmphdmFQSwECFAAU AAgACADRA0U4
J86tF1sBAABaAwAAJwAAAAAAAAAAAAAAAAAqKgAAYS9zcmMvcGFjay9pbXBs L1NvbWVPdGhl
ckNsYXNzSW1wbC5qYXZhUEsBAhQAFAAIAAgA0QNFOIVMSBo5BAAAyRYAACcA AAAAAAAAAAAA
AAAA2isAAGEvc3JjL3BhY2svdXRpbC9QYWNrQWRhcHRlckZhY3RvcnkuamF2 YVBLAQIUABQA
CAAIANEDRTiKEHnmuQQAABAdAAAfAAAAAAAAAAAAAAAAAGgwAABhL3NyYy9w YWNrL3V0aWwv
UGFja1N3aXRjaC5qYXZhUEsFBgAAAAAYABgAvwYAAG41AAAAAA==
--------------050305050800070104040105--
Re: Complex Map Modeling [message #416500 is a reply to message #416480] Tue, 05 February 2008 16:58 Go to previous messageGo to next message
Jeff Lins is currently offline Jeff LinsFriend
Messages: 39
Registered: July 2009
Member
Thanks for the detailed response! The set methods for Class1 and Class2
actually need to come from attributes.

The get method however, doesn't need to and can come from an operation.

So I guess I could make the attributes for each of the two classes and
then suppress the get. I could then model a get operation for the
abstract Base class and then I'd almost have it.

The only problem then is that I don't know how to make the get operation
in BaseImpl abstract. I want BaseImpl to be using this get method from
elsewhere in its class but the method shouldn't be implemented by
BaseImpl itself - it should be implemented by the classes that extend it.

The other issue I see is that I apparently can't make the get method
protected. If the abstract method was only in the BaseImpl class and not
in the Base interface then that would work as well. Can that be done?

Perhaps, since the get method is nothing more than plumbing, it should
not even be in the model. I am still very curious though if abstract
methods and only putting methods in an Impl are possible.



Marcelo Paternostro wrote:
> Hi,
>
> There are a few considerations that I have to make before answering your
> question:
>
> - You won't be able to model protected methods or attributes. The basic
> idea is that everything that you model is, ultimately, accessible to the
> clients of your code.
>
> - As extensions of the abstract class, Class1 and Class2 inherit the get
> method so you don't need to defined it again on each class.
>
> - Is there a modeled attribute for the map or are you thinking on using
> operations? If you are using an attribute, EMF would generate a
> set(Map<MyClass,?>) method in the abstract class which would conflict
> with the setters you want to define in the subclasses (a "Java" conflict
> not an "EMF" one ;-). So I will assume that you are modeling operations.
>
> All that said, I am attaching here a project with an ecore model that
> has what I think you are trying to do.
>
> Cheers,
> Marcelo
>
> Gigaplex wrote:
>> I have an abstract class that two other classes extend. I need a
>> method in this abstract class like this:
>>
>> protected abstract EMap<MyClass, ?> getMap();
>>
>>
>> Then, I have two classes (not abstract) that extend this abstract
>> class that need to look like this:
>>
>> Class 1
>> protected EMap<MyClass, ?> getMap();
>> public void setMap(EMap<MyClass, ADifferentClass>)
>>
>> Class 2
>> protected EMap<MyClass, ?> getMap();
>> public void setMap(EMap<MyClass, SomeOtherClass>)
>>
>>
>> Is it possible to model something like this in EMF? I've modeled maps
>> before but nothing like this.
Re: Complex Map Modeling [message #416503 is a reply to message #416500] Tue, 05 February 2008 19:24 Go to previous messageGo to next message
Marcelo Paternostro is currently offline Marcelo PaternostroFriend
Messages: 602
Registered: July 2009
Senior Member
Hi,

Hmmm... Let's go for another set of considerations ;-)

- As you probably know, you can suppress getters and setters from the
generated interface for any attributes - these methods would still be
public members of the implementation class. So you could define the maps
in Class1 and Class2 and "hide" the getters from the API.

- You can't model an abstract operation directly in EMF. But, as Ed
says, if there is a will, there is a way: you could always use the pair
"gen/ecore annotation + template customization" to generate such a thing.

- The same goes for protected methods. This one is a bit more tricky
because you would need to prevent them to be added to the interface.

- Regarding operations and features, you should only model things that
are either intrinsic parts of the domain or have to be manipulated as
API by other systems. So, if you want the getter to be protected, it
means that you don't want it in your generated interface. Hence, I am
guessing it should not be modeled.

So, putting it all together, I agree with you. You should probably just
manually add an abstract protected getter method to the basic class.
EMF will not touch it the next time you generate the model.

Btw, just 2 heads up if you go for the "suppress the getter" approach.
The getters in the implementation classes of Class1 and Class2 will be
generated as public methods and won't have the @Override annotation
(which will problem cause your class to have some compilation warnings).
You can fix these and mark the methods as generate not.

Cheers,
Marcelo

Gigaplex wrote:
> Thanks for the detailed response! The set methods for Class1 and Class2
> actually need to come from attributes.
>
> The get method however, doesn't need to and can come from an operation.
>
> So I guess I could make the attributes for each of the two classes and
> then suppress the get. I could then model a get operation for the
> abstract Base class and then I'd almost have it.
>
> The only problem then is that I don't know how to make the get operation
> in BaseImpl abstract. I want BaseImpl to be using this get method from
> elsewhere in its class but the method shouldn't be implemented by
> BaseImpl itself - it should be implemented by the classes that extend it.
>
> The other issue I see is that I apparently can't make the get method
> protected. If the abstract method was only in the BaseImpl class and not
> in the Base interface then that would work as well. Can that be done?
>
> Perhaps, since the get method is nothing more than plumbing, it should
> not even be in the model. I am still very curious though if abstract
> methods and only putting methods in an Impl are possible.
>
>
>
> Marcelo Paternostro wrote:
>> Hi,
>>
>> There are a few considerations that I have to make before answering
>> your question:
>>
>> - You won't be able to model protected methods or attributes. The
>> basic idea is that everything that you model is, ultimately,
>> accessible to the clients of your code.
>>
>> - As extensions of the abstract class, Class1 and Class2 inherit the
>> get method so you don't need to defined it again on each class.
>>
>> - Is there a modeled attribute for the map or are you thinking on
>> using operations? If you are using an attribute, EMF would generate a
>> set(Map<MyClass,?>) method in the abstract class which would conflict
>> with the setters you want to define in the subclasses (a "Java"
>> conflict not an "EMF" one ;-). So I will assume that you are modeling
>> operations.
>>
>> All that said, I am attaching here a project with an ecore model that
>> has what I think you are trying to do.
>>
>> Cheers,
>> Marcelo
>>
>> Gigaplex wrote:
>>> I have an abstract class that two other classes extend. I need a
>>> method in this abstract class like this:
>>>
>>> protected abstract EMap<MyClass, ?> getMap();
>>>
>>>
>>> Then, I have two classes (not abstract) that extend this abstract
>>> class that need to look like this:
>>>
>>> Class 1
>>> protected EMap<MyClass, ?> getMap();
>>> public void setMap(EMap<MyClass, ADifferentClass>)
>>>
>>> Class 2
>>> protected EMap<MyClass, ?> getMap();
>>> public void setMap(EMap<MyClass, SomeOtherClass>)
>>>
>>>
>>> Is it possible to model something like this in EMF? I've modeled maps
>>> before but nothing like this.
Re: Complex Map Modeling [message #416517 is a reply to message #416503] Wed, 06 February 2008 15:31 Go to previous messageGo to next message
Jeff Lins is currently offline Jeff LinsFriend
Messages: 39
Registered: July 2009
Member
Really, this is domain intrinsic. So I guess I will use the annotations
and jet to get the abstract method modeled. I suppose I will have to do
the same in order to get it to generate the set method too, right? I
can't see any way to generate a set method for an EMap.

This whole thing would be 100 times easier if I could just make a
constructor for Class1 and Class2 that took an EMap. Are there any plans
to support constructors in EMF for the future? And are abstract methods
planned for the future?

Marcelo Paternostro wrote:
> Hi,
>
> Hmmm... Let's go for another set of considerations ;-)
>
> - As you probably know, you can suppress getters and setters from the
> generated interface for any attributes - these methods would still be
> public members of the implementation class. So you could define the maps
> in Class1 and Class2 and "hide" the getters from the API.
>
> - You can't model an abstract operation directly in EMF. But, as Ed
> says, if there is a will, there is a way: you could always use the pair
> "gen/ecore annotation + template customization" to generate such a thing.
>
> - The same goes for protected methods. This one is a bit more tricky
> because you would need to prevent them to be added to the interface.
>
> - Regarding operations and features, you should only model things that
> are either intrinsic parts of the domain or have to be manipulated as
> API by other systems. So, if you want the getter to be protected, it
> means that you don't want it in your generated interface. Hence, I am
> guessing it should not be modeled.
>
> So, putting it all together, I agree with you. You should probably just
> manually add an abstract protected getter method to the basic class. EMF
> will not touch it the next time you generate the model.
>
> Btw, just 2 heads up if you go for the "suppress the getter" approach.
> The getters in the implementation classes of Class1 and Class2 will be
> generated as public methods and won't have the @Override annotation
> (which will problem cause your class to have some compilation warnings).
> You can fix these and mark the methods as generate not.
>
> Cheers,
> Marcelo
>
> Gigaplex wrote:
>> Thanks for the detailed response! The set methods for Class1 and
>> Class2 actually need to come from attributes.
>>
>> The get method however, doesn't need to and can come from an operation.
>>
>> So I guess I could make the attributes for each of the two classes and
>> then suppress the get. I could then model a get operation for the
>> abstract Base class and then I'd almost have it.
>>
>> The only problem then is that I don't know how to make the get
>> operation in BaseImpl abstract. I want BaseImpl to be using this get
>> method from elsewhere in its class but the method shouldn't be
>> implemented by BaseImpl itself - it should be implemented by the
>> classes that extend it.
>>
>> The other issue I see is that I apparently can't make the get method
>> protected. If the abstract method was only in the BaseImpl class and
>> not in the Base interface then that would work as well. Can that be done?
>>
>> Perhaps, since the get method is nothing more than plumbing, it should
>> not even be in the model. I am still very curious though if abstract
>> methods and only putting methods in an Impl are possible.
>>
>>
>>
>> Marcelo Paternostro wrote:
>>> Hi,
>>>
>>> There are a few considerations that I have to make before answering
>>> your question:
>>>
>>> - You won't be able to model protected methods or attributes. The
>>> basic idea is that everything that you model is, ultimately,
>>> accessible to the clients of your code.
>>>
>>> - As extensions of the abstract class, Class1 and Class2 inherit the
>>> get method so you don't need to defined it again on each class.
>>>
>>> - Is there a modeled attribute for the map or are you thinking on
>>> using operations? If you are using an attribute, EMF would generate
>>> a set(Map<MyClass,?>) method in the abstract class which would
>>> conflict with the setters you want to define in the subclasses (a
>>> "Java" conflict not an "EMF" one ;-). So I will assume that you are
>>> modeling operations.
>>>
>>> All that said, I am attaching here a project with an ecore model that
>>> has what I think you are trying to do.
>>>
>>> Cheers,
>>> Marcelo
>>>
>>> Gigaplex wrote:
>>>> I have an abstract class that two other classes extend. I need a
>>>> method in this abstract class like this:
>>>>
>>>> protected abstract EMap<MyClass, ?> getMap();
>>>>
>>>>
>>>> Then, I have two classes (not abstract) that extend this abstract
>>>> class that need to look like this:
>>>>
>>>> Class 1
>>>> protected EMap<MyClass, ?> getMap();
>>>> public void setMap(EMap<MyClass, ADifferentClass>)
>>>>
>>>> Class 2
>>>> protected EMap<MyClass, ?> getMap();
>>>> public void setMap(EMap<MyClass, SomeOtherClass>)
>>>>
>>>>
>>>> Is it possible to model something like this in EMF? I've modeled
>>>> maps before but nothing like this.
Re: Complex Map Modeling [message #416579 is a reply to message #416517] Wed, 06 February 2008 16:56 Go to previous messageGo to next message
Marcelo Paternostro is currently offline Marcelo PaternostroFriend
Messages: 602
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------040706060703010606050604
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

Starting with the questions, the answer for constructors with parameters
is no. Keep in mind that generic code such as the one that loads
objects from resources or the one that copies EObjects would never be
able to use them. That said, if you look at
"org.eclipse.emf.ecore.change.ChangeFactory", you will see that we've
added "special" factory methods like, for example,
createFeatureChange(EStructuralFeature, Object, boolean). You just need
to make sure that instances without such information will still work.

I can't see how abstract methods to support features would work but it
may be reasonable to support abstract operations. Pls open a feature
request if you think it is a good improvement.

One point that I am a bit curious is why you need to make the methods
protected. If you generate the code using the standard
"interface/implementation class" pattern and suppress the methods from
the interface, they would only be available in the impls, which are not
easily accessible to users.

Another point is why to have the map modeled in the base class if you
are not making it accessible: in your first post, there is no public
getter and no setter at all. If it is just for convenience purposes, a
trick you could do to avoid going for the work of customizing the
templates, is to have a different name for the map in the base class,
hide its accessors, and use operations in the subclasses. The attached
project uses this approach.

Cheers,
Marcelo

Gigaplex wrote:
> Really, this is domain intrinsic. So I guess I will use the annotations
> and jet to get the abstract method modeled. I suppose I will have to do
> the same in order to get it to generate the set method too, right? I
> can't see any way to generate a set method for an EMap.
>
> This whole thing would be 100 times easier if I could just make a
> constructor for Class1 and Class2 that took an EMap. Are there any plans
> to support constructors in EMF for the future? And are abstract methods
> planned for the future?
>
> Marcelo Paternostro wrote:
>> Hi,
>>
>> Hmmm... Let's go for another set of considerations ;-)
>>
>> - As you probably know, you can suppress getters and setters from the
>> generated interface for any attributes - these methods would still be
>> public members of the implementation class. So you could define the
>> maps in Class1 and Class2 and "hide" the getters from the API.
>>
>> - You can't model an abstract operation directly in EMF. But, as Ed
>> says, if there is a will, there is a way: you could always use the
>> pair "gen/ecore annotation + template customization" to generate such
>> a thing.
>>
>> - The same goes for protected methods. This one is a bit more tricky
>> because you would need to prevent them to be added to the interface.
>>
>> - Regarding operations and features, you should only model things that
>> are either intrinsic parts of the domain or have to be manipulated as
>> API by other systems. So, if you want the getter to be protected, it
>> means that you don't want it in your generated interface. Hence, I am
>> guessing it should not be modeled.
>>
>> So, putting it all together, I agree with you. You should probably
>> just manually add an abstract protected getter method to the basic
>> class. EMF will not touch it the next time you generate the model.
>>
>> Btw, just 2 heads up if you go for the "suppress the getter" approach.
>> The getters in the implementation classes of Class1 and Class2 will be
>> generated as public methods and won't have the @Override annotation
>> (which will problem cause your class to have some compilation
>> warnings). You can fix these and mark the methods as generate not.
>>
>> Cheers,
>> Marcelo
>>
>> Gigaplex wrote:
>>> Thanks for the detailed response! The set methods for Class1 and
>>> Class2 actually need to come from attributes.
>>>
>>> The get method however, doesn't need to and can come from an operation.
>>>
>>> So I guess I could make the attributes for each of the two classes
>>> and then suppress the get. I could then model a get operation for the
>>> abstract Base class and then I'd almost have it.
>>>
>>> The only problem then is that I don't know how to make the get
>>> operation in BaseImpl abstract. I want BaseImpl to be using this get
>>> method from elsewhere in its class but the method shouldn't be
>>> implemented by BaseImpl itself - it should be implemented by the
>>> classes that extend it.
>>>
>>> The other issue I see is that I apparently can't make the get method
>>> protected. If the abstract method was only in the BaseImpl class and
>>> not in the Base interface then that would work as well. Can that be
>>> done?
>>>
>>> Perhaps, since the get method is nothing more than plumbing, it
>>> should not even be in the model. I am still very curious though if
>>> abstract methods and only putting methods in an Impl are possible.
>>>
>>>
>>>
>>> Marcelo Paternostro wrote:
>>>> Hi,
>>>>
>>>> There are a few considerations that I have to make before answering
>>>> your question:
>>>>
>>>> - You won't be able to model protected methods or attributes. The
>>>> basic idea is that everything that you model is, ultimately,
>>>> accessible to the clients of your code.
>>>>
>>>> - As extensions of the abstract class, Class1 and Class2 inherit the
>>>> get method so you don't need to defined it again on each class.
>>>>
>>>> - Is there a modeled attribute for the map or are you thinking on
>>>> using operations? If you are using an attribute, EMF would generate
>>>> a set(Map<MyClass,?>) method in the abstract class which would
>>>> conflict with the setters you want to define in the subclasses (a
>>>> "Java" conflict not an "EMF" one ;-). So I will assume that you are
>>>> modeling operations.
>>>>
>>>> All that said, I am attaching here a project with an ecore model
>>>> that has what I think you are trying to do.
>>>>
>>>> Cheers,
>>>> Marcelo
>>>>
>>>> Gigaplex wrote:
>>>>> I have an abstract class that two other classes extend. I need a
>>>>> method in this abstract class like this:
>>>>>
>>>>> protected abstract EMap<MyClass, ?> getMap();
>>>>>
>>>>>
>>>>> Then, I have two classes (not abstract) that extend this abstract
>>>>> class that need to look like this:
>>>>>
>>>>> Class 1
>>>>> protected EMap<MyClass, ?> getMap();
>>>>> public void setMap(EMap<MyClass, ADifferentClass>)
>>>>>
>>>>> Class 2
>>>>> protected EMap<MyClass, ?> getMap();
>>>>> public void setMap(EMap<MyClass, SomeOtherClass>)
>>>>>
>>>>>
>>>>> Is it possible to model something like this in EMF? I've modeled
>>>>> maps before but nothing like this.

--------------040706060703010606050604
Content-Type: application/x-zip-compressed;
name="prj.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="prj.zip"

UEsDBBQACAAIAIdeRjgAAAAAAAAAAAAAAAAMAAAAYS8uY2xhc3NwYXRonZBB SwMxEIXPFfof
ltw7awXBw65FZIUWWqVde5U0Gbaj6SSdJGL/vdVaFKEevM0bvnnvMdXobeOK V5RInms1hHNV
IBtvibtaPbZ3gys1uu6fVcbpGINO673ofSvkJLvihdjWKopRxcfyMJanSeP5 SHrpAI2jEBGe
bQKnM5v1Ph0m8+bp9n7W3oxnzbz8zREnFNYOLK5yB5m+LlFgkTRbLXY5bXcB y8nFohkM4fIf
hYJFMF4QBLeZBO2Dyx1x/MvK5xRyOrqtiD/hqvz5wHdQSwcIY3PMwM4AAAB2 AQAAUEsDBBQA
CAAIAIdeRjgAAAAAAAAAAAAAAAAKAAAAYS8ucHJvamVjdL2Sz4rCMBDGzwq+ g/Ru4t48xAru
4k1Z6O4DxGSsKc0fklT28TdJU6WI4EE8Zb4v8/EbhiGbP9nOL2Cd0GpdfKBl MQfFNBeqXhe/
P7vFqtiUsykxVjfA/Bc4ZoXxoTu4E6KohJISnN5oMC0lKF8SPFTRzWmXBB6p YydaXhlgUWX5
GaJU8eRkhrY1AtYK4wA13COmbSjohaYA2NsIIUFt3UW2yxqPDYLvKE9xDQe0 p0qcwPnte7EV
O4OkL4FmZ1h54PnOQu7uxeNt9/9xgNT3KBNH/m67WqjDXWCoI/F6C+O7+gdQ SwcIEUXx/eIA
AACWAgAAUEsDBBQACAAIAIdeRjgAAAAAAAAAAAAAAAASAAAAYS9idWlsZC5w cm9wZXJ0aWVz
dY4xCgIxEEX7gblDwC01uYAKFgpbaGVpo8mwRrI7YZKA3t7EbmGd7r0Hw0dY qa3l+BE/PPMe
G5oZN9X1rkNAePhJ+8mG4iipndLrG4Ka38iOglkI5+P1sOkvp6UWQxnq6/cY /scoHEmyp4Tw
ukvSlsfoA2kWR9LWICQuYknrSkmsQeCSY8k/UbdX8QVQSwcIw7mUpIwAAADw AAAAUEsDBBQA
CAAIAIdeRjgAAAAAAAAAAAAAAAATAAAAYS9wbHVnaW4ucHJvcGVydGllc61R QWrDMBC8G/yH
IY1vwb2XphCwC4HGDo4+oNobW1SRhOxEze8rWS20tx6s0+7O7uzsKE0e8Nxq c7eiH6aXNKSP
f/JQWu+7dZqEaLvACzxMo9UdoaMbSW3IPoUqUGhUNUM7cNUTpoFgbIAnQSPe aXJEypfFCCkU
gasuNMXZVZZlKKsC9StYs6tObztWFjg29bFs2L48wTes5sE8Thz4h+eAIvez 5g7FL7QBN4YC
t541hFCf5/AsZFwbJUaeAMzn+P7rGHX/Js2Xs27JT/iPX0sqN/LaC1V5g7H1 3psRB2+a9IDV
N9GR/Yacczl98ouRlGvbp8kXUEsHCNYC8N31AAAApgIAAFBLAwQUAAgACACH XkY4AAAAAAAA
AAAAAAAADAAAAGEvcGx1Z2luLnhtbE1PsW7DIBDdLfkfrqesQKsuHbC9RcpQ KUMzVwhfKQoG
BE6V/n0gdp3egO69e/ceJ4fr5OCHUrbBd/jCnxHI6zBabzo8fezZGw5928iB tLMx00P7WrR1
VIZPjLUNSB3ib7Lme+4rEv9hIXaHcdc2jC0r0V2M9csEJF1n8tUWYrB+7jAk w9dETtNX6UMi
bshTUjONn1HpszKENamUXDEssNQlWegAK48PVjuV8x/Pj+U5rkabpGS8h5Fc VU21EZOKuUbf
EYLo735SbJ9eLhLbSTdQSwcIJaXEHNAAAABVAQAAUEsDBBQACAAIAIdeRjgA AAAAAAAAAAAA
AAAWAAAAYS9NRVRBLUlORi9NQU5JRkVTVC5NRlWQzWrDMBCE7wa/gy69VaIJ 9KKQS4svJSmh
ht4VeeMu1Y+7kkycp69sB9c9aZeZnW/QUTm8QIj8Eyigd5JtxFNZvCTXGODH u7qI20V6VxYk
e+hMatGNy6LUgz17g3p2qB0L6FoDMd/vI6U/4xq5gr4aFcJJxS/JxMrrGk8j kHyPDdA/5MFr
ZfCm4hQ3d1rED/hJSNBUV9BpdFSuR/LOgouSvW3rim/Ec1lU185T5Celv1Wb m3d5eCyL6RVo
O7MsOcWUxT2XzxjJPLUCtMEugNCeQFByES2MZ2sN7CXP2bDrMeAZDcZB7glg 4uces48f1G2o
o6Jccv62X1BLBwiUHlin+QAAAKwBAABQSwMEFAAIAAgAh15GOAAAAAAAAAAA AAAAABIAAABh
L21vZGVsL21hcHMuZWNvcmXtVU1r20AQvQfyH5btOV7bvRQhJbiNEwI1MVVS el2vR/ISaSV2
R7H97zv6sCUFhTihhR7qi9mdeW/fvDfG/tUuTdgzWKczE/DJaMwZGJWttYkD /vhwc/GFX12e
n/mgMgvefCnVk4yB7VLtHVFTQp2fMfoQmXEeFQO+Qcw9Ibbb7ShL41FmY/Fr cccPLa7fsv1c
dUzH4wm1fQ/VBlJ5oY1DaRT02CslPTCoROcOKgZIo5JlKuZlG2dGptSck+yG xLjHH3fNDR2W
FiK9a86XZYsP3xLpnI40zcdIqIf7nDgaB6rigferdPSGXDm0UmHA0RZQs5Q8 IR0VFlYmNyDp
GwboZohWrwo8StUGwRqZLGTOGdEap8G8oC7JZ8ZkKJECcMxlhVUneHILZpGt IWl5iGkNKHXi
2BPsA+6KPCedDtYh4E/t9EonGvecPcukgEaFOAF+ewrcF90xOsORULBaPZBT rBPH0bVribIq
nrQFn4SYl3Z2ZUMJn9m4SMld13+E+qtgxeuA3gwdtYfsxUD49XaJ7nq9e+Gq w4R+o2GRgy1f
dK3e4+LdU61ZjRrmAHsG+LCUlipYvli3pC8N+usZfCCFtyGzax1FYKlW+9bL cCiq6rp1ow2w
NfGPBTf9H9yrkDBL4R43YP+t3Ib36T0MA4ORpt7fKV39BlBLBwjmbDen9wEA AIkHAABQSwME
FAAIAAgAh15GOAAAAAAAAAAAAAAAABUAAABhL21vZGVsL21hcHMuZ2VubW9k ZWy9VF2LEzEU
fV/Y/xCuzzbdAUFK00UtlQXrFlTwNc7cSYP5Ism23X9vJpn0A1cRXZynybn3 nJxzJ5P57UEr
skMfpDUMbiZTIGha20kjGHz5vHr5Gm4X11dzgUbbDtXsPZr18EIOWs6OxCYR r69IepKeCbNU
ZLCN0c0o3e/3E6vFxHpBv67vYGypihd92CrpAuZe1D1tptOG1i2BZMJSemyj 9Y8MKKfBt+PO
2Ml4VoMMWH8BZYGNehDS3C0Z8BH5yDUyWHMXgEQMMZyTirrUzvqIfqAld0en yeWk1hJoPQJp
rXZKctPiB9wNCV8Nc22te/RSbONKouoCg56rgLAY9Od9IkpRci50MlK05vSi kFvT4Da8/c4F
BuI89vLAYACAdDI4G/g3hRtvd7JDv+JjiugfkrGsOZIZnLZ5QYuNov5O8RCS uNS5rdgs3Fy6
ZNK3vKaoAvcOPY/pYITCOq6fYFKBMQ0eaDVATw6e8PRLFxm7+TsfhUtDcXKU qLP26XSkrxvq
+Mb170SoPos0hjq5eY6ozT9EbZ4javM/or5Zyr5Hjybm6umU/An5k9V4H7fo z7nZSf1/hpuN
/nS1JfQHUEsHCFVuE8W9AQAAGAUAAFBLAwQUAAgACACHXkY4AAAAAAAAAAAA AAAAHwAAAGEv
c3JjL3BhY2svQURpZmZlcmVudENsYXNzLmphdmFlUEFOwzAQvFvyH7aiUiGS 4wcQRVSUAyf6
BceZuIbEjmxXAiH+TmpTKsplPd4dzeysrCrOqKJG+/kjWHNIbfnLv43cXD/3 6xOQnM1KvykD
Or33nHFmp9mHRD6YGnq0c0SNaViwD6ifXrpX6JSJ8uy4EoI6GOvEMSKI3msS orhvKWAOiHBJ
Jesd+YHSATT5HiP5LEabBlPbdO12Z4cBYeHS46hibGTXNnKZbeqLEVz/z+Y3 10NESVLvl7Iv
0W4M0kU6K9/eFXpeo0ADh6AS+vNdjt1oNVmXEAalQVcShPe07BLp5yScfXL2 RVJeEzn7BlBL
Bwiizmh77wAAAJsBAABQSwMEFAAIAAgAh15GOAAAAAAAAAAAAAAAABQAAABh L3NyYy9wYWNr
L0Jhc2UuamF2YX1SXU+DMBR9J+E/XHHJdBH6rgw/ojE+GJds8b2UC6uWtmlL dDH+dwsdGcYP
HuC25/Tccw8li0UcwQJypvTO8GbrirAm3zeGzdlDNesLEkeaslfaIPTfiziK I95qZRwo02TI
BNcWM2xrXyuD2d1T+YLMDUQydjxKUyix4TLtLJq0UgzSNHS/BoPaoEXpqONK gqrBbRFaVaEA
NYjBPMe2yMvihlrMSVnkxK/n2UEcZfVDOqA6tNl4yVoJod64bKBG6jrfFKhB sJ3u58HqPJzo
xJjLodIHxSuLIYts5V+rEM5xg643d3IaOME9La0zlLll4kyHyQDtn9HBMuHS oZFUPFKdwJQy
AW6po5udxmXyR+iekw+eehNncFkk0+MbQ6XlPuG9kSm29tN7Hxare3TP3PKS C+52/zLXvzDD
3A1KNNRnOd6drhScBZWaMoTeH+C78z/Mwv6uxNFHHH0CIQMaR19QSwcId1DA L2ABAACpAgAA
UEsDBBQACAAIAIdeRjgAAAAAAAAAAAAAAAAWAAAAYS9zcmMvcGFjay9DbGFz czEuamF2YX2R
307DIBTG75v0HT7jkm2NlHht0zj1xguTvQItpx2zBQJ00RjfXVacf5NdAIfD 4Xy/D3hR5BkK
VK2xr071u1CnPf+dmJOLR7k4BjzPrGifRU84rjd5lmdqtMYF7MVBlFNQQ/kk 7HzATwoXjKGh
Xmk2eXJMmhaMJbUNHFlHnnQQQRkN0yHsCKORNMA0e2oDlhWNddXU94Pw/rri TV3xmFmW3+1J
y3/Nv+hvPSXechunbTJw2VNIDVfrVDVrprAnTU4EkifTUzOoFkoHcp1oCekm 6CVEZY874SnP
3mI1kmuc9Y0z2PiJgr8wmHGAg1ESnkJ861Uc1RHgCpsH1XXk4mPOfDVGYdfz X7yD80/oPPsA
UEsHCJASJaIQAQAA+wEAAFBLAwQUAAgACACHXkY4AAAAAAAAAAAAAAAAFgAA AGEvc3JjL3Bh
Y2svQ2xhc3MyLmphdmF9kctuwyAQRfdI/odbNVISqzZSt0VWH6suqkbqF2CY OKS2sQBHrar+
e7Fp+pSyAIZhmHsu8DzPGHIIZYdXZ5pdqNKe/07MycW9XkwBz9gg1bNsCNN6 lbGMmW6wLmAv
D7Icg2nLBznMB/yocFYUqKkxfTF6coW2CkWR1G7gaHDkqQ8yGNvDbhF2hM5q amHrPamApaCu
EnV110rvLwWvK8FjZll+t6de/2v+RX/tKfGWmzhtkoHzhkJquFqnqlkzhQ31 5GQgfTQ91q1R
MH0gt5WKkG6CXkJU9riVnjL2FquRXOOkb5zAxk8U/IXBjAMcrNHwFOJbr+IQ E8AFnmxHj/H5
3IxXoZPDev6Kd3D+yZyxD1BLBwiCi3ESEAEAAPoBAABQSwMEFAAIAAgAh15G OAAAAAAAAAAA
AAAAABsAAABhL3NyYy9wYWNrL1BhY2tGYWN0b3J5LmphdmG9lFtLwzAUx98L /Q5HEKaDtrhX
61C8wF6mqF8gTU+7aJuUJFOH+N3NbdjNObyxlzY5ObffP+3JhsM4giHkVHQL yeqZHvt9tmpw
xv1JuW8XWRx1hD6SGsG+j+MojljbCalByDpF2rBOYYptZdZCYnp5RagWcuE8 s2XJvSSBAmvG
k7lCmZSCQpL48vczhLwYh7A8K8ZQCQnamFtRYpM6r4mGToonVqICAlQi0eYc 9UyUzh0JnQEX
PCGF0tLkAtoQpUBU65lcL8jLz52cKvSU6Y153Hhsf1IjR2lKlktN5kXDKDCu UVaEIljvgAD4
ok1+BUsp4ujVhIEXAwKyYrxuUAtukihNuMkReq18VBqcv9YOttDAetfg+obV RifTu/uz6fkl
nHhuc7NN2vOY2D3jTB8cuvvsQ9yinktub4PjM4jiAY3oBsHrPsixHZ/b5VGe meXgH3Ckq/jT
ghtV8I7hO/KbPyCOdo04+i7iqI84+h3i2QWrKpTItc+5Q9jtpTdif4S4iMC/ Zv2dEHeiRbg2
v6jcuRDbS28Uwoa4iL4Oq8YtMthBtBz8at7ZgY8lFAtzwNQ/jqiA/qNyX861 MLKhRt3bBso3
yLLeaIujd1BLBwgl4TBaygEAABAHAABQSwMEFAAIAAgAh15GOAAAAAAAAAAA AAAAABsAAABh
L3NyYy9wYWNrL1BhY2tQYWNrYWdlLmphdmHVmVtv4jgUx9+R+A5nuyN1pruQ bWbehqmaaUGL
1NIKqLRvyCSGZhsS5BhpqlG/+/qSe5yQNCGreSLxBZ/z89/2ybF2cdHvwQWM TG//SuztM72S
71q6QBR+mFof+IPW7+2R+YK2GPjv136v37N3e49Q8Mh2iE3H3vt4iHcb9uwR PBwblBJ7faD4
67GWNw7y/aOtHuXwYmQtdOG3wQDWeGu7g4OPycDyTBgMpDvLZwyj9VXQbaSt r2DjEaCseOdZ
2BmKVlMKpudSZLs+INPEvu8RP26IKQJv/S82qQ/UA4L3BPvYpXL0gyOHAhg5 9hVG5jOY3Jc/
Rxp7z1ZtMKIHgsHbwLGm2D3scjXItWRHCzGr6Osexy1GWmiLQIJdKw/k2sdy 8oacyQSZ1COv
skYAgRfbtb6dBdN8Jmu22MUEUWyFIjisHdsE26WYbJCJgf9XwBjwD8pG9iGc q37vJ+sGcrYg
mJNQRi7a4WFQXjyPUOISZA0EYSLAginP3QKeGfdj+AbCpTMhnDJj/D3352k+ PbVVixUbpK5d
XeBarB7n48n0n3LbfNbYwdRzmQp8ilxTSJrGVp/IzJTSprPF0pjd8OkVkmZ7 hzNMtJjyd9u1
6cdPSicSKxtsK1rw5z+vHdt9Sfznd+SLP4MR3l3xl5HGHt7O5fJtwdVoVaaG U9dmHPx9iynv
8PFTGTe2VuG7seCo/lKyCDemJAfuLds9p3ydu8iBe7TnW6hw/hxQuLe3P9Vw 7RELE6UHq9V0
thzPZ8bd6t54LPSHbZ5rTLgofUoOJvONORA46YdaPU/NZ3vTWcedydhYPs3H q5uHp9mSuXPZ
TKriHL2MxCpfTyvXeMjKgpVdjkv25s5YLC4LqfwSopU+5GSb13JDHSemunMl Bz5mtawQ+B8F
67WewPW0wPUOBK7XF7heUeA6Q6X/4gLXOxK4/j8KXO9E4MatvdkwE1wpokjp cTmIitNqXmFF
ZfFn+h5fBcbtdDIZz8ez5UqAZmQ/NxSLklbnssk6lhNQQ60svB1+YFUkLRVe DKK8C6nkjais
lHTX40JZPNyPVw/Lv8fzSChfGgpFyapzoWQdKxBK2tE5Zu64fjZLIfQi7E8r hge62S+YFjwk
wooyI9JR9jCnDl5XNvMyOQTRh05uxstA8LLoUCwAkj5LOwCTMUppwxFQvLDa t1+chQsRrsLB
2Fg1cSp0JQPP/OdGZ9pKRr55aLK2mr7C75JWkOj5ALVbJHopEr0GEr05kkxQ UBbSdEZJHSTk
eWVsrwYuFwU1JZg+LMsO+s4Aqg/PPMC06dX4ZWODUnwbmclmz4iCSdhBj2VF mJ6MDv0o798e
oHcOXpjgDNLyHELiVUGg3PxbvLFdNrZjs80eOUU3Gtzo5J2G+GN5k8AfC+81 MpXlNxuZxqm7
jbiu+HZDGKXFVtVOHMeXFXcBDl4qriZioqr4O6DXMDt8bLbKfVIE06kccbVg OxEpKDCFoKIl
GKSLoyz7MBt/1eRWMW8RCqk1boVuxmGRMq+cc1wZNTUVT9V8besCymRta6S1 LmuIKErgpmhm
wqxWGFZICZ6Gof4ehnpdhrqSod4awwZZp9axFuWemmSfqoBWpKFSyIsiuqbs 35/FaR19QS6n
QTanCnhFWicFviAUfOM/b6BpCVv6vf8AUEsHCDJct0LYBAAA2yIAAFBLAwQU AAgACACHXkY4
AAAAAAAAAAAAAAAAHgAAAGEvc3JjL3BhY2svU29tZU90aGVyQ2xhc3MuamF2 YWVQ0UrEMBB8
D+QfVjw4LaT5AEtRxAef7sAvSNNpLmeblCQHivjvtomnnL4ks7vDzM7KquKM Kmq0n9+DNYfU
llpeNnJz89xvViA5m5V+VQa0/neccWan2YdEPpgaerRzRI1pWLAPqJ923RE6 ZaI8O14JQR2M
deIUEUTvNQlR3B8oYA6IcEkl6x35gdIBNPkeI/ksRtsGU9t07YufQLtlHOhx VDE2smsbucy2
9a8RXP/P5ifXfURJUu+XZ1+iXRukVTorZ+Gb28LOWxRo4BBUQn8+y6kbrSbr EsKgNOhSgfCW
lk0ifR+Esw/OPknKPzzOvgBQSwcItGwf//EAAACYAQAAUEsDBBQACAAIAIde RjgAAAAAAAAA
AAAAAAAoAAAAYS9zcmMvcGFjay9pbXBsL0FEaWZmZXJlbnRDbGFzc0ltcGwu amF2YbWSXWuD
MBSG7wX/wxkUuhY0P6AiLZ2FQlnLuvuh8WizaRJiHBuj/31JROwX3dVu9Jx8 vOc5bw6ZTn0P
phBRIb8VKw867nJyvuAWR+t8ZAPiezKlH2mJYP8hq2U18z3fM4FQGoQqQ6QV kw2GWBcmFgrD
ZFmlTfP3OasWJtvsHaleXyi7cosnVhSokOte8XR3Zz67js7dJH2HD0EAGZaM B22DKsgFhSDo
ul1wsFWxNpqpZoKDKEAfEGqRYwXCscA4wjqOsnioDw4gIlkcEbM3DodKyPPr OpHs3ZWDq/MS
OapUY95722YVo0CtNlw0aw0B/NJGvoETkwb+qyu+92OEofMB7joBd+jhEhUc LIBUQhsKzG+x
Pk7sEQcA0LQS1eNkZrOjfZt/pJpvP1EpluM5YjeEgHv7ztQlZ4gKdas4nAxR uGHaqFeNmbv1
apW8JM+vb8vNYr8f+jgCITea971fUEsHCMe6txVeAQAAXwMAAFBLAwQUAAgA CACHXkY4AAAA
AAAAAAAAAAAAHQAAAGEvc3JjL3BhY2svaW1wbC9CYXNlSW1wbC5qYXZhzVbf b9s2EH434P/h
mhWwHNjSe6J6STZjMNCmQZ2tjwEtnW02NKmRlFMjyP9eUpQsUk7SAkOS+cES ebzjd9/9UnJ8
3O/BMaSZKHaSrtZ64tZJuFFtvp/l7+1L0u8VJLslKwT7jOmmYKf9Xr9nXoTU 8I1sSVxqyuJP
pPAFQq5izBgtFMa4WcaZ2GwEj7nQdLmLL+2DZkRTwZ/TwkxIjKd/MKLUz89Z cPHUtz1zcH9B
6/PiG2Z61nGv8vmCKDwNt67M35XjpTqeNNy+G49hgSvKx6VCOc5FBuOx4/mc g70KN8h1BQ7E
EvQaYSNyZCAqADBIcTNJFxN7aZosJmli1oO4tY48P7SdFu55bcwtBWPijvIV LJHoUqICIrG9
G/MTp1MypwSQMjq5P2OU37ZRrty2fPy2Qj0zapITZoIMFmCzBrNRIXxIE2Oj zqfGcJoUbUad
rZCjJOb6Jq/KBaMZkIXSkhjPMxtkaG4F/K6Nqwq8yLQ+uHP93r2xBY58qN3P SLbGHLaEldgw
PKid67gSDZ9wZgBEa0kXpca4Nv10ZOGZyFjZmUI8vLkR+qxUG0LmKJtlYh+F FNowYJyyAK3j
I/h9ArQ1V+WgT8R/QNsB1EHQhMc5UNEPoMoCZTQ8tauHF4Zy9nmLUtIcQ1yu RQDObWll1SKA
KNFUAgevbuOP1PBHmIovzufTV8FeZ3wQxcfyIsQcxvnVUG4FzUGF6ALkHO88 mQ88OCZY7neP
Dwf+gL9j5KHd5sgSIvQ7+xf8t6SmTqKhKyXzc/JdZAzAwRSI9JqqEfjb8Xx6 PQpSwmbCzc3s
8nr65fL8482n86tRB//IBzt8i5R30XFNEfAv1JFB1LT62Z8jWAjBkHCTPkqw LbYbdtpd7woM
SveO6mwN0V6/ZvO+ITUzcfwJRyfN2X3KdpO6DuJDkNdV14grDzz0e9R7tK/D 8bwsCnO3+kok
N7NTRUclN4Mku8X8aPhUFKoawflhDOrwmEz8x86hF2S8U6FBiQ739592QxRG pA7FPAxFqP0W
We74/ZurLsNvRmjJ2C+S6VC3oN6MxKb8caYOMvXlW4Hf29+Z5m4IfK4bOIz/ A9bm5vvPfEJr
4V6CwVwNo5m6kuL7zsyf0IVWo/4qg9rWRblcorQNrmTazblAEnX1m0RzGjEp CuNUdASRx+kJ
HD1+zB9Tjx4YDAetoMJfywMHavIfIEmaT79+7wdQSwcITEa+y4kDAABKDgAA UEsDBBQACAAI
AIdeRjgAAAAAAAAAAAAAAAAfAAAAYS9zcmMvcGFjay9pbXBsL0NsYXNzMUlt cGwuamF2YbVT
XWuDMBR9F/wPd1DoBzPS54m06/ZQ6NZC9weiXm06TUISy8bof1+iuFoHfeuD er8895x7k3A2
8z2YQZQK+a1YcTBx64fXgSY4WmcjZ4S+J2n6SQsE9yWskuWT7/meNYQycKQn SmrDSvJGZT8h
VEEwLZnUSLDKrS0UktdVSbXu1zWoyxeW56iQmy7fzz5TjYNQUzYfBHf2tWvJ Nh3CTvBDEECC
BeNBrVEFmUghCFrxSw5OEla2NzVMcBA5mANCJTIsQSRHTA2MI6ziKInbtlGY xFFoI2NywUee
/UePZDdieRntokCOihrMugHXSclSSB04tC3WlhPgl7GoGpz+JvDHtCvzvR+L Aa1QuCkVbhCF
IStoeAFIJYzVj1mP1mTqMk1fAF1LVJPpk/PObuZ3JLPYnlApluE1s/ZIAe7d /tLGuaKo0NSK
Q+9wkA0zFr3UZLVZ7vfz+7GH9+1Hf5ztok+CZaDR2BszsU/k9vsIgzsQQ0Xl 1ajRrLnlzWnp
fnTZC/EzhOFlRb73C1BLBwgeOlz1iQEAAOwDAABQSwMEFAAIAAgAh15GOAAA AAAAAAAAAAAA
AB8AAABhL3NyYy9wYWNrL2ltcGwvQ2xhc3MySW1wbC5qYXZhvZPdaoMwFMfv Bd/hDAr9YEbY
bUXalV0UOlrwCaKe2nSahCSWjdF3X6Jzage92y7Uk3PiP7/zkXCx8D1YQJQJ +aFYcTJxuw7H
jsY52eYTZ4S+J2n2RgsE9yWskuXS93zPGkIZONMLJbVhJXmlchgQqiCYlUxq JFgdrS0UkpdN
SbUe7mtUn6nG5djVbHy6cR7s69Di3EQSUeHenFD1B4Rdvg9BACkWjAe1RhXk IoMgaHNfc3AZ
YYXcUMMEB3EEKwOVyLEEkZ4xMzCNsIqjNG6ZojCNo9B6pqTXR57/Vo9kV2HZ V3ZVIEdFDeZd
feu0ZBlkThzaI7aWCfDdWFUNrjiN44e02+Z7n1YD2kThbqpwBxRuqaDhApBK GJs/5gOs2dxF
mnMBdC1RzeZLt7q6mv8hzGp/QaVYjmOydqIAE9e/rFmMEBWaWnEYTA7ZMWPV S002u3WSPP0L
/XeTL4LloNHYyzKzT+R6+wjj4Y2honJUZTRbbpE5Ld1/LtozXyEM++743hdQ SwcIWiZCroIB
AADmAwAAUEsDBBQACAAIAIdeRjgAAAAAAAAAAAAAAAAkAAAAYS9zcmMvcGFj ay9pbXBsL1Bh
Y2tGYWN0b3J5SW1wbC5qYXZhvVbbbuIwEH1H4h+mqNImXRFUHktbFUGqRdqF qvBeBWcSvBuS
yDG9aNV/X18S4phL96HlKWN7PD5n5nji3sVFuwUXcE2y/I3ReMVv9bjXnFCT 55PwXBq9disP
yJ8gRpBfj67zZNButVvCyBiHjMUekoTmBXq4joSdMfT8URIUxeAjr9nyNxL+ oduDBvDxsRKc
598HhGfsbfJfSPNkE9PU8+XgQdnmHkX5Qs30quyddbuwROHY3RTIumFGoNvV mRymICHgGlMe
cJqlkEXAVwjrLMQErpe3Jbbr3vLWq8NhGu4Gu4sxRRZwDKs6bJYJJUBkakHm xCAK+MpFlAJM
9jWYhn+79VdEBE0IxEkjhuKYQiENMQo2CYdI+1p8vHLH4STAEU5gswLFC6Bk VshDiAkVaEq5
40ofhRmAS/zSKMfQcBcMzOENOMbQrYTkPQrkhYjkTabzxXA68r0YeZU5pyOr 3nEHUJ1AI3Cs
yGc3kG6SxK1ctmgAGPINSy0og2r9XRvlhwScrMDxXwnmSi9YWa7F0hBojTrJ YqfeMWiELmGk
+GJrxdGe71LV+2QQCBWnohYpwUq/pRq+tvw7MI2yF5sc2SHgnwznbvaMjNEQ DWxlqwKicuTo
/gaoPg2cL1RVVK9IWSmDRhTZZOy4dllJUKAiXklz9HM4n19eVeXT56kYl447 OL6tv29b/9i2
4Xhyf+8/+tPFk4pgBRiOaRQhE7dfhToWaT775T/NFj/8x72R5tkaZ0JJzA5U 9pur+v7wFcte
lG4nSYJxkAxZvJEdaHtLnM5CaFL3wW8d+A51tqfBGh1XTHW+AS0gzTgE8Bwk NNT+qhCdxlX5
ajmVCtI1tApqKEdPqbZNtOuNSkI9v81alVm1cpIrYXLoW+qyOfRrDn2TQ/8g h/4pOViaPqR0
g5W1pugFVhTNc4+nTdjaeErmzTt44GIavJtLinbRDKFZ7/rZpJvbTsnZaFEg 2oMxbFAtcTrG
uiufBFvfT8ccYs6Q1KAP/IrGDbfdd5LF7QAvs1Fj9XqoKb1Dr2f9fNutf1BL BwhJw1chDQMA
AC4MAABQSwMEFAAIAAgAh15GOAAAAAAAAAAAAAAAACQAAABhL3NyYy9wYWNr L2ltcGwvUGFj
a1BhY2thZ2VJbXBsLmphdmHlWd1v2kgQf4+U/2GaViqpCGl4bNpcXeK0lhKS A1LdG1rsBfZq
bGQvSWmV//1mv7xrYyDtReGke0ns9czsfP52Zjl+82Z/D97A+zCdLzM2mfIz 9X5cXpCLr4Lo
lXg43t+bk/AbmVAQ/1tsNo9P9/f29/AhzTik2aRFw5jNc9qiszE+pxlt+R7n GRstOD3dRtmJ
SZ5vpfpME5qxcLCcb5d4PacZ4SxNtlLeKMu22yOsLsiDigukX7xzNh7TjCa8 YpD8+onktLIk
yU7qFtuVRbHtBQl5mi1rvlgb3C/9dEav+ZRmRpv9vWMT/hdHRzCiE5YcLXKa HUVpCEdHKhW8
BISpdIZ2SBdCOgYUA7M0ojG8H53p7d4fj85aVhxNolVhHyciaITTyCTSYhSz EEKhEji6C4cC
/c5RSg6ul60yJfr9vZ8oEZRBsNEk2KAhVHUEqSXAPGN3uAQqN2GEwdOPHyBZ xCr4z7e/9NfJ
zjVo71IDUi6vXaqSl0prsyadjCInqo91leScJCHdVFFNyFDrnKOhEdwzPtVi fn6MWfJtC4q1
epI3W8LKygOMlnLTuSkgKdYA+20vgDsSL2jLuGh+1k05fSd5cJOMhhzuCcpI IZQmudKA5XDH
iFzKBWyEWsxYgRbMKJ+mkbHiJUsYB/GncfjQhPspC6dA4jwFxO1xms1yzS5I GInZjxIS6U2b
6A30Fl9kSS7XHc8ZEiNnDGlCcQvUPFoi0CBd3vr3uZJT+tiQuCxV5H5Ju/0h hsCleanc85is
rOCoYpL4CJAv0KUNLb8JzkHSokG3P/C6Hf/wVNA+PFMNqfyAUZrGVBRFHqCh GLIPmCxxTtcV
kC0MfCRJZHODquiX6wgwjXCZmUyStaYYxReSLCEVFZzDYo6ZpVIQkzKic3EG tQD68uTR7GqZ
JiETpZyhFWhEPmaoN9ZVSGLM64ncz6Q6CsXVCjs3iYlHCkU9KESpYER1kBcf KHoA9x44giL0
G11TEMIUlqBPajaImKjZeNlEClzNUBtq9BHAorQtaonxnMZjp/yvxyUK5XM8 hUv7CX80haF2
X+lKLWZK7igkKYcl5WgxTdwaVYDEMgs+yrVjluVcg4xOILm5ZZUeonZLwYWi EicnRH4Av08x
3eg8f2eygHJypGA3Hf2N7slVNqD+ZWxRMrUOJlYYJaMOvjl7NSFnEteTQsDr vG6zGQJoRvEU
QxjVojDGuTwRSCIT0olAkNyloYN8NifuGWos/ErwSERgFulcaM6nhEvPG2U1 6kn/O1o/Ef7V
gpfynK7HToopgw2cRbMC4JQqa+lqcUS1kBpGHOwDi5ga/BD2GwZfDvVRAQ2H 5XAFplsGFFsT
ys1Xl6WlzT3UQIVQdQzXI04w3zCV9Nno5mvpyF1pejHmrg0fSvoJisPGI5U0 ihV9BiZNdbc/
VjuDLcLeQULvV48Ya74D4DxbUNctCroLBJEFERFOTD0owrIHWmtSx5UbFJlT lGghu1bmhlRz
5V6R7JujJbY6LIlYKGzAoyEkyWuBYhBOSTLROVndaZxR+oM6YnXWlcme58BV haLbUwyuGEFL
9aF1s9PNs+pVXBAY3YaBOFoSEl+ReZ2eDctyaHWWadvH1AuRiMQXmA+LjGJk xYfG22dqbqq+
VrN9nRXuLLdD3dprdWvvUrfKJUqdkrWD4G60Ld+x1ClbNyo+p65Owy8Udl5r K8z5fijqSj8H
+kRpPO+oYGeEjob5LUOCGqvrmzynu6t02MWQMFkQ7GwjAfy6czUNlujmscdi tiNDFJLtsOxW
n6CV2hDDu5RFsKGjKnU72lOm3Tk1h7T14JpTWta+vKiIdF8+1lCqKEt3YEob 9dr45PX1DAnm
QwHUDcvWBEE4HAbdgd/repfDK+/GnpOVK67SBp1Lr98/qdC2N9C2Le26a6MS k3ceXFz4Pb87
GEp+y77mqqfE3b++8ofXgy9+z3LvokgCZ/pZWyipmGr17c3G65Vi4LP1pOvG DlOqev7TdbNl
yliZFLQDV+qn7NxqDTkdaanbzynvkplop72rokbEYn6DcyD7Lvvsm55/EfxV +oqtd6Nu0NC1
ypdzKmd6jAHNcoegLwbtdCGu0SXorSX0okhdDgmSXF7rKQBYLUfVYQla8eOL 6KxIFDXEPNoq
usqi/p3SfCxfbV/voJHBoVNAfkjNbzvqo2ucjBTK0HVZgh58boXq+UC8HDQh 6A+9T/1Bz+sM
mvAC3yQyXXgdX3777Hf9njfwz4dmQnLLG8D9RQomJxYVnPWGvA00w4Hwh+xt 60W060XUO3py
IsUJCi+bLGYqpaWHJ+2CaI3IXxIiPWoBvbZZb6IodCyza+hfcR/ehLdNOCn7 H32LTu/2A8Rb
5fiv15feILhUfu988bqffe+TeBUfb7t9fzCw78G5JLvtBn/e6qVzvxd89dX6 dQ/f/HNnQLUZ
4WZ1E1SPXmSFej1QEn83MXRcix8gMV0xBOhQu1TRQnnpAMteeU35yzGwbJMK 2+8k2zPmlxG5
0s3/knThtRtT3o10rpNs9hg31Ye+XQp9uxz69pOEfl282/+HeFfnod2Fu7bt a0IlIYsEqKw/
SSY42tR1kU0oe6vQpbz8JKrYzgGP0XSRhdTt1nt6ze04dP/6gKyVu7/9vX8A UEsHCOfRbLS0
BwAARiIAAFBLAwQUAAgACACHXkY4AAAAAAAAAAAAAAAAJwAAAGEvc3JjL3Bh Y2svaW1wbC9T
b21lT3RoZXJDbGFzc0ltcGwuamF2YbVSW2uDMBR+F/wPZ1DoBUx+QEVairBC h2XuvWg8tdnU
hBjHxuh/XxIpznZ0T3tJzsnluyV0sfA9WEDIhPxUvDzpqO/peMEtTrbFxBbU 92TG3rISwc6E
17Ja+p7vmUIoDUKVBFnFZYsE66OphUISb6qsbf8+Z9FInOSvyPT2CtnR7c2w 7/mX451U1Jjo
E6qBil4MPgQB5FjyJuhaVEEhGARBb3bdgCXFGhudaS4aEEcwMFCLAisQTgpM Q6yjMI8sCTgW
cDQhzaOQmr0pGZiwKW55QnkJVw6hrkpsUGUai0u0XV5xBsxiw9iRjQPwQxv0 Fn5ENMi/vuF7
XwYW+hTgbg5wRztcCwUnFUAqoY0ILH5ROpvbE44foO0kqtl8abuzfZh/FLVK 3lEpXuBYYf8B
AVP7yMw1I4kKdaca+PG9yI5rg161JE2e4kPy8hg/Hza7dZoOPs5A6a133/sG UEsHCCfOrRdb
AQAAWgMAAFBLAwQUAAgACACHXkY4AAAAAAAAAAAAAAAAJwAAAGEvc3JjL3Bh Y2svdXRpbC9Q
YWNrQWRhcHRlckZhY3RvcnkuamF2Ye1YUW/iOBB+R+I/zEkrNVQi6HiFovZ6 Xakv7erah76a
ZAK+TWLkmOXQiv9+M7YDSSg0bNk+tVKbxB7PfP6+8XjUweVltwOXMI7UYq3l bG4m7ntQH7CD
X+7jL/wy6HYWIvouZgj8DJdGpqNup9uR2UJpA0rPQoxSuSgwxCwJI5VlKg9z ZWSyDm9isTCo
Ry3NH/ghrX3LFWSUllG+isgovb6noWMOMFIaw7vH6b8Ymaqh3d+lHRmUVP3R 78MUZzLvLwvU
/VhF0O872p7nCOPpxAcHH308mE4gURoMTWcqxjS01vfkX6sfMsYCRA7CryIt YpxEGoXBl5cX
loK+IUMzV7H1gyKaQ5SKogCVNL1afJjH++iuC/SKfaM/35yEbmaGOWqKF5f6 LqepjHwMtqzz
CfifoRAF7NPc7fwkH+DYAs9JRIAxdijB507o5w/zCUd2A03UYHEDM2pIRIpW GGFoD5W9OgD+
w4paBXprGbdSyJwW5xGW9JbSJG6fvwu6I32f7qDH05ZXAJlAUN0HXF1BvkzT npv2VgB1myoN
Id4/PD3fPNzejZzxhh+bJh//oFnqvIDVnDIPOXtlUTIA9CoWC4Irpiluk9us F1vOlD1M7ah6
Ztd8bjHDnGVTOWgf3h0Ho5dYngRZDcBIUHqAXuGLokwyOukWalVSt6x5cN5U zOE5Dxuvyn/9
+AO1pmpQyYWpUiky+sKnwleln8lt8Oh3YR/N9PBbpMSoJkEzQfyGmNlqHtRc lKzRLnx1POAl
CMp5DynEWy4eQS+cobnzEIJeE1Q9sneWiLRwM3tJydWkWElDBdDMhQHyhDN7 bI2yRB+tnsVv
Lzq8rSeLb+zP8MTt1w3CldtojqvXTIMmu7Wc4B+fF+UNE4kC/6LfgP9Us6Hm ZUuso4VtvYOg
NyqNNqfEtNr+GbhH27jO+hyRhy7y8KTIw3dGvvlbJglqKlAusxvfbbE0lr0T 1JPK8JELksNU
/2wLqb7qHYhiTMQyNbeckXf7JeoYBm9+MPjm2H29vZ995fV3htBUe3wFOMPJ XwgtMnBeqzcQ
VR4LYFvdy8pa7RzeRtb6Utjq7/LJM1Y2yh5g9U7weCp1KIyVe9nVbb9sV3YP sG1rV3VbxP/u
TnUd48XP61Tm312zaUvTGLMJv4wH9LK5OKEt8Dl1qD3g1gcK5W6DFbeaOfXH hUzpVp7l1Nbb
Y1KMvEtpqDmgUMkyZd28ibBGfLdzo0AHQbpeYSXJeSS4cAt6M3Pvjfa8Xon1 KX0Dr60wtxV9
25MzOy26w7r4tVK+rziT8/o9+uty+prPgrrXT0kPSer4OVnUxj35gbIOd7IO P2U9Kuvw12Qd
frCszSaF9d2NgR38VPqQ0g32Tpb8UK/3Mdo3mkGWnofAjn1Kf1z6OnknK3+g pT6P8Ay+1IEJ
OK9856CxNU/Ntv8tgjYwGOz/g6zb+R9QSwcIhUxIGjkEAADJFgAAUEsDBBQA CAAIAIdeRjgA
AAAAAAAAAAAAAAAfAAAAYS9zcmMvcGFjay91dGlsL1BhY2tTd2l0Y2guamF2 Ye1ZyW7bSBC9
G/A/1GACmDIsaaxjJGvi2ApGQMYOLB18C1pkSeyYIgl2M4Zg+N+neuGqJfR4 y0EXhWzW+upV
d5fTPT4+PIBjGLhRvEr4wpdD896tLujFD2Pvg3roHh7EzL1jCwT1byeVPOgf Hhwe8GUcJRJ+
sJ9ML3a+ciHLX6Jk0UE34LHADi7n9Bwl2BldBEyI/q+krmc/0K2Y096P9Uo3 S+SPdhtmuOBh
OxWYtL3IhXbbJDX1EQaz4eSeS9cfdGdDmEcJSFpdRh4GRwJ46GPCJQtdBJ9j whLXX3W08liC
SGPlVmgVlwUBPHwKeHgHf3qRMerYIFuQr0Rm4VEbkRG5+BndoTZBoHs4dJnA 29tbhTi9wRKl
H3k6MmSuD67CBqJ5EeeJNiUkSyQPF0BufP2RuTJlQVXBeNcKLPQgTiIX0VNq aawFNmas5dOQ
KggMwihshyklm6BIAwlc0JNMkxA9E8m9zylObmCxQta90Bh0ispg6K3X5ZNA y6Rv9PPNUMt8
WWBIMUn0Mt6ls4C7NkclaYs5JUsPJAOGB2Cr7RKC6BnYIM4Nw06iwI5goR4U 6LBAISsJaXJG
hZEUYikV49++aLaW47xIkGwJqg8VQ5hKrMH3GhEbKAsQnZZa1igC8Dk45bDh 7AwUC1rms5UC
qMqUs+7g+GoyPb+6GPWNsGoB9VNLn/pIbG6FHT1g2RmFaMkoDFOhxNQ+cAkr joGnqMmkXX4B
OI1LHc2cJ0Ku9UjWIDBbUVwbk1P7R6dBfaZQ31yU32yfKVXMBpVLF1Id1Bus 0zopq/b35XhS
OfIGL1dEA6tR1U8nsLtGqqtyYSpLFErGyZfTUv1V7qV6n22qrrGyQKkf+Jy2 7/Hlpirb3gPA
QGDNsDqiB8bUEHCSxphMVzHtR2dQ8TEqPjmZ1Sys7A3KBjpcjJaxXFFufxcC AB7OGRXlgvAv
cbQFHytCWZ5lgxSF89f29PZcfhaXeSgNGpZIv+KyOZzAKevUWasCq5wJn88n o7zQD0XFPyvB
mfo5A0e9tAqn/UJsmqFwpk0rQUdptUoyqscyKXtmFVpbyFdStwWwdc7WH7dm dPH1fDI53ZST
bp1Tg+mpysssNMrMiBpsTxtnl2PyRL1XQqW3FZWeQaWXo9JrjkrPZNf7n6g0 13t5VM4vx1++
jG5GV9PvGqBN+Jxf8vkcEwzNrg6s9k6I1UQaQVfTcWpm3xGUyfW/o+/X039G N9tBmURLvCZ3
icFAVF8JkqpAI0SqKk7V5tvhYQ18zE/4nQY3H3Q39pyqDmC0oWMSk1k17hXD ILC1WeNogMuh
apFBlx6Omh1jU59GPhrEA1wSi2jmicL8wFQg9a2cWVMxrM+S95yeKcolD+mI 2jbzbDsrY5aw
ZZaV0qWRmO4Im6en8sn6ghjp2bWY/3f+6aK1dpVvNRoA8g1Mn5LRtpt/Dvrr 8MMcSXuGPB2l
t+KIvTTYe8e78qS358nTUXpTnvTsxevdeFLcSMydcM+Y5+D1Vtyp3yPr19X3 YpO6zYG+v+3Z
9Hy83opNtTt47Zr/Xlyyafw2FDqBWapooVyY1AgeaSYpFq7u2eo3JdlGIJ/E rUZMKo9M2d+s
GnLnEbrd4n9ADg/+A1BLBwiKEHnmuQQAABAdAABQSwECFAAUAAgACACHXkY4 Y3PMwM4AAAB2
AQAADAAAAAAAAAAAAAAAAAAAAAAAYS8uY2xhc3NwYXRoUEsBAhQAFAAIAAgA h15GOBFF8f3i
AAAAlgIAAAoAAAAAAAAAAAAAAAAACAEAAGEvLnByb2plY3RQSwECFAAUAAgA CACHXkY4w7mU
pIwAAADwAAAAEgAAAAAAAAAAAAAAAAAiAgAAYS9idWlsZC5wcm9wZXJ0aWVz UEsBAhQAFAAI
AAgAh15GONYC8N31AAAApgIAABMAAAAAAAAAAAAAAAAA7gIAAGEvcGx1Z2lu LnByb3BlcnRp
ZXNQSwECFAAUAAgACACHXkY4JaXEHNAAAABVAQAADAAAAAAAAAAAAAAAAAAk BAAAYS9wbHVn
aW4ueG1sUEsBAhQAFAAIAAgAh15GOJQeWKf5AAAArAEAABYAAAAAAAAAAAAA AAAALgUAAGEv
TUVUQS1JTkYvTUFOSUZFU1QuTUZQSwECFAAUAAgACACHXkY45mw3p/cBAACJ BwAAEgAAAAAA
AAAAAAAAAABrBgAAYS9tb2RlbC9tYXBzLmVjb3JlUEsBAhQAFAAIAAgAh15G OFVuE8W9AQAA
GAUAABUAAAAAAAAAAAAAAAAAoggAAGEvbW9kZWwvbWFwcy5nZW5tb2RlbFBL AQIUABQACAAI
AIdeRjiizmh77wAAAJsBAAAfAAAAAAAAAAAAAAAAAKIKAABhL3NyYy9wYWNr L0FEaWZmZXJl
bnRDbGFzcy5qYXZhUEsBAhQAFAAIAAgAh15GOHdQwC9gAQAAqQIAABQAAAAA AAAAAAAAAAAA
3gsAAGEvc3JjL3BhY2svQmFzZS5qYXZhUEsBAhQAFAAIAAgAh15GOJASJaIQ AQAA+wEAABYA
AAAAAAAAAAAAAAAAgA0AAGEvc3JjL3BhY2svQ2xhc3MxLmphdmFQSwECFAAU AAgACACHXkY4
gotxEhABAAD6AQAAFgAAAAAAAAAAAAAAAADUDgAAYS9zcmMvcGFjay9DbGFz czIuamF2YVBL
AQIUABQACAAIAIdeRjgl4TBaygEAABAHAAAbAAAAAAAAAAAAAAAAACgQAABh L3NyYy9wYWNr
L1BhY2tGYWN0b3J5LmphdmFQSwECFAAUAAgACACHXkY4Mly3QtgEAADbIgAA GwAAAAAAAAAA
AAAAAAA7EgAAYS9zcmMvcGFjay9QYWNrUGFja2FnZS5qYXZhUEsBAhQAFAAI AAgAh15GOLRs
H//xAAAAmAEAAB4AAAAAAAAAAAAAAAAAXBcAAGEvc3JjL3BhY2svU29tZU90 aGVyQ2xhc3Mu
amF2YVBLAQIUABQACAAIAIdeRjjHurcVXgEAAF8DAAAoAAAAAAAAAAAAAAAA AJkYAABhL3Ny
Yy9wYWNrL2ltcGwvQURpZmZlcmVudENsYXNzSW1wbC5qYXZhUEsBAhQAFAAI AAgAh15GOExG
vsuJAwAASg4AAB0AAAAAAAAAAAAAAAAATRoAAGEvc3JjL3BhY2svaW1wbC9C YXNlSW1wbC5q
YXZhUEsBAhQAFAAIAAgAh15GOB46XPWJAQAA7AMAAB8AAAAAAAAAAAAAAAAA IR4AAGEvc3Jj
L3BhY2svaW1wbC9DbGFzczFJbXBsLmphdmFQSwECFAAUAAgACACHXkY4WiZC roIBAADmAwAA
HwAAAAAAAAAAAAAAAAD3HwAAYS9zcmMvcGFjay9pbXBsL0NsYXNzMkltcGwu amF2YVBLAQIU
ABQACAAIAIdeRjhJw1chDQMAAC4MAAAkAAAAAAAAAAAAAAAAAMYhAABhL3Ny Yy9wYWNrL2lt
cGwvUGFja0ZhY3RvcnlJbXBsLmphdmFQSwECFAAUAAgACACHXkY459FstLQH AABGIgAAJAAA
AAAAAAAAAAAAAAAlJQAAYS9zcmMvcGFjay9pbXBsL1BhY2tQYWNrYWdlSW1w bC5qYXZhUEsB
AhQAFAAIAAgAh15GOCfOrRdbAQAAWgMAACcAAAAAAAAAAAAAAAAAKy0AAGEv c3JjL3BhY2sv
aW1wbC9Tb21lT3RoZXJDbGFzc0ltcGwuamF2YVBLAQIUABQACAAIAIdeRjiF TEgaOQQAAMkW
AAAnAAAAAAAAAAAAAAAAANsuAABhL3NyYy9wYWNrL3V0aWwvUGFja0FkYXB0 ZXJGYWN0b3J5
LmphdmFQSwECFAAUAAgACACHXkY4ihB55rkEAAAQHQAAHwAAAAAAAAAAAAAA AABpMwAAYS9z
cmMvcGFjay91dGlsL1BhY2tTd2l0Y2guamF2YVBLBQYAAAAAGAAYAL8GAABv OAAAAAA=
--------------040706060703010606050604--
Re: Complex Map Modeling [message #416585 is a reply to message #416579] Wed, 06 February 2008 20:46 Go to previous message
Jeff Lins is currently offline Jeff LinsFriend
Messages: 39
Registered: July 2009
Member
Good point. I suppose it doesn't matter if it's public or protected in
the impl just as long as it's suppressed from the interface. Guess I'm
still getting used to the interface/implementation class pattern :)

Nearly every operation that I will be modeling in the Base class will
depend on the getter for the EMap and so since those operations need to
be visible, that's why I said the operation is intrinsic to the domain.

In the bigger picture, Class1 and Class2 are actually wrappers for a
couple different maps I use throughout my model. Basically, they're my
own custom map classes. So now, whenever I use one of these EMaps in a
class, the wrapper class is what is exposed in Java instead of the EMap
and at the same time, I get to keep the multiplicity many reference.

I think I've finally got it now. Thanks for all the help!


Marcelo Paternostro wrote:
> Hi,
>
> Starting with the questions, the answer for constructors with parameters
> is no. Keep in mind that generic code such as the one that loads
> objects from resources or the one that copies EObjects would never be
> able to use them. That said, if you look at
> "org.eclipse.emf.ecore.change.ChangeFactory", you will see that we've
> added "special" factory methods like, for example,
> createFeatureChange(EStructuralFeature, Object, boolean). You just need
> to make sure that instances without such information will still work.
>
> I can't see how abstract methods to support features would work but it
> may be reasonable to support abstract operations. Pls open a feature
> request if you think it is a good improvement.
>
> One point that I am a bit curious is why you need to make the methods
> protected. If you generate the code using the standard
> "interface/implementation class" pattern and suppress the methods from
> the interface, they would only be available in the impls, which are not
> easily accessible to users.
>
> Another point is why to have the map modeled in the base class if you
> are not making it accessible: in your first post, there is no public
> getter and no setter at all. If it is just for convenience purposes, a
> trick you could do to avoid going for the work of customizing the
> templates, is to have a different name for the map in the base class,
> hide its accessors, and use operations in the subclasses. The attached
> project uses this approach.
>
> Cheers,
> Marcelo
>
> Gigaplex wrote:
>> Really, this is domain intrinsic. So I guess I will use the
>> annotations and jet to get the abstract method modeled. I suppose I
>> will have to do the same in order to get it to generate the set method
>> too, right? I can't see any way to generate a set method for an EMap.
>>
>> This whole thing would be 100 times easier if I could just make a
>> constructor for Class1 and Class2 that took an EMap. Are there any
>> plans to support constructors in EMF for the future? And are abstract
>> methods planned for the future?
>>
>> Marcelo Paternostro wrote:
>>> Hi,
>>>
>>> Hmmm... Let's go for another set of considerations ;-)
>>>
>>> - As you probably know, you can suppress getters and setters from the
>>> generated interface for any attributes - these methods would still be
>>> public members of the implementation class. So you could define the
>>> maps in Class1 and Class2 and "hide" the getters from the API.
>>>
>>> - You can't model an abstract operation directly in EMF. But, as Ed
>>> says, if there is a will, there is a way: you could always use the
>>> pair "gen/ecore annotation + template customization" to generate such
>>> a thing.
>>>
>>> - The same goes for protected methods. This one is a bit more tricky
>>> because you would need to prevent them to be added to the interface.
>>>
>>> - Regarding operations and features, you should only model things
>>> that are either intrinsic parts of the domain or have to be
>>> manipulated as API by other systems. So, if you want the getter to be
>>> protected, it means that you don't want it in your generated
>>> interface. Hence, I am guessing it should not be modeled.
>>>
>>> So, putting it all together, I agree with you. You should probably
>>> just manually add an abstract protected getter method to the basic
>>> class. EMF will not touch it the next time you generate the model.
>>>
>>> Btw, just 2 heads up if you go for the "suppress the getter"
>>> approach. The getters in the implementation classes of Class1 and
>>> Class2 will be generated as public methods and won't have the
>>> @Override annotation (which will problem cause your class to have
>>> some compilation warnings). You can fix these and mark the methods
>>> as generate not.
>>>
>>> Cheers,
>>> Marcelo
>>>
>>> Gigaplex wrote:
>>>> Thanks for the detailed response! The set methods for Class1 and
>>>> Class2 actually need to come from attributes.
>>>>
>>>> The get method however, doesn't need to and can come from an operation.
>>>>
>>>> So I guess I could make the attributes for each of the two classes
>>>> and then suppress the get. I could then model a get operation for
>>>> the abstract Base class and then I'd almost have it.
>>>>
>>>> The only problem then is that I don't know how to make the get
>>>> operation in BaseImpl abstract. I want BaseImpl to be using this get
>>>> method from elsewhere in its class but the method shouldn't be
>>>> implemented by BaseImpl itself - it should be implemented by the
>>>> classes that extend it.
>>>>
>>>> The other issue I see is that I apparently can't make the get method
>>>> protected. If the abstract method was only in the BaseImpl class and
>>>> not in the Base interface then that would work as well. Can that be
>>>> done?
>>>>
>>>> Perhaps, since the get method is nothing more than plumbing, it
>>>> should not even be in the model. I am still very curious though if
>>>> abstract methods and only putting methods in an Impl are possible.
>>>>
>>>>
>>>>
>>>> Marcelo Paternostro wrote:
>>>>> Hi,
>>>>>
>>>>> There are a few considerations that I have to make before answering
>>>>> your question:
>>>>>
>>>>> - You won't be able to model protected methods or attributes. The
>>>>> basic idea is that everything that you model is, ultimately,
>>>>> accessible to the clients of your code.
>>>>>
>>>>> - As extensions of the abstract class, Class1 and Class2 inherit
>>>>> the get method so you don't need to defined it again on each class.
>>>>>
>>>>> - Is there a modeled attribute for the map or are you thinking on
>>>>> using operations? If you are using an attribute, EMF would
>>>>> generate a set(Map<MyClass,?>) method in the abstract class which
>>>>> would conflict with the setters you want to define in the
>>>>> subclasses (a "Java" conflict not an "EMF" one ;-). So I will
>>>>> assume that you are modeling operations.
>>>>>
>>>>> All that said, I am attaching here a project with an ecore model
>>>>> that has what I think you are trying to do.
>>>>>
>>>>> Cheers,
>>>>> Marcelo
>>>>>
>>>>> Gigaplex wrote:
>>>>>> I have an abstract class that two other classes extend. I need a
>>>>>> method in this abstract class like this:
>>>>>>
>>>>>> protected abstract EMap<MyClass, ?> getMap();
>>>>>>
>>>>>>
>>>>>> Then, I have two classes (not abstract) that extend this abstract
>>>>>> class that need to look like this:
>>>>>>
>>>>>> Class 1
>>>>>> protected EMap<MyClass, ?> getMap();
>>>>>> public void setMap(EMap<MyClass, ADifferentClass>)
>>>>>>
>>>>>> Class 2
>>>>>> protected EMap<MyClass, ?> getMap();
>>>>>> public void setMap(EMap<MyClass, SomeOtherClass>)
>>>>>>
>>>>>>
>>>>>> Is it possible to model something like this in EMF? I've modeled
>>>>>> maps before but nothing like this.
Previous Topic:Incompatible XML after DocumentRoot fix
Next Topic:Common Navigator + EMF + Properties View
Goto Forum:
  


Current Time: Thu Apr 18 23:55:30 GMT 2024

Powered by FUDForum. Page generated in 0.02367 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top