Okay Chip, posted a comment on the issue. Hi Kelven, you want to check my fix. Thanks.
Regards. On Thu, Feb 21, 2013 at 8:17 PM, Chip Childers <[email protected]> wrote: > > Can you coordinate with Kelvin on this? He's got CLOUDSTACK-1276, and > had previously mentioned this exact same thing (using the xml file vs. > annotations). > > On Thu, Feb 21, 2013 at 07:26:42PM +0530, Rohit Yadav wrote: >> Just to add, we will have separate xmls for every kind of profile, I >> can make every plugin have its own spring xml which is copied and >> injected to the web.xml comments, suggestions, flames? >> >> Possible future experiments: >> - Spring xmls artefacts based >> - Have a way to fix AOP, don't add pointcuts on all classes, methods >> - Make DI framework replaceable in CloudStack, I would go for Guice ;) >> >> Regards. >> >> On Thu, Feb 21, 2013 at 7:22 PM, Rohit Yadav <[email protected]> wrote: >> > I'm experimenting with removing all @Components and moving beans into >> > an xml that could be read by spring to do DI. >> > This decreases the load time and >> > >> > Errors: >> > - Abstract classes annotated as spring components >> > - Annotations for project which are not included in either build >> > profiles: usage, simulator, oss (default) and nonoss >> > - Some project don't even build or are not part of any build >> > artefacts, looks like the @Component annotation was done in a hurry :) >> > - Interfaces being annotated as spring components >> > - Prasanna, Abhi and I spoke with Spring gurus Vijay V and Vaibhav on >> > how to fix this bloat, so in applicationContext.xml we do some aop >> > stuff to have transaction stuff we get from @DB annotation and this >> > needs fixing as it's applying the following for all classes and >> > methods (dude bloat, run! :) >> > >> > <aop:config proxy-target-class="true"> >> > <aop:aspect id="dbContextBuilder" ref="transactionContextBuilder"> >> > <aop:pointcut id="captureAnyMethod" >> > expression="execution(* *(..))" >> > /> >> > >> > Methodology and results: >> > I wrote a python program that would go through the whole source code >> > and fix all java files (except test, awsapi) who have @Component and >> > create bean rules in an xml file. Next I had to manually fix few >> > things (see error above) and I got the mgmt server running, the load >> > time had improved a lot (little faster now) after disabling >> > autoscanning and just using the xml generated. I see the benefit of >> > just using the xml and not having spring as a build time dependency >> > (we're using @Component in our classes so :). >> > >> > This was an experiment mostly because a lot of folks are having spring >> > memory issues, especially Prasanna's devcloud-ci cannot run and check >> > our commits as memory kills dom0. So, if no one objects may I go ahead >> > and commit it? For me the jvm took about 650MB real memory on osx. >> > >> > Right now I made it for all build profiles, nonoss being the superset, >> > my experiment can be checked out from here: >> > https://github.com/bhaisaab/cloudstack/tree/spring-annotation-to-xml >> > >> > Regards. >> > >> > The python program, in case anyone wants to replicate or is curious: >> > (defaulter is just a file containing result of: file . | grep java$ > >> > defaulter) >> > f = open('defaulter', 'r') >> > files = f.read().split('\n')[:-1] >> > files = filter(lambda x: not x.startswith('./awsapi') and >> > x.find('/test/') == -1, files) >> > xmldata = "" >> > bean = """ <bean id="%s" class="%s"/>\n""" >> > xml = """<!-- >> > Licensed to the Apache Software Foundation (ASF) under one >> > or more contributor license agreements. See the NOTICE file >> > distributed with this work for additional information >> > regarding copyright ownership. The ASF licenses this file >> > to you under the Apache License, Version 2.0 (the >> > "License"); you may not use this file except in compliance >> > with the License. You may obtain a copy of the License at >> > >> > http://www.apache.org/licenses/LICENSE-2.0 >> > >> > Unless required by applicable law or agreed to in writing, >> > software distributed under the License is distributed on an >> > "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >> > KIND, either express or implied. See the License for the >> > specific language governing permissions and limitations >> > under the License. >> > --> >> > <beans xmlns="http://www.springframework.org/schema/beans" >> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> > xmlns:context="http://www.springframework.org/schema/context" >> > xmlns:tx="http://www.springframework.org/schema/tx" >> > xmlns:aop="http://www.springframework.org/schema/aop" >> > xsi:schemaLocation="http://www.springframework.org/schema/beans >> > >> > http://www.springframework.org/schema/beans/spring-beans-3.0.xsd >> > http://www.springframework.org/schema/tx >> > >> > http://www.springframework.org/schema/tx/spring-tx-3.0.xsd >> > http://www.springframework.org/schema/aop >> > >> > http://www.springframework.org/schema/aop/spring-aop-3.0.xsd >> > http://www.springframework.org/schema/context >> > >> > http://www.springframework.org/schema/context/spring-context-3.0.xsd"> >> > >> > %s >> > </beans> >> > """ >> > misses = [] >> > for file in files: >> > name = file.split('/')[-1].split('.')[0] >> > name = name[0].lower() + name[1:] >> > pkgname = "" >> > idx = 0 >> > paths = file.split('/')[1:] >> > paths[-1] = paths[-1].split('.')[0] >> > for str in paths: >> > if str == 'org' or str == 'com': >> > pkgname = '.'.join(paths[idx:]) >> > idx += 1 >> > f = open(file, 'r') >> > data = f.read() >> > f.close() >> > idx = data.find('@Component') >> > if idx == -1: >> > misses.append(file) >> > continue >> > string = '@Component' >> > if data[len(string)+idx] == '(': >> > endidx = data.find(')', len(string)+idx) >> > name = data[len(string)+idx+1:endidx].split('=')[-1].replace('"', '') >> > name = name.replace("'", '') >> > data = data[:idx] + data[endidx+2:] >> > else: >> > data = data.replace(string, '') >> > data = data.replace('import >> > org.springframework.stereotype.Component;\n', '') >> > f = open(file, 'w') >> > f.write(data) >> > f.close() >> > print name, pkgname >> > xmldata += bean % (name, pkgname) >> > xmldata += "\n" >> > >> > xml = xml % xmldata >> > f = open('./client/tomcatconf/defaultComponentContext.xml.in', 'w') >> > f.write(xml) >> > f.close() >> > >> > f = open('misses', 'w') >> > f.write('\n'.join(misses)) >> > f.close() >>
