You are running into problems because you are trying to do something that is extremely tricky with a circular dependency between components. I.e., an extremely bad idea in a component oriented project and probably in any project.

Circular dependency:
ds needs partitions before it's completely initialized
partitions need server entry before they are completely initialized, ready to go into the ds
server entry comes from ds.

Asking any component system to handle this kind of circular dependency is ridiculous IMO, and any code you write to do it is going to be impossible for the naive user to understand and likely to be prone to very subtle bugs that everyone will spend weeks trying to diagnose.

I suspect if you construct a bootstrap server entry factory component that can be used by the partitions used by ds a lot of the problems will go away.

You can also do things like having a server entry data object that is injected into the partition and the partition can figure out how to turn it into a server entry.

From what I've heard on IRC I think I'd recommend:

1. a Registries bean that starts up with the bootstrap registries.

2. partitions get a ref to the registries bean and get a server entry data object (using a property editor). They construct the ServerEntry themselves.

3. ds gets a reference to the registries bean; it uses the bootstrap registries as needed and can tell the registries bean to replace the registries with the correct ones when it knows what they are.

You might be able to replace (2) with some kind of factory bean arrangement but unless you can find some really simple spring syntax to make it work I don't think its worth the trouble.

One nice thing about spring is that the xml makes it pretty clear how the components are hooked up together and just about everyone understands how to use it. Writing your own component framework (or, IMO, even putting the configuration data in the DIT) will make it much harder for non-insiders to quickly see how the server is put together and harder to customize it.

thanks
david jencks



On Jan 5, 2008, at 3:23 PM, Emmanuel Lecharny wrote:

<rant>
Now, I'm really pissed off !

I have spent a full day and almost last night to get something supposely simple to get working. No way.

I may be totally stupid, but considering the committer status is being meritocratic, I guess that users will be totally fooled by the current configuration we have.

I just can't stand to loose my time to try to setup a f***ing xml file to understand what I basically want to do : initialize a bloody java structure with a list of elements. Period. Prerequisite : having some access to preset data...

I'm just lost in hundred of stack traces more stupid than the previous hundred ones, and it seems to be a maze without exit.

WTF for X sake do we have to write such a piece of garbage :

 <spring:bean id="systemContextEntry"
class="org.springframework.beans.factory.config.MethodInvokingFactoryB ean"> <spring:property name="targetObject"><spring:ref local='directoryService'/></spring:property> <spring:property name="targetMethod"><spring:value>newEntry</ spring:value></spring:property>
     <spring:property name="arguments">
     <spring:list>
<spring:value xmlns="http://www.springframework.org/schema/ beans">
         ou=system
       </spring:value>
<spring:value xmlns="http://www.springframework.org/schema/ beans">
         objectClass: top
         objectClass: organizationalUnit
         objectClass: extensibleObject
         ou: system
       </spring:value>
     </spring:list>
   </spring:property>
 </spring:bean>

just to call a bloody method with two arguments, to get this as a result :

