Skip to content

Commit

Permalink
Nullability fine-tuning around bean properties
Browse files Browse the repository at this point in the history
Issue: SPR-15720
Issue: SPR-15792
  • Loading branch information
jhoeller committed Jul 19, 2017
1 parent 06fc092 commit 9fc4fb1
Show file tree
Hide file tree
Showing 31 changed files with 243 additions and 206 deletions.
Expand Up @@ -126,7 +126,7 @@ public Object getTargetObject() {
* @see #setTargetObject
*/
public void setTargetField(@Nullable String targetField) {
this.targetField = StringUtils.trimAllWhitespace(targetField);
this.targetField = (targetField != null ? StringUtils.trimAllWhitespace(targetField) : null);
}

/**
Expand Down
Expand Up @@ -81,8 +81,7 @@ public abstract class CacheAspectSupport extends AbstractCacheInvoker

protected final Log logger = LogFactory.getLog(getClass());

private final Map<CacheOperationCacheKey, CacheOperationMetadata> metadataCache =
new ConcurrentHashMap<>(1024);
private final Map<CacheOperationCacheKey, CacheOperationMetadata> metadataCache = new ConcurrentHashMap<>(1024);

private final CacheOperationExpressionEvaluator evaluator = new CacheOperationExpressionEvaluator();

Expand Down Expand Up @@ -186,6 +185,7 @@ public void afterPropertiesSet() {
public void afterSingletonsInstantiated() {
if (getCacheResolver() == null) {
// Lazily initialize cache resolver via default cache manager...
Assert.state(this.beanFactory != null, "CacheResolver or BeanFactory must be set on cache aspect");
try {
setCacheManager(this.beanFactory.getBean(CacheManager.class));
}
Expand Down Expand Up @@ -289,6 +289,10 @@ else if (StringUtils.hasText(operation.getCacheManager())) {
* @see CacheOperation#cacheResolver
*/
protected <T> T getBean(String beanName, Class<T> expectedType) {
if (this.beanFactory == null) {
throw new IllegalStateException(
"BeanFactory must be set on cache aspect for " + expectedType.getSimpleName() + " retrieval");
}
return BeanFactoryAnnotationUtils.qualifiedBeanOfType(this.beanFactory, expectedType, beanName);
}

Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2017 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.
Expand Down Expand Up @@ -38,6 +38,7 @@ public abstract class AbstractResourceBasedMessageSource extends AbstractMessage

private final Set<String> basenameSet = new LinkedHashSet<>(4);

@Nullable
private String defaultEncoding;

private boolean fallbackToSystemLocale = true;
Expand Down
Expand Up @@ -535,9 +535,6 @@ public void setValidator(@Nullable Validator validator) {
}

private void assertValidators(Validator... validators) {
if (validators == null) {
return;
}
for (Validator validator : validators) {
if (validator != null && (getTarget() != null && !validator.supports(getTarget().getClass()))) {
throw new IllegalStateException("Invalid target for Validator [" + validator + "]: " + getTarget());
Expand Down
Expand Up @@ -41,6 +41,7 @@ public class CustomizableThreadCreator implements Serializable {

private boolean daemon = false;

@Nullable
private ThreadGroup threadGroup;

private final AtomicInteger threadCount = new AtomicInteger(0);
Expand Down
Expand Up @@ -132,7 +132,7 @@ public void addFailureCallback(FailureCallback callback) {
* added callbacks with the given result.
* @param result the result to trigger the callbacks with
*/
public void success(T result) {
public void success(@Nullable T result) {
synchronized (this.mutex) {
this.state = State.SUCCESS;
this.result = result;
Expand Down
Expand Up @@ -144,6 +144,7 @@ public void setFeature(String name, boolean value) throws SAXNotRecognizedExcept
* handler. The property name for a lexical handler is {@code http://xml.org/sax/properties/lexical-handler}.
*/
@Override
@Nullable
public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
return this.lexicalHandler;
Expand Down
Expand Up @@ -244,6 +244,19 @@ public boolean isNamedBinding() {
}


/**
* Initialize this class with metadata from the database.
* @param dataSource the DataSource used to retrieve metadata
*/
public void initializeMetaData(DataSource dataSource) {
this.metaDataProvider = CallMetaDataProviderFactory.createMetaDataProvider(dataSource, this);
}

private CallMetaDataProvider obtainMetaDataProvider() {
Assert.state(this.metaDataProvider != null, "No CallMetaDataProvider - call initializeMetaData first");
return this.metaDataProvider;
}

/**
* Create a ReturnResultSetParameter/SqlOutParameter depending on the support provided
* by the JDBC driver used for the database in use.
Expand All @@ -252,13 +265,13 @@ public boolean isNamedBinding() {
* @return the appropriate SqlParameter
*/
public SqlParameter createReturnResultSetParameter(String parameterName, RowMapper<?> rowMapper) {
Assert.state(this.metaDataProvider != null, "No CallMetaDataProvider available");
if (this.metaDataProvider.isReturnResultSetSupported()) {
CallMetaDataProvider provider = obtainMetaDataProvider();
if (provider.isReturnResultSetSupported()) {
return new SqlReturnResultSet(parameterName, rowMapper);
}
else {
if (this.metaDataProvider.isRefCursorSupported()) {
return new SqlOutParameter(parameterName, this.metaDataProvider.getRefCursorSqlType(), rowMapper);
if (provider.isRefCursorSupported()) {
return new SqlOutParameter(parameterName, provider.getRefCursorSqlType(), rowMapper);
}
else {
throw new InvalidDataAccessApiUsageException("Return of a ResultSet from a stored procedure is not supported.");
Expand Down Expand Up @@ -290,14 +303,6 @@ public List<SqlParameter> getCallParameters() {
return this.callParameters;
}

/**
* Initialize this class with metadata from the database.
* @param dataSource the DataSource used to retrieve metadata
*/
public void initializeMetaData(DataSource dataSource) {
this.metaDataProvider = CallMetaDataProviderFactory.createMetaDataProvider(dataSource, this);
}

/**
* Process the list of parameters provided, and if procedure column metadata is used,
* the parameters will be matched against the metadata information and any missing
Expand All @@ -312,7 +317,7 @@ public void processParameters(List<SqlParameter> parameters) {
* Reconcile the provided parameters with available metadata and add new ones where appropriate.
*/
protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters) {
Assert.state(this.metaDataProvider != null, "No CallMetaDataProvider available");
CallMetaDataProvider provider = obtainMetaDataProvider();

final List<SqlParameter> declaredReturnParams = new ArrayList<>();
final Map<String, SqlParameter> declaredParams = new LinkedHashMap<>();
Expand All @@ -321,7 +326,7 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
List<String> metaDataParamNames = new ArrayList<>();

// Get the names of the meta data parameters
for (CallParameterMetaData meta : this.metaDataProvider.getCallParameterMetaData()) {
for (CallParameterMetaData meta : provider.getCallParameterMetaData()) {
if (meta.getParameterType() != DatabaseMetaData.procedureColumnReturn) {
metaDataParamNames.add(lowerCase(meta.getParameterName()));
}
Expand All @@ -338,7 +343,7 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
throw new IllegalArgumentException("Anonymous parameters not supported for calls - " +
"please specify a name for the parameter of SQL type " + param.getSqlType());
}
String paramNameToMatch = lowerCase(this.metaDataProvider.parameterNameToUse(paramName));
String paramNameToMatch = lowerCase(provider.parameterNameToUse(paramName));
declaredParams.put(paramNameToMatch, param);
if (param instanceof SqlOutParameter) {
outParamNames.add(paramName);
Expand All @@ -360,24 +365,23 @@ protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters)
List<SqlParameter> workParams = new ArrayList<>();
workParams.addAll(declaredReturnParams);

if (!this.metaDataProvider.isProcedureColumnMetaDataUsed()) {
if (!provider.isProcedureColumnMetaDataUsed()) {
workParams.addAll(declaredParams.values());
return workParams;
}

Map<String, String> limitedInParamNamesMap = new HashMap<>(this.limitedInParameterNames.size());
for (String limitedParamName : this.limitedInParameterNames) {
limitedInParamNamesMap.put(
lowerCase(this.metaDataProvider.parameterNameToUse(limitedParamName)), limitedParamName);
limitedInParamNamesMap.put(lowerCase(provider.parameterNameToUse(limitedParamName)), limitedParamName);
}

for (CallParameterMetaData meta : this.metaDataProvider.getCallParameterMetaData()) {
for (CallParameterMetaData meta : provider.getCallParameterMetaData()) {
String paramName = meta.getParameterName();
String paramNameToCheck = null;
if (paramName != null) {
paramNameToCheck = lowerCase(this.metaDataProvider.parameterNameToUse(paramName));
paramNameToCheck = lowerCase(provider.parameterNameToUse(paramName));
}
String paramNameToUse = this.metaDataProvider.parameterNameToUse(paramName);
String paramNameToUse = provider.parameterNameToUse(paramName);
if (declaredParams.containsKey(paramNameToCheck) ||
(meta.getParameterType() == DatabaseMetaData.procedureColumnReturn && returnDeclared)) {
SqlParameter param;
Expand Down Expand Up @@ -409,15 +413,15 @@ else if (paramName != null) {
else {
if (meta.getParameterType() == DatabaseMetaData.procedureColumnReturn) {
if (!isFunction() && !isReturnValueRequired() && paramName != null &&
this.metaDataProvider.byPassReturnParameter(paramName)) {
provider.byPassReturnParameter(paramName)) {
if (logger.isDebugEnabled()) {
logger.debug("Bypassing metadata return parameter for '" + paramName + "'");
}
}
else {
String returnNameToUse =
(StringUtils.hasLength(paramNameToUse) ? paramNameToUse : getFunctionReturnName());
workParams.add(this.metaDataProvider.createDefaultOutParameter(returnNameToUse, meta));
workParams.add(provider.createDefaultOutParameter(returnNameToUse, meta));
if (isFunction()) {
setFunctionReturnName(returnNameToUse);
outParamNames.add(returnNameToUse);
Expand All @@ -432,14 +436,14 @@ else if (paramName != null) {
paramNameToUse = "";
}
if (meta.getParameterType() == DatabaseMetaData.procedureColumnOut) {
workParams.add(this.metaDataProvider.createDefaultOutParameter(paramNameToUse, meta));
workParams.add(provider.createDefaultOutParameter(paramNameToUse, meta));
outParamNames.add(paramNameToUse);
if (logger.isDebugEnabled()) {
logger.debug("Added metadata out parameter for '" + paramNameToUse + "'");
}
}
else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
workParams.add(this.metaDataProvider.createDefaultInOutParameter(paramNameToUse, meta));
workParams.add(provider.createDefaultInOutParameter(paramNameToUse, meta));
outParamNames.add(paramNameToUse);
if (logger.isDebugEnabled()) {
logger.debug("Added metadata in out parameter for '" + paramNameToUse + "'");
Expand All @@ -448,7 +452,7 @@ else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
else {
if (this.limitedInParameterNames.isEmpty() ||
limitedInParamNamesMap.containsKey(lowerCase(paramNameToUse))) {
workParams.add(this.metaDataProvider.createDefaultInParameter(paramNameToUse, meta));
workParams.add(provider.createDefaultInParameter(paramNameToUse, meta));
if (logger.isDebugEnabled()) {
logger.debug("Added metadata in parameter for '" + paramNameToUse + "'");
}
Expand All @@ -473,8 +477,6 @@ else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
* @return a Map containing the matched parameter names with the value taken from the input
*/
public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameterSource parameterSource) {
Assert.state(this.metaDataProvider != null, "No CallMetaDataProvider available");

// For parameter source lookups we need to provide case-insensitive lookup support
// since the database metadata is not necessarily providing case sensitive parameter names.
Map<String, String> caseInsensitiveParameterNames =
Expand All @@ -485,7 +487,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
for (SqlParameter parameter : this.callParameters) {
if (parameter.isInputValueProvided()) {
String parameterName = parameter.getName();
String parameterNameToMatch = this.metaDataProvider.parameterNameToUse(parameterName);
String parameterNameToMatch = obtainMetaDataProvider().parameterNameToUse(parameterName);
if (parameterNameToMatch != null) {
callParameterNames.put(parameterNameToMatch.toLowerCase(), parameterName);
}
Expand Down Expand Up @@ -538,16 +540,16 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter
* @return a Map containing the matched parameter names with the value taken from the input
*/
public Map<String, ?> matchInParameterValuesWithCallParameters(Map<String, ?> inParameters) {
Assert.state(this.metaDataProvider != null, "No CallMetaDataProvider available");
if (!this.metaDataProvider.isProcedureColumnMetaDataUsed()) {
CallMetaDataProvider provider = obtainMetaDataProvider();
if (!provider.isProcedureColumnMetaDataUsed()) {
return inParameters;
}

Map<String, String> callParameterNames = new HashMap<>(this.callParameters.size());
for (SqlParameter parameter : this.callParameters) {
if (parameter.isInputValueProvided()) {
String parameterName = parameter.getName();
String parameterNameToMatch = this.metaDataProvider.parameterNameToUse(parameterName);
String parameterNameToMatch = provider.parameterNameToUse(parameterName);
if (parameterNameToMatch != null) {
callParameterNames.put(parameterNameToMatch.toLowerCase(), parameterName);
}
Expand All @@ -556,7 +558,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter

Map<String, Object> matchedParameters = new HashMap<>(inParameters.size());
for (String parameterName : inParameters.keySet()) {
String parameterNameToMatch = this.metaDataProvider.parameterNameToUse(parameterName);
String parameterNameToMatch = provider.parameterNameToUse(parameterName);
String callParameterName = callParameterNames.get(lowerCase(parameterNameToMatch));
if (callParameterName == null) {
if (logger.isDebugEnabled()) {
Expand All @@ -577,7 +579,7 @@ public Map<String, Object> matchInParameterValuesWithCallParameters(SqlParameter

if (matchedParameters.size() < callParameterNames.size()) {
for (String parameterName : callParameterNames.keySet()) {
String parameterNameToMatch = this.metaDataProvider.parameterNameToUse(parameterName);
String parameterNameToMatch = provider.parameterNameToUse(parameterName);
String callParameterName = callParameterNames.get(lowerCase(parameterNameToMatch));
if (!matchedParameters.containsKey(callParameterName)) {
logger.warn("Unable to locate the corresponding parameter value for '" + parameterName +
Expand Down

0 comments on commit 9fc4fb1

Please sign in to comment.