Hi Alena, It looks like this was not included in version 4.4. Anyway, do you have any comments on my reply?
Thanks Alex Ough On Thu, Mar 13, 2014 at 9:48 PM, Alex Ough <alex.o...@sungard.com> wrote: > What I think based on your comments are > > 1. Well, I have a different thought. I'd rather have separated classes > instead of having a class with lots of methods, which makes the maintenance > easier. And as you show as an example, it is possible to create a method > and merge them, but I think it is better to provide separate methods that > are exposed outside so that the callers can know what to call with ease. > > 2. Let me look at that. > > 3. I'm not sure why you think they are adapters, but let me look at that > class. > > 4. OK, let me work on this. > > 5. The urls are stored in the region table along with username and > password. Please see 'RegionVO' under > 'engine/schema/src/org/apache/cloudstack/region'. > > Thanks > Alex Ough > > > On Thu, Mar 13, 2014 at 5:49 PM, Alena Prokharchyk < > alena.prokharc...@citrix.com> wrote: > >> Alex, >> >> There are so many classes, and it makes it hard to see/review the feature. >> Can you come up with some sort of visual diagram, so its easier to see >> which component is responsible for what task, and how they interact with >> each other. >> >> My suggestions: >> >> 1) I think it would make sense to merge all the classes doing utils tasks >> (forming and sending Apis to CS) - UserInterface, AccountInterface, >> DomainInterface - to a single util class. They do return generic types >> anyway - JsonArray/JsonObject, and they do perform a generic util task - >> forming and sending the request to the CS. I would merge them all with the >> BaseInterface and name it with the name indicating that this class is >> responsible for sending API calls against CS. And this would be your util >> class. >> >> >> You should also come up with some generic method that forms the requests >> to CS APIs to make the code cleaner. >> >> For example, look at these 2: >> >> >> public JSONObject lockUser(String userId) throws Exception { >> String paramStr = "command=lockUser&id=" + userId + >> "&response=json&sessionkey=" + URLEncoder.encode(getSessionKey(), >> "UTF-8"); >> return sendApacheGet(paramStr); >> } >> >> >> public JSONObject disableUser(String userId) throws Exception { >> >> String paramStr = "command=disableUser&id=" + userId + >> "&response=json&sessionkey=" + URLEncoder.encode(getSessionKey(), >> "UTF-8"); >> return sendApacheGet(paramStr); >> } >> >> >> You repeat appending json and session key in all of them. Why not create >> some generic method where you pass a) commandName 2) map of parameters, >> and make that method return JsonObject/JsonArray? >> >> >> 2) I would suggest you utilize Spring framework in your code and auto wire >> all the dependencies by using @Inject rather than locating them with the >> components lifecycle. Please refer to Apache Wiki: >> >> >> https://cwiki.apache.org/confluence/display/CLOUDSTACK/Using+Spring+in+Clou >> dStack >> >> >> >> >> 3) AccountFullSyncProcessor/DomainFullSyncProcessor/<other processors>. >> These looks like adaptors to me. Have you looked at how AdapterBase is >> utilized in CS? You should take a look at it. >> >> >> 4) I see that you have a folder called "simulator". Does this folder >> contain Test classes used by some kind of simulator? Or would they be used >> in production? If its just for testing, please rename them by putting the >> word "Simulator" in the name. Look at how other simulator classes are >> named in CS (SimulatorImageStoreLifeCycleImpl.java for example) >> >> 5) In the code, I haven't noticed where you store/read the end point URL >> to the CS Management server - the server address you are gonna send your >> requests to. If for example, you have MS1 and MS2, will your plugin from >> MS1 ever sends a request to MS2? And if it sends the request only to MS1, >> what ip address it uses? >> >> >> >> -Alena. >> >> On 3/13/14, 2:58 PM, "Alex Ough" <alex.o...@sungard.com> wrote: >> >> >They are not called outside and only called from 'subscriber' classes and >> >FullScanner class. >> > >> >Do you think these name changes are ok? >> > >> > - BaseInterface - UserInterface, AccountInterface, DomainInterface >> > => APICaller - APIUserCaller, APIAccountCaller, APIDomainCaller >> > >> > - BaseService - UserService, AccountService, DomainService >> > => RemoteResourceProcessor - RemoteUserProcessor, >> >RemoteAccountProcessor, RemoteDomainProcessor >> > >> > - FullSyncProcessor - UserFullSyncProcessor, >> AccountFullSyncProcessor, >> >DomainFullSyncProcessor >> > => no change >> > >> > - RemoteEventProcessor - RemoteUserEventProcessor, >> >RemoteAccountEventProcessor, RemoteDomainEventProcessor >> > => no change >> > >> >Thanks >> >Alex Ough >> > >> > >> > >> >On Thu, Mar 13, 2014 at 3:58 PM, Alena Prokharchyk < >> >alena.prokharc...@citrix.com> wrote: >> > >> >> You extract stuff into interfaces when the methods are meant to be >> >>called >> >> from different classes/Managers. Do you implement to add APIs for your >> >> plugins? Can your plugin be used by any other CS manager - >> RegionManager >> >> for example? If the answer is yes, then you would need an interface. If >> >> not, abstract class is fine, just remove Interface/Service from the >> >>name. >> >> Also rename your classes to reflect the purpose they are developed for; >> >> account/user/domain is way too generic and already used in other CS >> >> packages. >> >> >> >> >> >> >> >> >> >> >> >> On 3/13/14, 1:50 PM, "Alex Ough" <alex.o...@sungard.com> wrote: >> >> >> >> >Patch B, >> >> > >> >> >1. The reason why I use abstract classes instead of interfaces is >> >>because >> >> >there are some basic methods that are used among the inherited >> >>classes, so >> >> >I'm not sure why it has to be an interface. >> >> > >> >> >2. These are the abstract base classes along with their inherited >> >>classes >> >> >and they are grouped by their behavior. >> >> > - BaseInterface - UserInterface, AccountInterface, DomainInterface >> >> > - BaseService - UserService, AccountService, DomainService >> >> > - FullSyncProcessor - UserFullSyncProcessor, >> >>AccountFullSyncProcessor, >> >> >DomainFullSyncProcessor >> >> > - RemoteEventProcessor - RemoteUserEventProcessor, >> >> >RemoteAccountEventProcessor, RemoteDomainEventProcessor >> >> > >> >> > => Do you recommend to refactor them into defining interfaces and >> >> >creating one class implementing all methods related with each user, >> >> >account >> >> >and domain? >> >> > >> >> >3. Let me work on changing names. >> >> > >> >> >Thanks >> >> >Alex Ough >> >> > >> >> > >> >> > >> >> > >> >> >On Thu, Mar 13, 2014 at 3:14 PM, Alena Prokharchyk < >> >> >alena.prokharc...@citrix.com> wrote: >> >> > >> >> >> Alex, see inline. >> >> >> >> >> >> -Alena. >> >> >> >> >> >> From: Alex Ough <alex.o...@sungard.com> >> >> >> Date: Thursday, March 13, 2014 at 1:00 PM >> >> >> To: Alena Prokharchyk <alena.prokharc...@citrix.com> >> >> >> Cc: "dev@cloudstack.apache.org" <dev@cloudstack.apache.org>, >> >>Chiradeep >> >> >> Vittal <chirade...@gmail.com> >> >> >> >> >> >> Subject: Re: [DISCUSS]{BEHAVIORAL-CHANGE]Domain-Account-User Sync Up >> >> >> Among Multiple Regions >> >> >> >> >> >> Hi Alena, >> >> >> >> >> >> Patch B, >> >> >> I'm not quite familiar with java, so I have a little difficulty in >> >> >> following your recommendation. >> >> >> Can you send me an example using 'BaseInterface' and/or >> >> >>'AccountInterface'? >> >> >> >> >> >> >> >> >> - What is called an interface in java: >> >> >> >> >>http://docs.oracle.com/javase/tutorial/java/concepts/interface.html. >> >> >> Its a place where all your methods are defined w/o actual >> >> >>implementation. >> >> >> - Look at any of cloudStack Managers implementation. Take for >> >> >>example: >> >> >> >> >> >> >> >> >> 1. AcccountManagerImpl.java - class where all the methods are >> >> >> implemented. Part of the server package >> >> >> 2. AccountManagerImpl implements 2 interfaces - AccountManager >> and >> >> >> AccountService. If you want any of your methods to be used by >> >> >> plugins/services, define them in Service interface. If all of >> them >> >> >>are >> >> >> meant to be used just inside your plugin/or cloudstack >> >>core/server - >> >> >>define >> >> >> them in Manager interface. >> >> >> 3. I would suggest you rename your classes/interfaces by adding >> >>your >> >> >> feature specific keyword to the name. CloudStack already has >> >> >>AccountService >> >> >> interface. And BaseInterface name is way too generic. Plus you >> >> >>shouldn't >> >> >> really put an "Interface" to the name. >> >> >> >> >> >> >> >> >> >> >> >> It will be very helpful and appreciated. >> >> >> >> >> >> Patch A, >> >> >> To reduce the number of requests to the remote regions >> >> >> because the syncing is always using the api requests a lot to get >> >> >> information of domains/accounts/users from remote regions. >> >> >> >> >> >> >> >> >> >> >> >> - you can't ,modify cloudStack core/server code only to fix >> >>problem >> >> >> that is specific to your plugin/service. The solution for your >> >>case >> >> >>will be >> >> >> - create in memory data structure where you keep account/domain >> >> >> information. Account->domain relationship don't change along >> >>account >> >> >> lifecycle, as well as the domain path doesn't change for the >> >>domain >> >> >>once >> >> >> its created. And get the domain path from there. >> >> >> >> >> >> >> >> >> >> >> >> And let me change the concatenation into using StringBuilder. >> >> >> >> >> >> Thanks a lot for your reply. >> >> >> Alex Ough >> >> >> >> >> >> >> >> >> On Thu, Mar 13, 2014 at 2:41 PM, Alena Prokharchyk < >> >> >> alena.prokharc...@citrix.com> wrote: >> >> >> >> >> >>> Alex, I have some comments. >> >> >>> >> >> >>> Patch B. >> >> >>> >> >> >>> * You shouldn't make your service a part of cloud-mom-rabbitmq >> >>plugin. >> >> >>> Your subscribers/implementation are specific to your feature, and >> >>you >> >> >>>need >> >> >>> to introduce a special plugin just for your service. >> >> >>> * AccountInterface and BaseInterface are still regular classes. You >> >> >>>should >> >> >>> split them into Service interface /ManagerImpl or Manager interface >> >> >>> /ManagerImpl as Chiradeep suggested. >> >> >>> * Once you extract services interfaces, make sure you don't use VO >> >> >>>objects >> >> >>> in methods signatures. >> >> >>> * You should really get a use of @Manager interface and @Inject >> >> >>> annotations for autowiring your managers instead of setting them up >> >> >>>using >> >> >>> ComponentContext.getComponent() in each of your manager classes. >> >> >>> >> >> >>> >> >> >>> >> >> >>> Patch A. >> >> >>> >> >> >>> * AccountResponse. Why did you add domain path to the account >> >>response? >> >> >>> You can always retrieve it by a) get domain info from account >> >>response >> >> >>>b) >> >> >>> execute listDomains&domainId to get the domain path. Try not to >> >> >>>overload >> >> >>> the response with attributes that don't belong to response's first >> >> >>>class >> >> >>> object. >> >> >>> >> >> >>> >> >> >>> Generic comments. >> >> >>> >> >> >>> * I can see that you do a lot of string concatenation this way: >> >> >>>paramStr >> >> >>> += "&email=" + email + "&firstname=" + firstName + "&lastname=" + >> >> >>>lastName >> >> >>> + "&accounttype=" + accountType; >> >> >>> I would suggest to use StringBuilder instead. >> >> >>> >> >> >>> >> >> >>> >> >> >>> >> >> >>> On 3/13/14, 9:33 AM, "Alex Ough" <alex.o...@sungard.com> wrote: >> >> >>> >> >> >>> >Chiradeep, >> >> >>> > >> >> >>> >Any comments on them? >> >> >>> > >> >> >>> >Thanks >> >> >>> >Alex Ough >> >> >>> > >> >> >>> > >> >> >>> >On Wed, Mar 12, 2014 at 10:58 AM, Alex Ough < >> alex.o...@sungard.com> >> >> >>> wrote: >> >> >>> > >> >> >>> >> And I also uploaded the patch B that includes new implementation >> >>to >> >> >>> >> support multi regions. >> >> >>> >> >> >> >>> >> Thanks >> >> >>> >> Alex Ough >> >> >>> >> >> >> >>> >> >> >> >>> >> On Wed, Mar 12, 2014 at 10:17 AM, Alex Ough >> >><alex.o...@sungard.com> >> >> >>> >>wrote: >> >> >>> >> >> >> >>> >>> I uploaded the patch A that includes only core changes, so >> >>please >> >> >>> >>>review >> >> >>> >>> it and let me know if you have any comments. >> >> >>> >>> >> >> >>> >>> Thanks >> >> >>> >>> Alex Ough >> >> >>> >>> >> >> >>> >>> >> >> >>> >>> On Wed, Mar 12, 2014 at 8:24 AM, Alex Ough >> >><alex.o...@sungard.com> >> >> >>> >>>wrote: >> >> >>> >>> >> >> >>> >>>> Hi Chiradeep, >> >> >>> >>>> >> >> >>> >>>> Can you give me the example of the Singleton service class you >> >> >>> >>>>mentioned? >> >> >>> >>>> I'm not sure if you are asking the name changes or else >> because >> >> >>>those >> >> >>> >>>> classes are abstract classes and do not need to be singleton >> >> >>>class. >> >> >>> >>>> >> >> >>> >>>> And let me try the refactoring and ask confirmations to you, >> >>so I >> >> >>> >>>>hope I >> >> >>> >>>> can get the reply soon. >> >> >>> >>>> >> >> >>> >>>> Thanks >> >> >>> >>>> Alex Ough >> >> >>> >>>> >> >> >>> >>>> >> >> >>> >>>> On Wed, Mar 12, 2014 at 4:13 AM, Daan Hoogland >> >> >>> >>>><daan.hoogl...@gmail.com>wrote: >> >> >>> >>>> >> >> >>> >>>>> H Alex, I considder Chiradeeps comments quite valid and >> >>serious >> >> >>> >>>>>enough >> >> >>> >>>>> to anticipate not making friday 14:00 CET. That would mean no >> >> >>>merge >> >> >>> >>>>> before 4.4. Can you live with that? >> >> >>> >>>>> >> >> >>> >>>>> On Wed, Mar 12, 2014 at 6:40 AM, Chiradeep Vittal >> >> >>> >>>>> <chiradeep.vit...@citrix.com> wrote: >> >> >>> >>>>> > Hi Alex, >> >> >>> >>>>> > >> >> >>> >>>>> > If you look at the general design of CloudStack, there are >> >> >>> >>>>>Singleton >> >> >>> >>>>> > service interfaces which are then implemented with real >> >> >>>classes. >> >> >>> >>>>>This >> >> >>> >>>>> > facilitates easy testing by mocking the interface. In your >> >>new >> >> >>> >>>>>files >> >> >>> >>>>> > (BaseInterface, which by the way is NOT an interface, >> >> >>> >>>>>AccountService, >> >> >>> >>>>> > which is NOT a service like other CloudStack services, and >> >>so >> >> >>>on), >> >> >>> >>>>> this >> >> >>> >>>>> > design paradigm is not followed. Therefore it is >> >>incongruous to >> >> >>> the >> >> >>> >>>>> rest >> >> >>> >>>>> > of the code base. >> >> >>> >>>>> > >> >> >>> >>>>> > Furthermore this has been plopped right in the middle of >> >>other >> >> >>> core >> >> >>> >>>>> > CloudStack code (server/src/com/cloud/region/). If you look >> >>at >> >> >>>the >> >> >>> >>>>> > EventBus logic, it has been written as a plugin, thereby >> >> >>>enabling >> >> >>> >>>>> users >> >> >>> >>>>> > who do not need it to disable it. This level of >> >>configuration >> >> >>>is >> >> >>> >>>>> needed >> >> >>> >>>>> > and I can't find it. >> >> >>> >>>>> > >> >> >>> >>>>> > So, to summarize: >> >> >>> >>>>> > 1. Split it into patches. Patch A is the change to the core >> >> >>>DAOs, >> >> >>> >>>>>db >> >> >>> >>>>> > logic, schema upgrade code, etc. >> >> >>> >>>>> > 2. Patch B is the actual sync service written as an >> optional >> >> >>> plugin >> >> >>> >>>>> with >> >> >>> >>>>> > the package name space of org.apache. >> >> >>> >>>>> > >> >> >>> >>>>> > On 3/11/14, 3:09 PM, "Alex Ough" <alex.o...@sungard.com> >> >> wrote: >> >> >>> >>>>> > >> >> >>> >>>>> >>Hi Daan, >> >> >>> >>>>> >> >> >> >>> >>>>> >>I didn't update the patch after the couple of works because >> >>I >> >> >>> >>>>>wanted >> >> >>> >>>>> to do >> >> >>> >>>>> >>it with others Chiradeep asked if any. >> >> >>> >>>>> >>Let me know when you want me to. >> >> >>> >>>>> >> >> >> >>> >>>>> >>Thanks >> >> >>> >>>>> >>Alex Ough >> >> >>> >>>>> >> >> >> >>> >>>>> >> >> >> >>> >>>>> >>On Tue, Mar 11, 2014 at 4:37 PM, Daan Hoogland >> >> >>> >>>>> >><daan.hoogl...@gmail.com>wrote: >> >> >>> >>>>> >> >> >> >>> >>>>> >>> I will call the merge in a moment, but won't do it >> >> >>>immediately. >> >> >>> >>>>> >>> >> >> >>> >>>>> >>> Be there for me when any issues come up. If not I will >> >>revert >> >> >>> it. >> >> >>> >>>>> >>> >> >> >>> >>>>> >>> @Chiradeep: did Alex answer your concerns adequately? >> >> >>> >>>>> >>> >> >> >>> >>>>> >>> >> >> >>> >>>>> >>> kind regards, >> >> >>> >>>>> >>> >> >> >>> >>>>> >>> On Tue, Mar 11, 2014 at 6:43 PM, Alex Ough >> >> >>> >>>>><alex.o...@sungard.com> >> >> >>> >>>>> >>>wrote: >> >> >>> >>>>> >>> > I worked on a couple of items, so can you give me the >> >> >>> >>>>> confirmation for >> >> >>> >>>>> >>> the >> >> >>> >>>>> >>> > rest items so that I can wrap this up? >> >> >>> >>>>> >>> > I really want to include this into 4.4. >> >> >>> >>>>> >>> > >> >> >>> >>>>> >>> > Thanks >> >> >>> >>>>> >>> > Alex Ough >> >> >>> >>>>> >>> > >> >> >>> >>>>> >>> > >> >> >>> >>>>> >>> > On Mon, Mar 10, 2014 at 3:41 PM, Alex Ough >> >> >>> >>>>><alex.o...@sungard.com >> >> >>> >>>>> > >> >> >>> >>>>> >>> wrote: >> >> >>> >>>>> >>> > >> >> >>> >>>>> >>> >> Please see my reply/question in blue. >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> Thanks >> >> >>> >>>>> >>> >> Alex Ough >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> On Mon, Mar 10, 2014 at 1:25 PM, Chiradeep Vittal < >> >> >>> >>>>> >>> >> chiradeep.vit...@citrix.com> wrote: >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >>> I haven¹t looked at it because it is huge. But >> >> >>>preliminary >> >> >>> >>>>>scan: >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >>> - there are unit tests missing for changes to core CS >> >> >>>code >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >> Unit tests for only new classes were added >> >> >>>because I >> >> >>> >>>>> >>>couldn't >> >> >>> >>>>> >>> >> find unit tests of the ones I modified >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >>> - uses com.amazonaws.util.json (why?) >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >> They are used to handle the json objects. Let >> >>me >> >> >>> know >> >> >>> >>>>> if you >> >> >>> >>>>> >>> >> want me to replace it with another. >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> - code format does not follow coding convention ( >> >> >>>placement >> >> >>> of >> >> >>> >>>>> {}, >> >> >>> >>>>> >>>camel >> >> >>> >>>>> >>> >>> case api_interface ) >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >> Done >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >>> - package namespace is com.cloud instead of >> org.apache >> >> >>>for >> >> >>> >>>>>new >> >> >>> >>>>> files >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >> I didn't know that. So do I need to use >> >> >>>'org.apache' >> >> >>> >>>>> package >> >> >>> >>>>> >>> for >> >> >>> >>>>> >>> >> all new classes? >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> - no file-level comments. What does >> LocalAccountManager >> >> >>>do? >> >> >>> >>>>>Why >> >> >>> >>>>> does >> >> >>> >>>>> >>>it >> >> >>> >>>>> >>> >>> exist? Etc. >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >> Done. >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >>> - No interfaces, only abstract classes. No use of >> >> >>>@Inject. >> >> >>> >>>>>While >> >> >>> >>>>> >>>this >> >> >>> >>>>> >>> >>> might be OK, it does make it harder to test and does >> >>not >> >> >>> >>>>>follow >> >> >>> >>>>> the >> >> >>> >>>>> >>> rest >> >> >>> >>>>> >>> >>> of ACS conventions. >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >> I don't think there is any interface, but let >> >>me >> >> >>>know >> >> >>> >>>>>if >> >> >>> >>>>> you >> >> >>> >>>>> >>> find >> >> >>> >>>>> >>> >> any. >> >> >>> >>>>> >>> >> Any recommendation to replace @inject? >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >>> I would urge the submitter to break up the >> submission. >> >> >>> >>>>> >>> >>> A) the changes to CS core, with explanations / >> >>comments >> >> >>>and >> >> >>> >>>>> tests >> >> >>> >>>>> >>> >>> B) the sync service should be an interface with >> >>concrete >> >> >>> >>>>> >>> implementations >> >> >>> >>>>> >>> >>> in its own package >> >> >>> >>>>> >>> >>> C) more tests >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >> can you give me a little specific what kind of >> >> >>>tests >> >> >>> >>>>>you >> >> >>> >>>>> need >> >> >>> >>>>> >>> >> more? >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >>> On 3/10/14, 3:37 AM, "Daan Hoogland" >> >> >>> >>>>><daan.hoogl...@gmail.com> >> >> >>> >>>>> >>>wrote: >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >>> >Hi everyody, >> >> >>> >>>>> >>> >>> > >> >> >>> >>>>> >>> >>> >The people at sungard have been making this change >> >>for >> >> >>>4.4 >> >> >>> >>>>>and >> >> >>> >>>>> I >> >> >>> >>>>> >>>want >> >> >>> >>>>> >>> >>> >to merge/apply it this week. It is more then a >> >> >>>screenfull >> >> >>> >>>>>and >> >> >>> >>>>> might >> >> >>> >>>>> >>> >>> >cause issue is a setup or two. >> >> >>> >>>>> >>> >>> > >> >> >>> >>>>> >>> >>> >have a look at https://reviews.apache.org/r/17790/ >> >> >>> >>>>> >>> >>> > >> >> >>> >>>>> >>> >>> >a ref to ticket and fs page are in the review >> >>request. >> >> >>> >>>>> >>> >>> > >> >> >>> >>>>> >>> >>> >kind regards, >> >> >>> >>>>> >>> >>> >-- >> >> >>> >>>>> >>> >>> >Daan >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >>> >> >> >>> >>>>> >>> >> >> >> >>> >>>>> >>> >> >> >>> >>>>> >>> >> >> >>> >>>>> >>> >> >> >>> >>>>> >>> -- >> >> >>> >>>>> >>> Daan >> >> >>> >>>>> >>> >> >> >>> >>>>> >>> >> >> >>> >>>>> > >> >> >>> >>>>> >> >> >>> >>>>> >> >> >>> >>>>> >> >> >>> >>>>> -- >> >> >>> >>>>> Daan >> >> >>> >>>>> >> >> >>> >>>>> >> >> >>> >>>> >> >> >>> >>> >> >> >>> >> >> >> >>> >> >> >>> >> >> >> >> >> >> >> >> >> >