_ _ ____ ____ / \ _ __ __ _ ___| |__ ___| _ \/ ___| / _ \ | '_ \ / _` |/ __| '_ \ / _ \ | | \___ \ / ___ \| |_) | (_| | (__| | | | __/ |_| |___) | /_/ \_\ .__/ \__,_|\___|_| |_|\___| ____/|____/ |_| Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'MainADS' defined in URL [file:/home/ elecharny/apacheds/bigbang/installers/apacheds-noarch/server.xml]: Cannot resolve reference to bean 'directoryService' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'directoryService' defined in URL [file:/ home/elecharny/apacheds/bigbang/installers/apacheds-noarch/ server.xml]: Cannot create inner bean '(inner bean)' of type [org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartit ion] while setting bean property 'systemPartition'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)' defined in URL [file:/home/ elecharny/apacheds/bigbang/installers/apacheds-noarch/server.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [java.lang.String] to required type [org.apache.directory.server.core.entry.ServerEntry] for property 'contextEntry'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [org.apache.directory.server.core.entry.ServerEntry] for property 'contextEntry': no matching editors or conversion strategy found Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'directoryService' defined in URL [file:/home/elecharny/apacheds/bigbang/installers/apacheds-noarch/ server.xml]: Cannot create inner bean '(inner bean)' of type [org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartit ion] while setting bean property 'systemPartition'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)' defined in URL [file:/home/ elecharny/apacheds/bigbang/installers/apacheds-noarch/server.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [java.lang.String] to required type [org.apache.directory.server.core.entry.ServerEntry] for property 'contextEntry'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [org.apache.directory.server.core.entry.ServerEntry] for property 'contextEntry': no matching editors or conversion strategy found Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)' defined in URL [file:/ home/elecharny/apacheds/bigbang/installers/apacheds-noarch/ server.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [java.lang.String] to required type [org.apache.directory.server.core.entry.ServerEntry] for property 'contextEntry'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [org.apache.directory.server.core.entry.ServerEntry] for property 'contextEntry': no matching editors or conversion strategy found Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type [java.lang.String] to required type [org.apache.directory.server.core.entry.ServerEntry] for property 'contextEntry'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [org.apache.directory.server.core.entry.ServerEntry] for property 'contextEntry': no matching editors or conversion strategy found Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [org.apache.directory.server.core.entry.ServerEntry] for property 'contextEntry': no matching editors or conversion strategy found at org.springframework.beans.TypeConverterDelegate.convertIfNecessary (TypeConverterDelegate.java:231) at org.springframework.beans.TypeConverterDelegate.convertIfNecessary (TypeConverterDelegate.java:138) at org.springframework.beans.BeanWrapperImpl.convertForProperty (BeanWrapperImpl.java:380) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanF actory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java: 1105) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanF actory.populateBean(AbstractAutowireCapableBeanFactory.java:861) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanF actory.createBean(AbstractAutowireCapableBeanFactory.java:421) at org.springframework.beans.factory.support.BeanDefinitionValueResolver. resolveInnerBean(BeanDefinitionValueResolver.java:215) at org.springframework.beans.factory.support.BeanDefinitionValueResolver. resolveValueIfNecessary(BeanDefinitionValueResolver.java:127) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanF actory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java: 1099) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanF actory.populateBean(AbstractAutowireCapableBeanFactory.java:861) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanF actory.createBean(AbstractAutowireCapableBeanFactory.java:421) at org.springframework.beans.factory.support.AbstractBeanFactory $1.getObject(AbstractBeanFactory.java:251) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry .getSingleton(DefaultSingletonBeanRegistry.java:156) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean( AbstractBeanFactory.java:248) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean( AbstractBeanFactory.java:160) at org.springframework.beans.factory.support.BeanDefinitionValueResolver. resolveReference(BeanDefinitionValueResolver.java:261) at org.springframework.beans.factory.support.BeanDefinitionValueResolver. resolveValueIfNecessary(BeanDefinitionValueResolver.java:109) at org.springframework.beans.factory.support.ConstructorResolver.resolveC onstructorArguments(ConstructorResolver.java:389) at org.springframework.beans.factory.support.ConstructorResolver.autowire Constructor(ConstructorResolver.java:120) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanF actory.autowireConstructor(AbstractAutowireCapableBeanFactory.java: 799) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanF actory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:717) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanF actory.createBean(AbstractAutowireCapableBeanFactory.java:384) at org.springframework.beans.factory.support.AbstractBeanFactory $1.getObject(AbstractBeanFactory.java:251) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry .getSingleton(DefaultSingletonBeanRegistry.java:156) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean( AbstractBeanFactory.java:248) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean( AbstractBeanFactory.java:160) at org.springframework.beans.factory.support.DefaultListableBeanFactory.p reInstantiateSingletons(DefaultListableBeanFactory.java:287) at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:352) at org.apache.xbean.spring.context.FileSystemXmlApplicationContext.<init> (FileSystemXmlApplicationContext.java:149) at org.apache.xbean.spring.context.FileSystemXmlApplicationContext.<init> (FileSystemXmlApplicationContext.java:48)
   at org.apache.directory.server.Service.init(Service.java:60)
at org.apache.directory.server.UberjarMain.main(UberjarMain.java: 56)


Is it *supposed* to help ??? How many insanity like this will we support before we can work on real stuff, like how to write a serious LDAP server? Do we have to whip ourselves, crawl on sandpaper, walk on fire just to be allowed to bring some line of not totally meaningless code, or is there a way to get rid of all those shitty buzzwords called IOC, XML, XSD, Spring, Xbean and any of such over rated and over abused so called 'technologies' ?

WE ARE LOOSING OUR TIME WITH ALL THOSE USELESS CRAPS !!! KISS, damn !

</rant>

yes, I'm just pissed off ;(

--
--
cordialement, regards,
Emmanuel Lécharny
www.iktek.com
directory.apache.org



Reply via email to