org.apache.cxf.bus.spring.BusApplicationContext constructor does not respect 
"include defaults" flag

------------------------------------------------------------------------------------------------------

                 Key: CXF-621
                 URL: https://issues.apache.org/jira/browse/CXF-621
             Project: CXF
          Issue Type: Bug
          Components: Bus
    Affects Versions: 2.0-RC
         Environment: NA
            Reporter: Steven E. Harris


BusApplicationContext's constructors accept a boolean argument "include" to 
indicate whether it should try to load the default configuration files 
discovered on the class path. The problem comes from poor interaction among 
initialization of a member variable (includeDefaults) and the overridden method 
getConfigResources().

Two of the constructors have similar form:

    public BusApplicationContext(String cf, boolean include, ApplicationContext 
parent) {
        super((String[])null, parent);
        cfgFile = cf;
        includeDefaults = include;
    }

Note that "includeDefaults" is not initialized until the base class constructor 
returns. However, as part of the base constructor chain, 
ClassPathXmlApplicationContext calls refresh(), which triggers a long call 
chain that results in getConfigResources() being called.

BusApplicationContext overrides getConfigResources(). One of the first things 
it does is reads its "includeDefaults" flag -- but at this point the flag has 
not been initialized by the constructor, so it defaults to false. Therefore, no 
matter what the value of the "include" parameter to the BusApplicationContext 
constructor, only a false value gets used during construction.

Unfortunately, there's no way to do anything such as initializing member 
variables before calling the superclass's constructor. Therefore, the fix is to 
call on a different ClassPathXmlApplicationContext constructor -- the one that 
takes a boolean flag indicating whether to refresh() immediately. We can pass 
false, initialize our member variables, then call refresh() explicitly:

    public BusApplicationContext(String cf, boolean include, ApplicationContext 
parent) {
        super((String[])null, false, parent);
        cfgFile = cf;
        includeDefaults = include;
        refresh();
    }

I haven't tested this code, but it looks like it should fix the problem.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to