Polishing

This commit is contained in:
Juergen Hoeller 2014-04-28 00:29:04 +02:00
parent 4196e6c96f
commit c97c246940
4 changed files with 57 additions and 47 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -258,7 +258,7 @@ public class ComponentScanBeanDefinitionParser implements BeanDefinitionParser {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Object instantiateUserDefinedStrategy(String className, Class<?> strategyType, ClassLoader classLoader) { private Object instantiateUserDefinedStrategy(String className, Class<?> strategyType, ClassLoader classLoader) {
Object result = null; Object result;
try { try {
result = classLoader.loadClass(className).newInstance(); result = classLoader.loadClass(className).newInstance();
} }
@ -268,7 +268,7 @@ public class ComponentScanBeanDefinitionParser implements BeanDefinitionParser {
} }
catch (Exception ex) { catch (Exception ex) {
throw new IllegalArgumentException("Unable to instantiate class [" + className + "] for strategy [" + throw new IllegalArgumentException("Unable to instantiate class [" + className + "] for strategy [" +
strategyType.getName() + "]. A zero-argument constructor is required", ex); strategyType.getName() + "]: a zero-argument constructor is required", ex);
} }
if (!strategyType.isAssignableFrom(result.getClass())) { if (!strategyType.isAssignableFrom(result.getClass())) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -103,8 +103,8 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
// We couldn't load the class file, which is not fatal as it // We couldn't load the class file, which is not fatal as it
// simply means this method of discovering parameter names won't work. // simply means this method of discovering parameter names won't work.
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Cannot find '.class' file for class [" + clazz logger.debug("Cannot find '.class' file for class [" + clazz +
+ "] - unable to determine constructors/methods parameter names"); "] - unable to determine constructor/method parameter names");
} }
return NO_DEBUG_INFO_MAP; return NO_DEBUG_INFO_MAP;
} }
@ -117,14 +117,14 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
catch (IOException ex) { catch (IOException ex) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Exception thrown while reading '.class' file for class [" + clazz + logger.debug("Exception thrown while reading '.class' file for class [" + clazz +
"] - unable to determine constructors/methods parameter names", ex); "] - unable to determine constructor/method parameter names", ex);
} }
} }
catch (IllegalArgumentException ex) { catch (IllegalArgumentException ex) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("ASM ClassReader failed to parse class file [" + clazz + logger.debug("ASM ClassReader failed to parse class file [" + clazz +
"], probably due to a new Java class file version that isn't supported yet " + "], probably due to a new Java class file version that isn't supported yet " +
"- unable to determine constructors/methods parameter names", ex); "- unable to determine constructor/method parameter names", ex);
} }
} }
finally { finally {
@ -148,6 +148,7 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
private static final String STATIC_CLASS_INIT = "<clinit>"; private static final String STATIC_CLASS_INIT = "<clinit>";
private final Class<?> clazz; private final Class<?> clazz;
private final Map<Member, String[]> memberMap; private final Map<Member, String[]> memberMap;
public ParameterNameDiscoveringVisitor(Class<?> clazz, Map<Member, String[]> memberMap) { public ParameterNameDiscoveringVisitor(Class<?> clazz, Map<Member, String[]> memberMap) {
@ -180,12 +181,17 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
private static final String CONSTRUCTOR = "<init>"; private static final String CONSTRUCTOR = "<init>";
private final Class<?> clazz; private final Class<?> clazz;
private final Map<Member, String[]> memberMap; private final Map<Member, String[]> memberMap;
private final String name; private final String name;
private final Type[] args; private final Type[] args;
private final String[] parameterNames;
private final boolean isStatic; private final boolean isStatic;
private String[] parameterNames;
private boolean hasLvtInfo = false; private boolean hasLvtInfo = false;
/* /*
@ -194,25 +200,22 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
*/ */
private final int[] lvtSlotIndex; private final int[] lvtSlotIndex;
public LocalVariableTableVisitor(Class<?> clazz, Map<Member, String[]> map, String name, String desc, public LocalVariableTableVisitor(Class<?> clazz, Map<Member, String[]> map, String name, String desc, boolean isStatic) {
boolean isStatic) {
super(SpringAsmInfo.ASM_VERSION); super(SpringAsmInfo.ASM_VERSION);
this.clazz = clazz; this.clazz = clazz;
this.memberMap = map; this.memberMap = map;
this.name = name; this.name = name;
// determine args this.args = Type.getArgumentTypes(desc);
args = Type.getArgumentTypes(desc); this.parameterNames = new String[this.args.length];
this.parameterNames = new String[args.length];
this.isStatic = isStatic; this.isStatic = isStatic;
this.lvtSlotIndex = computeLvtSlotIndices(isStatic, args); this.lvtSlotIndex = computeLvtSlotIndices(isStatic, this.args);
} }
@Override @Override
public void visitLocalVariable(String name, String description, String signature, Label start, Label end, public void visitLocalVariable(String name, String description, String signature, Label start, Label end, int index) {
int index) {
this.hasLvtInfo = true; this.hasLvtInfo = true;
for (int i = 0; i < lvtSlotIndex.length; i++) { for (int i = 0; i < this.lvtSlotIndex.length; i++) {
if (lvtSlotIndex[i] == index) { if (this.lvtSlotIndex[i] == index) {
this.parameterNames[i] = name; this.parameterNames[i] = name;
} }
} }
@ -225,27 +228,25 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
// which doesn't use any local variables. // which doesn't use any local variables.
// This means that hasLvtInfo could be false for that kind of methods // This means that hasLvtInfo could be false for that kind of methods
// even if the class has local variable info. // even if the class has local variable info.
memberMap.put(resolveMember(), parameterNames); this.memberMap.put(resolveMember(), this.parameterNames);
} }
} }
private Member resolveMember() { private Member resolveMember() {
ClassLoader loader = clazz.getClassLoader(); ClassLoader loader = this.clazz.getClassLoader();
Class<?>[] classes = new Class<?>[args.length]; Class<?>[] argTypes = new Class<?>[this.args.length];
for (int i = 0; i < this.args.length; i++) {
// resolve args argTypes[i] = ClassUtils.resolveClassName(this.args[i].getClassName(), loader);
for (int i = 0; i < args.length; i++) {
classes[i] = ClassUtils.resolveClassName(args[i].getClassName(), loader);
} }
try { try {
if (CONSTRUCTOR.equals(name)) { if (CONSTRUCTOR.equals(this.name)) {
return clazz.getDeclaredConstructor(classes); return this.clazz.getDeclaredConstructor(argTypes);
} }
return this.clazz.getDeclaredMethod(this.name, argTypes);
return clazz.getDeclaredMethod(name, classes); }
} catch (NoSuchMethodException ex) { catch (NoSuchMethodException ex) {
throw new IllegalStateException("Method [" + name throw new IllegalStateException("Method [" + this.name +
+ "] was discovered in the .class file but cannot be resolved in the class object", ex); "] was discovered in the .class file but cannot be resolved in the class object", ex);
} }
} }
@ -256,7 +257,8 @@ public class LocalVariableTableParameterNameDiscoverer implements ParameterNameD
lvtIndex[i] = nextIndex; lvtIndex[i] = nextIndex;
if (isWideType(paramTypes[i])) { if (isWideType(paramTypes[i])) {
nextIndex += 2; nextIndex += 2;
} else { }
else {
nextIndex++; nextIndex++;
} }
} }

View File

@ -125,7 +125,7 @@ public class XmlBeansMarshaller extends AbstractMarshaller {
@Override @Override
protected void marshalDomNode(Object graph, Node node) throws XmlMappingException { protected void marshalDomNode(Object graph, Node node) throws XmlMappingException {
Document document = node.getNodeType() == Node.DOCUMENT_NODE ? (Document) node : node.getOwnerDocument(); Document document = (node.getNodeType() == Node.DOCUMENT_NODE ? (Document) node : node.getOwnerDocument());
Node xmlBeansNode = ((XmlObject) graph).newDomNode(getXmlOptions()); Node xmlBeansNode = ((XmlObject) graph).newDomNode(getXmlOptions());
NodeList xmlBeansChildNodes = xmlBeansNode.getChildNodes(); NodeList xmlBeansChildNodes = xmlBeansNode.getChildNodes();
for (int i = 0; i < xmlBeansChildNodes.getLength(); i++) { for (int i = 0; i < xmlBeansChildNodes.getLength(); i++) {
@ -277,19 +277,27 @@ public class XmlBeansMarshaller extends AbstractMarshaller {
*/ */
protected void validate(XmlObject object) throws ValidationFailureException { protected void validate(XmlObject object) throws ValidationFailureException {
if (isValidating() && object != null) { if (isValidating() && object != null) {
// create a temporary xmlOptions just for validation XmlOptions validateOptions = getXmlOptions();
XmlOptions validateOptions = getXmlOptions() != null ? getXmlOptions() : new XmlOptions(); if (validateOptions == null) {
// Create temporary XmlOptions just for validation
validateOptions = new XmlOptions();
}
List<XmlError> errorsList = new ArrayList<XmlError>(); List<XmlError> errorsList = new ArrayList<XmlError>();
validateOptions.setErrorListener(errorsList); validateOptions.setErrorListener(errorsList);
if (!object.validate(validateOptions)) { if (!object.validate(validateOptions)) {
StringBuilder builder = new StringBuilder("Could not validate XmlObject :"); StringBuilder sb = new StringBuilder("Failed to validate XmlObject: ");
boolean first = true;
for (XmlError error : errorsList) { for (XmlError error : errorsList) {
if (error instanceof XmlValidationError) { if (error instanceof XmlValidationError) {
builder.append(error.toString()); if (!first) {
sb.append("; ");
}
sb.append(error.toString());
first = false;
} }
} }
throw new ValidationFailureException("XMLBeans validation failure", throw new ValidationFailureException("XMLBeans validation failure",
new XmlException(builder.toString(), null, errorsList)); new XmlException(sb.toString(), null, errorsList));
} }
} }
} }
@ -306,7 +314,7 @@ public class XmlBeansMarshaller extends AbstractMarshaller {
*/ */
protected XmlMappingException convertXmlBeansException(Exception ex, boolean marshalling) { protected XmlMappingException convertXmlBeansException(Exception ex, boolean marshalling) {
if (ex instanceof XMLStreamValidationException) { if (ex instanceof XMLStreamValidationException) {
return new ValidationFailureException("XmlBeans validation exception", ex); return new ValidationFailureException("XMLBeans validation exception", ex);
} }
else if (ex instanceof XmlException || ex instanceof SAXException) { else if (ex instanceof XmlException || ex instanceof SAXException) {
if (marshalling) { if (marshalling) {

View File

@ -45,14 +45,14 @@ import org.springframework.web.util.WebUtils;
* and so on. This mechanism complements and does not replace the need to * and so on. This mechanism complements and does not replace the need to
* configure a filter in {@code web.xml} with dispatcher types. * configure a filter in {@code web.xml} with dispatcher types.
* *
* <p>Sub-classes may use {@link #isAsyncDispatch(HttpServletRequest)} to * <p>Subclasses may use {@link #isAsyncDispatch(HttpServletRequest)} to
* determine when a filter is invoked as part of an async dispatch, and * determine when a filter is invoked as part of an async dispatch, and use
* use {@link #isAsyncStarted(HttpServletRequest)} to determine when the * {@link #isAsyncStarted(HttpServletRequest)} to determine when the request
* request has been placed in async mode and therefore the current dispatch * has been placed in async mode and therefore the current dispatch won't be
* won't be the last one. * the last one for the given request.
* *
* <p>Yet another dispatch type that also occurs in its own thread is * <p>Yet another dispatch type that also occurs in its own thread is
* {@link javax.servlet.DispatcherType#ERROR ERROR}. Sub-classes can override * {@link javax.servlet.DispatcherType#ERROR ERROR}. Subclasses can override
* {@link #shouldNotFilterErrorDispatch()} if they wish to declare statically * {@link #shouldNotFilterErrorDispatch()} if they wish to declare statically
* if they should be invoked <em>once</em> during error dispatches. * if they should be invoked <em>once</em> during error dispatches.
* *