Hello Roger,


2009/5/29 Roger Marshall <[email protected]>:
> We have a small FTP Server application which is based on old Apache FTP
> Server code from a couple of years ago, and therefore uses
> org.apache.ftpserver.config.PropertiesConfiguration, etc., for
> configuration.
>
> I'm updating it to use the production version of FtpServer, mainly because I
> need the setPassiveExternalAddress method in
> org.apache.ftpserver.DataConnectionConfigurationFactory.
>
> The first step is to rewrite the configuration part of our app using the new
> Spring-based system, but I know almost nothing about Spring (and about the
> same about FtpServer at the moment), so I'm not totally sure whether my
> issues relate to Spring or FtpServer. Since we don't actually use Spring for
> anything else, I'm trying to minimise how much Spring I introduce. My
> intention is to have the core 'wiring' done in XML bundled with the
> application, with the host-specific configuration coming from system
> properties. After a lot of head-scratching, I have the following code:
>
>
>    XmlBeanFactory factory = new XmlBeanFactory(new UrlResource(
>                                ((Application)
> Application.application()).resourceManager()
>
>  .pathURLForResourceNamed("ftpserver.xml", null, null)));
>
>    PropertyOverrideConfigurer poc = new PropertyOverrideConfigurer();
>    poc.setIgnoreInvalidKeys(true);
>    poc.setProperties((Properties)System.getProperties().clone());
>    poc.postProcessBeanFactory(factory);
>
>    DefaultFtpServer server = (DefaultFtpServer) factory.getBean("myServer");
>
>
> (Application is a WebObjects com.webobjects.appserver.WOApplication)
> I then started with the following ftpserver.xml:
>
>
> <?xml version="1.0" encoding="UTF-8"?>
> <server xmlns="http://mina.apache.org/ftpserver/spring/v1";
>        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>        xsi:schemaLocation="http://mina.apache.org/ftpserver/spring/v1
> http://mina.apache.org/ftpserver/ftpserver-1.0.xsd";
>        id="myServer" max-logins="7">
>        <listeners>
>                <nio-listener name="default" port="2222" implicit-ssl="true"
>                        idle-timeout="60" local-address="1.2.3.4">
>                        <data-connection idle-timeout="60">
>                                <active enabled="true"
> local-address="1.2.3.4" local-port="2323"
>                                        ip-check="true" />
>                                <passive ports="123-125" address="1.2.3.4"
> external-address="1.2.3.4" />
>                        </data-connection>
>                </nio-listener>
>        </listeners>
> </server>
>
>
> This worked fine, and I was able to determine that e.g. maxLogins had been
> set to the specified test value. However, I was unable to conjure the
> appropriate properties file entries to override maxLogins. I then had a go
> at rewriting the ftpserver.xml file using regular <bean> tags, and came up
> with the following:
>
>
> <beans xmlns="http://www.springframework.org/schema/beans";
>        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>        xsi:schemaLocation="http://www.springframework.org/schema/beans
> http://www.springframework.org/schema/beans/spring-beans-2.5.xsd";>
>
>        <bean id="ftpserver-connection"
> class="org.apache.ftpserver.ConnectionConfigFactory">
>                <property name="maxLogins" value="7"></property>
>        </bean>
>
>        <bean id="myConnectionConfig"
>                factory-bean="ftpserver-connection"
>                factory-method="createConnectionConfig">
>        </bean>
>
>        <bean id="ftpServerFactory"
> class="org.apache.ftpserver.FtpServerFactory">
>                <property name="connectionConfig"
> ref="myConnectionConfig"></property>
>        </bean>
>
>        <bean id="myServer" factory-bean="ftpServerFactory"
>                factory-method="createServer" />
>
> </beans>
>
>
> Not quite as pretty, but it seemed to work.
> I then added the following to a properties file:
>
>
> ftpserver-connection.maxLogins=11
>
>
> This had the desired effect - maxLogins now reported the overridden value.
> However, I'd have preferred something like ftpserver.connection.maxLogins.
> When I changed the ftpserver-connection bean id to ftpserver.connection, and
> the factory-bean attribute of the myConnectionConfig bean to the same, the
> XML part of the configuration still worked. Unfortunately, subsequently
> changing the property to ftpserver. connection.maxLogins had no effect --
> the maxLogins property was not overridden.
>
>
> My first question is whether there is actually valid set of properties file
> entries that would work with the first version of ftpserver.xml (the one
> using the http://mina.apache.org/ftpserver/spring/v1 schema)?

I don't know Spring myself but it's my understanding that adding a
factory.getBeanDefinitionNames() to your example above should print
all the bean names which are available. There are only a few of them
(i'd say you cannot see inner beans) so I don't know if this approach
is suitable for you ( Let's wait to Nilklas response but I think that
inner beans are not supported by PropertyOverrideConfigurer, you might
ask in their mailing list )

> My second question (assuming the answer to the first is 'no'), is how to
> reference a bean with a dot in its name from a properties file?

By default, PropertyOverrideConfigurer takes the right part of the
first dot as the bean name (
'ftpserver.connection.maxLogins' would mean that the bean name is 'ftpserver'

You can change the bean Name separator with
PropertyOverrideConfigurer.setBeanNameSeparator(String
beanNameSeparator) so you can do something like this:

poc.setBeanNameSeparator(":");

ftpserver.connection:maxLogins = 5;

I haven't  checked if the  ':' character would be accepted though.

>
> Thanks!
> --
> Roger
>
>

Reply via email to