diff --git a/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerTemplateUtils.java b/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerTemplateUtils.java index 2c9fa7e478..e1ca06bf99 100644 --- a/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerTemplateUtils.java +++ b/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerTemplateUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2020 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. @@ -46,7 +46,7 @@ public abstract class FreeMarkerTemplateUtils { public static String processTemplateIntoString(Template template, Object model) throws IOException, TemplateException { - StringWriter result = new StringWriter(); + StringWriter result = new StringWriter(1024); template.process(model, result); return result.toString(); } diff --git a/spring-core/src/main/java/org/springframework/util/FileCopyUtils.java b/spring-core/src/main/java/org/springframework/util/FileCopyUtils.java index 48f699064c..83350ad2d2 100644 --- a/spring-core/src/main/java/org/springframework/util/FileCopyUtils.java +++ b/spring-core/src/main/java/org/springframework/util/FileCopyUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2020 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. @@ -43,6 +43,9 @@ import org.springframework.lang.Nullable; */ public abstract class FileCopyUtils { + /** + * The default buffer size used when copying bytes. + */ public static final int BUFFER_SIZE = StreamUtils.BUFFER_SIZE; @@ -178,15 +181,15 @@ public abstract class FileCopyUtils { Assert.notNull(out, "No Writer specified"); try { - int byteCount = 0; + int charCount = 0; char[] buffer = new char[BUFFER_SIZE]; - int bytesRead = -1; - while ((bytesRead = in.read(buffer)) != -1) { - out.write(buffer, 0, bytesRead); - byteCount += bytesRead; + int charsRead; + while ((charsRead = in.read(buffer)) != -1) { + out.write(buffer, 0, charsRead); + charCount += charsRead; } out.flush(); - return byteCount; + return charCount; } finally { try { @@ -203,7 +206,7 @@ public abstract class FileCopyUtils { } /** - * Copy the contents of the given String to the given output Writer. + * Copy the contents of the given String to the given Writer. * Closes the writer when done. * @param in the String to copy from * @param out the Writer to copy to @@ -237,7 +240,7 @@ public abstract class FileCopyUtils { return ""; } - StringWriter out = new StringWriter(); + StringWriter out = new StringWriter(BUFFER_SIZE); copy(in, out); return out.toString(); } diff --git a/spring-core/src/main/java/org/springframework/util/StreamUtils.java b/spring-core/src/main/java/org/springframework/util/StreamUtils.java index 94d5ae253c..6d559a2fca 100644 --- a/spring-core/src/main/java/org/springframework/util/StreamUtils.java +++ b/spring-core/src/main/java/org/springframework/util/StreamUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2020 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. @@ -45,6 +45,9 @@ import org.springframework.lang.Nullable; */ public abstract class StreamUtils { + /** + * The default buffer size used when copying bytes. + */ public static final int BUFFER_SIZE = 4096; private static final byte[] EMPTY_CONTENT = new byte[0]; @@ -52,7 +55,7 @@ public abstract class StreamUtils { /** * Copy the contents of the given InputStream into a new byte array. - * Leaves the stream open when done. + *
Leaves the stream open when done. * @param in the stream to copy from (may be {@code null} or empty) * @return the new byte array that has been copied to (possibly empty) * @throws IOException in case of I/O errors @@ -69,8 +72,9 @@ public abstract class StreamUtils { /** * Copy the contents of the given InputStream into a String. - * Leaves the stream open when done. + *
Leaves the stream open when done. * @param in the InputStream to copy from (may be {@code null} or empty) + * @param charset the {@link Charset} to use to decode the bytes * @return the String that has been copied to (possibly empty) * @throws IOException in case of I/O errors */ @@ -79,19 +83,19 @@ public abstract class StreamUtils { return ""; } - StringBuilder out = new StringBuilder(); + StringBuilder out = new StringBuilder(BUFFER_SIZE); InputStreamReader reader = new InputStreamReader(in, charset); char[] buffer = new char[BUFFER_SIZE]; - int bytesRead = -1; - while ((bytesRead = reader.read(buffer)) != -1) { - out.append(buffer, 0, bytesRead); + int charsRead; + while ((charsRead = reader.read(buffer)) != -1) { + out.append(buffer, 0, charsRead); } return out.toString(); } /** * Copy the contents of the given byte array to the given OutputStream. - * Leaves the stream open when done. + *
Leaves the stream open when done. * @param in the byte array to copy from * @param out the OutputStream to copy to * @throws IOException in case of I/O errors @@ -101,11 +105,12 @@ public abstract class StreamUtils { Assert.notNull(out, "No OutputStream specified"); out.write(in); + out.flush(); } /** - * Copy the contents of the given String to the given output OutputStream. - * Leaves the stream open when done. + * Copy the contents of the given String to the given OutputStream. + *
Leaves the stream open when done. * @param in the String to copy from * @param charset the Charset * @param out the OutputStream to copy to @@ -113,7 +118,7 @@ public abstract class StreamUtils { */ public static void copy(String in, Charset charset, OutputStream out) throws IOException { Assert.notNull(in, "No input String specified"); - Assert.notNull(charset, "No charset specified"); + Assert.notNull(charset, "No Charset specified"); Assert.notNull(out, "No OutputStream specified"); Writer writer = new OutputStreamWriter(out, charset); @@ -123,7 +128,7 @@ public abstract class StreamUtils { /** * Copy the contents of the given InputStream to the given OutputStream. - * Leaves both streams open when done. + *
Leaves both streams open when done. * @param in the InputStream to copy from * @param out the OutputStream to copy to * @return the number of bytes copied @@ -135,7 +140,7 @@ public abstract class StreamUtils { int byteCount = 0; byte[] buffer = new byte[BUFFER_SIZE]; - int bytesRead = -1; + int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); byteCount += bytesRead; @@ -167,7 +172,7 @@ public abstract class StreamUtils { } long bytesToCopy = end - start + 1; - byte[] buffer = new byte[StreamUtils.BUFFER_SIZE]; + byte[] buffer = new byte[(int) Math.min(StreamUtils.BUFFER_SIZE, bytesToCopy)]; while (bytesToCopy > 0) { int bytesRead = in.read(buffer); if (bytesRead == -1) { @@ -187,7 +192,7 @@ public abstract class StreamUtils { /** * Drain the remaining content of the given InputStream. - * Leaves the InputStream open when done. + *
Leaves the InputStream open when done. * @param in the InputStream to drain * @return the number of bytes read * @throws IOException in case of I/O errors @@ -257,7 +262,7 @@ public abstract class StreamUtils { @Override public void write(byte[] b, int off, int let) throws IOException { // It is critical that we override this method for performance - out.write(b, off, let); + this.out.write(b, off, let); } @Override diff --git a/spring-jms/src/main/java/org/springframework/jms/support/converter/MappingJackson2MessageConverter.java b/spring-jms/src/main/java/org/springframework/jms/support/converter/MappingJackson2MessageConverter.java index 986b58dc35..dc051ee912 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/converter/MappingJackson2MessageConverter.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/converter/MappingJackson2MessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2020 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. @@ -121,7 +121,7 @@ public class MappingJackson2MessageConverter implements SmartMessageConverter, B /** * Specify the encoding to use when converting to and from text-based * message body content. The default encoding will be "UTF-8". - *
When reading from a a text-based message, an encoding may have been + *
When reading from a text-based message, an encoding may have been * suggested through a special JMS property which will then be preferred * over the encoding set on this MessageConverter instance. * @see #setEncodingPropertyName @@ -267,13 +267,13 @@ public class MappingJackson2MessageConverter implements SmartMessageConverter, B * @return the resulting message * @throws JMSException if thrown by JMS methods * @throws IOException in case of I/O errors - * @see Session#createBytesMessage * @since 4.3 + * @see Session#createBytesMessage */ protected TextMessage mapToTextMessage(Object object, Session session, ObjectWriter objectWriter) throws JMSException, IOException { - StringWriter writer = new StringWriter(); + StringWriter writer = new StringWriter(1024); objectWriter.writeValue(writer, object); return session.createTextMessage(writer.toString()); } @@ -330,7 +330,7 @@ public class MappingJackson2MessageConverter implements SmartMessageConverter, B * sets the resulting value (either a mapped id or the raw Java class name) * into the configured type id message property. * @param object the payload object to set a type id for - * @param message the JMS Message to set the type id on + * @param message the JMS Message on which to set the type id property * @throws JMSException if thrown by JMS methods * @see #getJavaTypeForMessage(javax.jms.Message) * @see #setTypeIdPropertyName(String) @@ -426,7 +426,7 @@ public class MappingJackson2MessageConverter implements SmartMessageConverter, B *
The default implementation parses the configured type id property name * and consults the configured type id mapping. This can be overridden with * a different strategy, e.g. doing some heuristics based on message origin. - * @param message the JMS Message to set the type id on + * @param message the JMS Message from which to get the type id property * @throws JMSException if thrown by JMS methods * @see #setTypeIdOnMessage(Object, javax.jms.Message) * @see #setTypeIdPropertyName(String) @@ -441,11 +441,11 @@ public class MappingJackson2MessageConverter implements SmartMessageConverter, B } Class> mappedClass = this.idClassMappings.get(typeId); if (mappedClass != null) { - return this.objectMapper.getTypeFactory().constructType(mappedClass); + return this.objectMapper.constructType(mappedClass); } try { Class> typeClass = ClassUtils.forName(typeId, this.beanClassLoader); - return this.objectMapper.getTypeFactory().constructType(typeClass); + return this.objectMapper.constructType(typeClass); } catch (Throwable ex) { throw new MessageConversionException("Failed to resolve type id [" + typeId + "]", ex); diff --git a/spring-jms/src/main/java/org/springframework/jms/support/converter/MarshallingMessageConverter.java b/spring-jms/src/main/java/org/springframework/jms/support/converter/MarshallingMessageConverter.java index 6e7258348a..d05aefdd26 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/converter/MarshallingMessageConverter.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/converter/MarshallingMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2020 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. @@ -47,8 +47,6 @@ import org.springframework.util.Assert; * @author Arjen Poutsma * @author Juergen Hoeller * @since 3.0 - * @see org.springframework.jms.core.JmsTemplate#convertAndSend - * @see org.springframework.jms.core.JmsTemplate#receiveAndConvert */ public class MarshallingMessageConverter implements MessageConverter, InitializingBean { @@ -214,7 +212,7 @@ public class MarshallingMessageConverter implements MessageConverter, Initializi protected TextMessage marshalToTextMessage(Object object, Session session, Marshaller marshaller) throws JMSException, IOException, XmlMappingException { - StringWriter writer = new StringWriter(); + StringWriter writer = new StringWriter(1024); Result result = new StreamResult(writer); marshaller.marshal(object, result); return session.createTextMessage(writer.toString()); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java index 20120e23c9..8802e0f9d5 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 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. @@ -141,6 +141,7 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter { } } + @Override protected boolean canConvertFrom(Message> message, @Nullable Class> targetClass) { if (targetClass == null || !supportsMimeType(message.getHeaders())) { @@ -223,6 +224,7 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter { } } else { + // Assuming a text-based source payload if (view != null) { return this.objectMapper.readerWithView(view).forType(javaType).readValue(payload.toString()); } @@ -246,7 +248,7 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter { Type genericParameterType = param.getNestedGenericParameterType(); Class> contextClass = param.getContainingClass(); Type type = GenericTypeResolver.resolveType(genericParameterType, contextClass); - return this.objectMapper.getTypeFactory().constructType(type); + return this.objectMapper.constructType(type); } return this.objectMapper.constructType(targetClass); } @@ -271,7 +273,8 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter { payload = out.toByteArray(); } else { - Writer writer = new StringWriter(); + // Assuming a text-based target payload + Writer writer = new StringWriter(1024); if (view != null) { this.objectMapper.writerWithView(view).writeValue(writer, payload); } @@ -330,7 +333,7 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter { * @return the JSON encoding to use (never {@code null}) */ protected JsonEncoding getJsonEncoding(@Nullable MimeType contentType) { - if (contentType != null && (contentType.getCharset() != null)) { + if (contentType != null && contentType.getCharset() != null) { Charset charset = contentType.getCharset(); for (JsonEncoding encoding : JsonEncoding.values()) { if (charset.name().equals(encoding.getJavaName())) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/MarshallingMessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/MarshallingMessageConverter.java index 84fe8418d5..0b141253be 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/MarshallingMessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/MarshallingMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2020 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. @@ -46,6 +46,8 @@ import org.springframework.util.MimeType; * * @author Arjen Poutsma * @since 4.2 + * @see Marshaller + * @see Unmarshaller */ public class MarshallingMessageConverter extends AbstractMessageConverter { @@ -61,7 +63,8 @@ public class MarshallingMessageConverter extends AbstractMessageConverter { * {@link #setUnmarshaller(Unmarshaller)} to be invoked separately. */ public MarshallingMessageConverter() { - this(new MimeType("application", "xml"), new MimeType("text", "xml"), new MimeType("application", "*+xml")); + this(new MimeType("application", "xml"), new MimeType("text", "xml"), + new MimeType("application", "*+xml")); } /** @@ -160,7 +163,7 @@ public class MarshallingMessageConverter extends AbstractMessageConverter { return new StreamSource(new ByteArrayInputStream((byte[]) payload)); } else { - return new StreamSource(new StringReader((String) payload)); + return new StreamSource(new StringReader(payload.toString())); } } @@ -172,13 +175,13 @@ public class MarshallingMessageConverter extends AbstractMessageConverter { Assert.notNull(this.marshaller, "Property 'marshaller' is required"); try { if (byte[].class == getSerializedPayloadClass()) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayOutputStream out = new ByteArrayOutputStream(1024); Result result = new StreamResult(out); this.marshaller.marshal(payload, result); payload = out.toByteArray(); } else { - Writer writer = new StringWriter(); + Writer writer = new StringWriter(1024); Result result = new StreamResult(writer); this.marshaller.marshal(payload, result); payload = writer.toString();