Add FileEncodingApplicationContextInitializer
Looks for spring.mandatory_file_encoding and matches it against System.getProperty("file.encoding"). Fixes gh-46pull/85/head
parent
b8bdf22209
commit
a7d12bfddb
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright 2012-2013 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.context.initializer;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
|
||||
import org.springframework.context.ApplicationContextInitializer;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
|
||||
/**
|
||||
* An {@link ApplicationContextInitializer} halts application startup if the system file
|
||||
* encoding does not match an expected value set in the environment. By default has no
|
||||
* effect, but if you set <code>spring.mandatory_file_encoding</code> (or some camelCase
|
||||
* or UPPERCASE variant of that) to the name of a character encoding (e.g. "UTF-8") then
|
||||
* this initializer throws an exception when the <code>file.encoding</code> System
|
||||
* property does not equal it.
|
||||
*
|
||||
* <p>
|
||||
* The System property <code>file.encoding</code> is normally set by the JVM in response
|
||||
* to the <code>LANG</code> or <code>LC_ALL</code> environment variables. It is used
|
||||
* (along with other platform-dependent variables keyed off those environment variables)
|
||||
* to encode JVM arguments as well as file names and paths. In most cases you can override
|
||||
* the file encoding System property on the command line (with standard JVM features), but
|
||||
* also consider setting the <code>LANG</code> environment variable to an explicit
|
||||
* character-encoding value (e.g. "en_GB.UTF-8").
|
||||
*
|
||||
* @author Dave Syer
|
||||
*/
|
||||
public class FileEncodingApplicationContextInitializer implements
|
||||
ApplicationContextInitializer<ConfigurableApplicationContext> {
|
||||
|
||||
private static Log logger = LogFactory
|
||||
.getLog(FileEncodingApplicationContextInitializer.class);
|
||||
|
||||
@Override
|
||||
public void initialize(final ConfigurableApplicationContext context) {
|
||||
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
|
||||
context.getEnvironment(), "spring.");
|
||||
if (resolver.containsProperty("mandatoryFileEncoding")) {
|
||||
final String encoding = System.getProperty("file.encoding");
|
||||
final String desired = resolver.getProperty("mandatoryFileEncoding");
|
||||
if (encoding != null && !desired.equalsIgnoreCase(encoding)) {
|
||||
logger.error("System property 'file.encoding' is currently '" + encoding
|
||||
+ "'. It should be '" + desired
|
||||
+ "' (as defined in 'spring.mandatoryFileEncoding').");
|
||||
logger.error("Environment variable LANG is '" + System.getenv("LANG")
|
||||
+ "'. You could use a locale setting that matches encoding='"
|
||||
+ desired + "'.");
|
||||
logger.error("Environment variable LC_ALL is '" + System.getenv("LC_ALL")
|
||||
+ "'. You could use a locale setting that matches encoding='"
|
||||
+ desired + "'.");
|
||||
throw new IllegalStateException(
|
||||
"The Java Virtual Machine has not "
|
||||
+ " been configured to use the desired default character encoding ("
|
||||
+ desired + ").");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2012-2013 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.context.initializer;
|
||||
|
||||
import org.junit.Assume;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.TestUtils;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.support.StaticApplicationContext;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
*/
|
||||
public class FileEncodingApplicationContextInitializerTests {
|
||||
|
||||
private FileEncodingApplicationContextInitializer initializer = new FileEncodingApplicationContextInitializer();
|
||||
private ConfigurableApplicationContext context;
|
||||
|
||||
@Before
|
||||
public void init() {
|
||||
this.context = new StaticApplicationContext();
|
||||
}
|
||||
|
||||
@Test(expected = IllegalStateException.class)
|
||||
public void testIllegalState() {
|
||||
TestUtils.addEnviroment(this.context, "spring.mandatory_file_encoding:FOO");
|
||||
this.initializer.initialize(this.context);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSunnyDayNothingMandated() {
|
||||
this.initializer.initialize(this.context);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSunnyDayMandated() {
|
||||
Assume.assumeNotNull(System.getProperty("file.encoding"));
|
||||
TestUtils.addEnviroment(this.context,
|
||||
"spring.mandatory_file_encoding:" + System.getProperty("file.encoding"));
|
||||
this.initializer.initialize(this.context);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue