415401 Add initalizeDefaults call to SpringConfigurationProcessor
This commit is contained in:
parent
9e90e1267f
commit
77889089a9
|
@ -30,6 +30,9 @@ import org.eclipse.jetty.xml.ConfigurationProcessor;
|
||||||
import org.eclipse.jetty.xml.ConfigurationProcessorFactory;
|
import org.eclipse.jetty.xml.ConfigurationProcessorFactory;
|
||||||
import org.eclipse.jetty.xml.XmlConfiguration;
|
import org.eclipse.jetty.xml.XmlConfiguration;
|
||||||
import org.eclipse.jetty.xml.XmlParser;
|
import org.eclipse.jetty.xml.XmlParser;
|
||||||
|
import org.springframework.beans.BeanWrapper;
|
||||||
|
import org.springframework.beans.PropertyValues;
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.beans.factory.xml.XmlBeanFactory;
|
import org.springframework.beans.factory.xml.XmlBeanFactory;
|
||||||
import org.springframework.core.io.ByteArrayResource;
|
import org.springframework.core.io.ByteArrayResource;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
|
@ -59,17 +62,15 @@ public class SpringConfigurationProcessor implements ConfigurationProcessor
|
||||||
{
|
{
|
||||||
private static final Logger LOG = Log.getLogger(SpringConfigurationProcessor.class);
|
private static final Logger LOG = Log.getLogger(SpringConfigurationProcessor.class);
|
||||||
|
|
||||||
private Map<String, Object> _idMap;
|
private XmlConfiguration _configuration;
|
||||||
private Map<String, String> _propertyMap;
|
|
||||||
private XmlBeanFactory _beanFactory;
|
private XmlBeanFactory _beanFactory;
|
||||||
private String _main;
|
private String _main;
|
||||||
|
|
||||||
public void init(URL url, XmlParser.Node config, Map<String, Object> idMap, Map<String, String> properties)
|
public void init(URL url, XmlParser.Node config, XmlConfiguration configuration)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_idMap = idMap;
|
_configuration = configuration;
|
||||||
_propertyMap = properties;
|
|
||||||
|
|
||||||
Resource resource = url != null
|
Resource resource = url != null
|
||||||
? new UrlResource(url)
|
? new UrlResource(url)
|
||||||
|
@ -78,7 +79,14 @@ public class SpringConfigurationProcessor implements ConfigurationProcessor
|
||||||
"<!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\" \"http://www.springframework.org/dtd/spring-beans.dtd\">" +
|
"<!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\" \"http://www.springframework.org/dtd/spring-beans.dtd\">" +
|
||||||
config).getBytes("UTF-8"));
|
config).getBytes("UTF-8"));
|
||||||
|
|
||||||
_beanFactory = new XmlBeanFactory(resource);
|
_beanFactory = new XmlBeanFactory(resource){
|
||||||
|
@Override
|
||||||
|
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs)
|
||||||
|
{
|
||||||
|
_configuration.initializeDefaults(bw.getWrappedInstance());
|
||||||
|
super.applyPropertyValues(beanName, mbd, bw, pvs);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -105,7 +113,7 @@ public class SpringConfigurationProcessor implements ConfigurationProcessor
|
||||||
|
|
||||||
private void doConfigure()
|
private void doConfigure()
|
||||||
{
|
{
|
||||||
_beanFactory.registerSingleton("properties", _propertyMap);
|
_beanFactory.registerSingleton("properties", _configuration.getProperties());
|
||||||
|
|
||||||
// Look for the main bean;
|
// Look for the main bean;
|
||||||
for (String bean : _beanFactory.getBeanDefinitionNames())
|
for (String bean : _beanFactory.getBeanDefinitionNames())
|
||||||
|
@ -122,25 +130,26 @@ public class SpringConfigurationProcessor implements ConfigurationProcessor
|
||||||
_main = _beanFactory.getBeanDefinitionNames()[0];
|
_main = _beanFactory.getBeanDefinitionNames()[0];
|
||||||
|
|
||||||
// Register id beans as singletons
|
// Register id beans as singletons
|
||||||
LOG.debug("idMap {}", _idMap);
|
Map<String, Object> idMap = _configuration.getIdMap();
|
||||||
for (String id : _idMap.keySet())
|
LOG.debug("idMap {}", idMap);
|
||||||
|
for (String id : idMap.keySet())
|
||||||
{
|
{
|
||||||
LOG.debug("register {}", id);
|
LOG.debug("register {}", id);
|
||||||
_beanFactory.registerSingleton(id, _idMap.get(id));
|
_beanFactory.registerSingleton(id, idMap.get(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply configuration to existing singletons
|
// Apply configuration to existing singletons
|
||||||
for (String id : _idMap.keySet())
|
for (String id : idMap.keySet())
|
||||||
{
|
{
|
||||||
if (_beanFactory.containsBeanDefinition(id))
|
if (_beanFactory.containsBeanDefinition(id))
|
||||||
{
|
{
|
||||||
LOG.debug("reconfigure {}", id);
|
LOG.debug("reconfigure {}", id);
|
||||||
_beanFactory.configureBean(_idMap.get(id), id);
|
_beanFactory.configureBean(idMap.get(id), id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract id's for next time.
|
// Extract id's for next time.
|
||||||
for (String id : _beanFactory.getSingletonNames())
|
for (String id : _beanFactory.getSingletonNames())
|
||||||
_idMap.put(id, _beanFactory.getBean(id));
|
idMap.put(id, _beanFactory.getBean(id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,16 +21,18 @@ package org.eclipse.jetty.spring;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.xml.XmlConfiguration;
|
import org.eclipse.jetty.xml.XmlConfiguration;
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Assume;
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static junit.framework.Assert.assertEquals;
|
||||||
|
import static org.junit.Assume.assumeTrue;
|
||||||
|
|
||||||
public class SpringXmlConfigurationTest
|
public class SpringXmlConfigurationTest
|
||||||
{
|
{
|
||||||
protected String _configure="org/eclipse/jetty/spring/configure.xml";
|
protected String _configure="org/eclipse/jetty/spring/configure.xml";
|
||||||
|
@ -48,7 +50,7 @@ public class SpringXmlConfigurationTest
|
||||||
if (matcher.matches())
|
if (matcher.matches())
|
||||||
{
|
{
|
||||||
String minor = matcher.group(1);
|
String minor = matcher.group(1);
|
||||||
Assume.assumeTrue(Integer.parseInt(minor) > 5);
|
assumeTrue(Integer.parseInt(minor) > 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,54 +76,71 @@ public class SpringXmlConfigurationTest
|
||||||
|
|
||||||
tc=(TestConfiguration)configuration.configure(tc);
|
tc=(TestConfiguration)configuration.configure(tc);
|
||||||
|
|
||||||
Assert.assertEquals("preconfig", tc.getTestString0());
|
assertEquals("preconfig", tc.getTestString0());
|
||||||
Assert.assertEquals(42, tc.getTestInt0());
|
assertEquals(42, tc.getTestInt0());
|
||||||
Assert.assertEquals("SetValue", tc.getTestString1());
|
assertEquals("SetValue", tc.getTestString1());
|
||||||
Assert.assertEquals(1, tc.getTestInt1());
|
assertEquals(1, tc.getTestInt1());
|
||||||
|
|
||||||
Assert.assertEquals("nested", tc.getNested().getTestString0());
|
assertEquals("nested", tc.getNested().getTestString0());
|
||||||
Assert.assertEquals("nested", tc.getNested().getTestString1());
|
assertEquals("nested", tc.getNested().getTestString1());
|
||||||
Assert.assertEquals("default", tc.getNested().getNested().getTestString0());
|
assertEquals("default", tc.getNested().getNested().getTestString0());
|
||||||
Assert.assertEquals("deep", tc.getNested().getNested().getTestString1());
|
assertEquals("deep", tc.getNested().getNested().getTestString1());
|
||||||
|
|
||||||
Assert.assertEquals("deep", ((TestConfiguration)configuration.getIdMap().get("nestedDeep")).getTestString1());
|
assertEquals("deep", ((TestConfiguration)configuration.getIdMap().get("nestedDeep")).getTestString1());
|
||||||
Assert.assertEquals(2, ((TestConfiguration)configuration.getIdMap().get("nestedDeep")).getTestInt2());
|
assertEquals(2, ((TestConfiguration)configuration.getIdMap().get("nestedDeep")).getTestInt2());
|
||||||
|
|
||||||
Assert.assertEquals("xxx", tc.getTestString2());
|
assertEquals("xxx", tc.getTestString2());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNewObject() throws Exception
|
public void testNewObject() throws Exception
|
||||||
{
|
{
|
||||||
|
final String newDefaultValue = "NEW DEFAULT";
|
||||||
TestConfiguration.VALUE=71;
|
TestConfiguration.VALUE=71;
|
||||||
|
|
||||||
URL url = SpringXmlConfigurationTest.class.getClassLoader().getResource(_configure);
|
URL url = SpringXmlConfigurationTest.class.getClassLoader().getResource(_configure);
|
||||||
XmlConfiguration configuration = new XmlConfiguration(url);
|
final AtomicInteger count = new AtomicInteger(0);
|
||||||
|
XmlConfiguration configuration = new XmlConfiguration(url)
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void initializeDefaults(Object object)
|
||||||
|
{
|
||||||
|
super.initializeDefaults(object);
|
||||||
|
if (object instanceof TestConfiguration)
|
||||||
|
{
|
||||||
|
count.incrementAndGet();
|
||||||
|
((TestConfiguration)object).setTestString0(newDefaultValue);
|
||||||
|
((TestConfiguration)object).setTestString1("WILL BE OVERRIDDEN");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Map<String,String> properties = new HashMap<>();
|
Map<String,String> properties = new HashMap<String,String>();
|
||||||
properties.put("test", "xxx");
|
properties.put("test", "xxx");
|
||||||
|
|
||||||
TestConfiguration nested = new TestConfiguration();
|
TestConfiguration nested = new TestConfiguration();
|
||||||
nested.setTestString0("nested");
|
nested.setTestString0("nested");
|
||||||
configuration.getIdMap().put("nested",nested);
|
configuration.getIdMap().put("nested", nested);
|
||||||
|
|
||||||
configuration.getProperties().putAll(properties);
|
configuration.getProperties().putAll(properties);
|
||||||
TestConfiguration tc = (TestConfiguration)configuration.configure();
|
TestConfiguration tc = (TestConfiguration)configuration.configure();
|
||||||
|
|
||||||
Assert.assertEquals("default", tc.getTestString0());
|
assertEquals(3,count.get());
|
||||||
Assert.assertEquals(-1, tc.getTestInt0());
|
|
||||||
Assert.assertEquals("SetValue", tc.getTestString1());
|
|
||||||
Assert.assertEquals(1, tc.getTestInt1());
|
|
||||||
|
|
||||||
Assert.assertEquals("nested", tc.getNested().getTestString0());
|
assertEquals(newDefaultValue, tc.getTestString0());
|
||||||
Assert.assertEquals("nested", tc.getNested().getTestString1());
|
assertEquals(-1, tc.getTestInt0());
|
||||||
Assert.assertEquals("default", tc.getNested().getNested().getTestString0());
|
assertEquals("SetValue", tc.getTestString1());
|
||||||
Assert.assertEquals("deep", tc.getNested().getNested().getTestString1());
|
assertEquals(1, tc.getTestInt1());
|
||||||
|
|
||||||
Assert.assertEquals("deep", ((TestConfiguration)configuration.getIdMap().get("nestedDeep")).getTestString1());
|
assertEquals(newDefaultValue, tc.getNested().getTestString0());
|
||||||
Assert.assertEquals(2, ((TestConfiguration)configuration.getIdMap().get("nestedDeep")).getTestInt2());
|
assertEquals("nested", tc.getNested().getTestString1());
|
||||||
|
assertEquals(newDefaultValue, tc.getNested().getNested().getTestString0());
|
||||||
|
assertEquals("deep", tc.getNested().getNested().getTestString1());
|
||||||
|
|
||||||
Assert.assertEquals("xxx", tc.getTestString2());
|
assertEquals("deep", ((TestConfiguration)configuration.getIdMap().get("nestedDeep")).getTestString1());
|
||||||
|
assertEquals(2, ((TestConfiguration)configuration.getIdMap().get("nestedDeep")).getTestInt2());
|
||||||
|
|
||||||
|
assertEquals("xxx", tc.getTestString2());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue