Polishing
This commit is contained in:
parent
4196e6c96f
commit
c97c246940
|
@ -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())) {
|
||||||
|
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue