Author: ffang Date: Tue Apr 2 05:15:24 2013 New Revision: 1463387 URL: http://svn.apache.org/r1463387 Log: Merged revisions 1463385 via svnmerge from https://svn.apache.org/repos/asf/cxf/branches/2.7.x-fixes
................ r1463385 | ffang | 2013-04-02 13:08:19 +0800 (二, 02 4 2013) | 9 lines Merged revisions 1463382 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r1463382 | ffang | 2013-04-02 13:01:49 +0800 (二, 02 4 2013) | 1 line [CXF-4936]Expose FastInfoset serializer tuning properties ........ ................ Modified: cxf/branches/2.6.x-fixes/ (props changed) cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/annotations/FastInfoset.java cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/feature/FastInfosetFeature.java cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java cxf/branches/2.6.x-fixes/rt/core/src/main/java/org/apache/cxf/service/factory/AnnotationsFactoryBeanListener.java Propchange: cxf/branches/2.6.x-fixes/ ------------------------------------------------------------------------------ Merged /cxf/branches/2.7.x-fixes:r1463385 Merged /cxf/trunk:r1463382 Propchange: cxf/branches/2.6.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/annotations/FastInfoset.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/annotations/FastInfoset.java?rev=1463387&r1=1463386&r2=1463387&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/annotations/FastInfoset.java (original) +++ cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/annotations/FastInfoset.java Tue Apr 2 05:15:24 2013 @@ -32,6 +32,51 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE }) public @interface FastInfoset { + /** + * Set to true in order for FastInfoset to be always used without negotiation + */ boolean force() default false; + + /** + * Sets the property <code>attributeValueMapMemoryLimit</code> on FastInfoset StAX Serializers. The property + * controls attribute value map size and can be used to control the memory and (indirectly) CPU footprint of + * processing. + */ + int serializerAttributeValueMapMemoryLimit() default -1; + + /** + * Sets the property <code>minAttributeValueSize</code> on FastInfoset StAX Serializers. The property controls the + * <b>minimum</b> size of attribute values to be indexed. + */ + int serializerMinAttributeValueSize() default -1; + + /** + * Sets the property <code>maxAttributeValueSize</code> on FastInfoset StAX Serializers. The property controls the + * <b>maximum</b> size of attribute values to be indexed. Tests have shown that setting this property to lower + * values reduces CPU burden of processing, at the expense of larger sizes of resultant encoded Fast Infoset data. + */ + int serializerMaxAttributeValueSize() default -1; + + /** + * Sets the property <code>characterContentChunkMapMemoryLimit</code> on FastInfoset StAX Serializers. The property + * controls character content chunk map size and can be used to control the memory and (indirectly) CPU footprint of + * processing. + */ + int serializerCharacterContentChunkMapMemoryLimit() default -1; + + /** + * Sets the property <code>minCharacterContentChunkSize</code> on FastInfoset StAX Serializers. The property + * controls the <b>minimum</b> size of character content chunks to be indexed. + */ + int serializerMinCharacterContentChunkSize() default -1; + + /** + * Sets the property <code>maxCharacterContentChunkSize</code> on FastInfoset StAX Serializers. The property + * controls the <b>maximum</b> size of character content chunks to be indexed. Tests have shown that setting this + * property to lower values reduces CPU burden of processing, at the expense of larger sizes of resultant encoded + * Fast Infoset data. + */ + int serializerMaxCharacterContentChunkSize() default -1; + } Modified: cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/feature/FastInfosetFeature.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/feature/FastInfosetFeature.java?rev=1463387&r1=1463386&r2=1463387&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/feature/FastInfosetFeature.java (original) +++ cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/feature/FastInfosetFeature.java Tue Apr 2 05:15:24 2013 @@ -38,9 +38,15 @@ import org.apache.cxf.interceptor.Interc */ @NoJSR250Annotations public class FastInfosetFeature extends AbstractFeature { - + boolean force; - + private Integer serializerAttributeValueMapMemoryLimit; + private Integer serializerMinAttributeValueSize; + private Integer serializerMaxAttributeValueSize; + private Integer serializerCharacterContentChunkMapMemoryLimit; + private Integer serializerMinCharacterContentChunkSize; + private Integer serializerMaxCharacterContentChunkSize; + public FastInfosetFeature() { // } @@ -50,7 +56,29 @@ public class FastInfosetFeature extends protected void initializeProvider(InterceptorProvider provider, Bus bus) { FIStaxInInterceptor in = new FIStaxInInterceptor(); + FIStaxOutInterceptor out = new FIStaxOutInterceptor(force); + if (serializerAttributeValueMapMemoryLimit != null && serializerAttributeValueMapMemoryLimit.intValue() > 0) { + out.setSerializerAttributeValueMapMemoryLimit(serializerAttributeValueMapMemoryLimit.intValue()); + } + if (serializerMinAttributeValueSize != null && serializerMinAttributeValueSize.intValue() > 0) { + out.setSerializerMinAttributeValueSize(serializerMinAttributeValueSize.intValue()); + } + if (serializerMaxAttributeValueSize != null && serializerMaxAttributeValueSize.intValue() > 0) { + out.setSerializerMaxAttributeValueSize(serializerMaxAttributeValueSize.intValue()); + } + if (serializerCharacterContentChunkMapMemoryLimit != null + && serializerCharacterContentChunkMapMemoryLimit.intValue() > 0) { + out.setSerializerCharacterContentChunkMapMemoryLimit( + serializerCharacterContentChunkMapMemoryLimit.intValue()); + } + if (serializerMinCharacterContentChunkSize != null && serializerMinCharacterContentChunkSize.intValue() > 0) { + out.setSerializerMinCharacterContentChunkSize(serializerMinCharacterContentChunkSize.intValue()); + } + if (serializerMaxCharacterContentChunkSize != null && serializerMaxCharacterContentChunkSize.intValue() > 0) { + out.setSerializerMaxCharacterContentChunkSize(serializerMaxCharacterContentChunkSize.intValue()); + } + provider.getInInterceptors().add(in); provider.getInFaultInterceptors().add(in); provider.getOutInterceptors().add(out); Modified: cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java?rev=1463387&r1=1463386&r2=1463387&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java (original) +++ cxf/branches/2.6.x-fixes/api/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java Tue Apr 2 05:15:24 2013 @@ -24,12 +24,15 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import com.sun.xml.fastinfoset.stax.StAXDocumentSerializer; +import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.message.Message; import org.apache.cxf.message.MessageUtils; @@ -42,11 +45,19 @@ import org.apache.cxf.phase.Phase; */ public class FIStaxOutInterceptor extends AbstractPhaseInterceptor<Message> { public static final String FI_ENABLED = "org.apache.cxf.fastinfoset.enabled"; + + private static final Logger LOG = LogUtils.getL7dLogger(FIStaxOutInterceptor.class); private static final String OUTPUT_STREAM_HOLDER = FIStaxOutInterceptor.class.getName() + ".outputstream"; private static final StaxOutEndingInterceptor ENDING = new StaxOutEndingInterceptor(OUTPUT_STREAM_HOLDER); boolean force; - + private Integer serializerAttributeValueMapMemoryLimit; + private Integer serializerMinAttributeValueSize; + private Integer serializerMaxAttributeValueSize; + private Integer serializerCharacterContentChunkMapMemoryLimit; + private Integer serializerMinCharacterContentChunkSize; + private Integer serializerMaxCharacterContentChunkSize; + public FIStaxOutInterceptor() { super(Phase.PRE_STREAM); addAfter(AttachmentOutInterceptor.class.getName()); @@ -138,8 +149,140 @@ public class FIStaxOutInterceptor extend } return serializer; */ - return new StAXDocumentSerializer(out); + final StAXDocumentSerializer stAXDocumentSerializer = new StAXDocumentSerializer(out); + if (serializerAttributeValueMapMemoryLimit != null && serializerAttributeValueMapMemoryLimit.intValue() > 0) { + stAXDocumentSerializer.setAttributeValueMapMemoryLimit(serializerAttributeValueMapMemoryLimit.intValue()); + } + if (serializerMinAttributeValueSize != null && serializerMinAttributeValueSize.intValue() > 0) { + stAXDocumentSerializer.setMinAttributeValueSize(serializerMinAttributeValueSize.intValue()); + } + if (serializerMaxAttributeValueSize != null && serializerMaxAttributeValueSize.intValue() > 0) { + stAXDocumentSerializer.setMaxAttributeValueSize(serializerMaxAttributeValueSize.intValue()); + } + if (serializerCharacterContentChunkMapMemoryLimit != null + && serializerCharacterContentChunkMapMemoryLimit.intValue() > 0) { + stAXDocumentSerializer + .setCharacterContentChunkMapMemoryLimit(serializerCharacterContentChunkMapMemoryLimit.intValue()); + } + if (serializerMinCharacterContentChunkSize != null && serializerMinCharacterContentChunkSize.intValue() > 0) { + stAXDocumentSerializer.setMinCharacterContentChunkSize(serializerMinCharacterContentChunkSize.intValue()); + } + if (serializerMaxCharacterContentChunkSize != null && serializerMaxCharacterContentChunkSize.intValue() > 0) { + stAXDocumentSerializer.setMaxCharacterContentChunkSize(serializerMaxCharacterContentChunkSize.intValue()); + } + return stAXDocumentSerializer; + } + + public Integer getSerializerMinAttributeValueSize() { + return serializerMinAttributeValueSize; + } + + /** + * Sets the property <code>minAttributeValueSize</code> on FastInfoset StAX Serializers created and used + * by this interceptor. The property controls the <b>minimum</b> size of attribute values to be indexed. + * + * @param serializerMinAttributeValueSize + * The <b>minimum</b> size for attribute values to be indexed, + * measured as a number of characters. The default is typically 0. + */ + public void setSerializerMinAttributeValueSize(Integer serializerMinAttributeValueSize) { + logSetter("serializerMinAttributeValueSize", serializerMinAttributeValueSize); + this.serializerMinAttributeValueSize = serializerMinAttributeValueSize; + } + + public Integer getSerializerMaxAttributeValueSize() { + return serializerMaxAttributeValueSize; + } + + /** + * Sets the property <code>maxAttributeValueSize</code> on FastInfoset StAX Serializers created and used + * by this interceptor. The property controls the <b>maximum</b> size of attribute values to be indexed. + * Tests have shown that setting this property to lower values reduces CPU burden of processing, at the expense + * of larger sizes of resultant encoded Fast Infoset data. + * + * @param serializerMaxAttributeValueSize + * The <b>maximum</b> size for attribute values to be indexed, + * measured as a number of characters. The default is typically 32. + */ + public void setSerializerMaxAttributeValueSize(Integer serializerMaxAttributeValueSize) { + logSetter("serializerMaxAttributeValueSize", serializerMaxAttributeValueSize); + this.serializerMaxAttributeValueSize = serializerMaxAttributeValueSize; } - + public Integer getSerializerCharacterContentChunkMapMemoryLimit() { + return serializerCharacterContentChunkMapMemoryLimit; + } + + /** + * Sets the property <code>characterContentChunkMapMemoryLimit</code> on FastInfoset StAX Serializers created and + * used by this interceptor. The property controls character content chunk map size and can be used to control the + * memory and (indirectly) CPU footprint of processing. + * + * @param serializerCharacterContentChunkMapMemoryLimit + * The value for the limit, measured as a number of Unicode characters. + */ + public void setSerializerCharacterContentChunkMapMemoryLimit( + Integer serializerCharacterContentChunkMapMemoryLimit) { + logSetter("serializerCharacterContentChunkMapMemoryLimit", serializerCharacterContentChunkMapMemoryLimit); + this.serializerCharacterContentChunkMapMemoryLimit = serializerCharacterContentChunkMapMemoryLimit; + } + + public Integer getSerializerMinCharacterContentChunkSize() { + return serializerMinCharacterContentChunkSize; + } + + /** + * Sets the property <code>minCharacterContentChunkSize</code> on FastInfoset StAX Serializers created and used + * by this interceptor. The property controls the <b>minimum</b> size of character content chunks to be indexed. + * + * @param serializerMinCharacterContentChunkSize + * The <b>minimum</b> size for character content chunks to be indexed, + * measured as a number of characters. The default is typically 0. + */ + public void setSerializerMinCharacterContentChunkSize(Integer serializerMinCharacterContentChunkSize) { + logSetter("serializerMinCharacterContentChunkSize", serializerMinCharacterContentChunkSize); + this.serializerMinCharacterContentChunkSize = serializerMinCharacterContentChunkSize; + } + + public Integer getSerializerMaxCharacterContentChunkSize() { + return serializerMaxCharacterContentChunkSize; + } + + /** + * Sets the property <code>maxCharacterContentChunkSize</code> on FastInfoset StAX Serializers created and used + * by this interceptor. The property controls the <b>maximum</b> size of character content chunks to be indexed. + * Tests have shown that setting this property to lower values reduces CPU burden of processing, at the expense + * of larger sizes of resultant encoded Fast Infoset data. + * + * @param serializerMaxCharacterContentChunkSize + * The <b>maximum</b> size for character content chunks to be indexed, + * measured as a number of characters. The default is typically 32. + */ + public void setSerializerMaxCharacterContentChunkSize(Integer serializerMaxCharacterContentChunkSize) { + logSetter("serializerMaxCharacterContentChunkSize", serializerMaxCharacterContentChunkSize); + this.serializerMaxCharacterContentChunkSize = serializerMaxCharacterContentChunkSize; + } + + public Integer getSerializerAttributeValueMapMemoryLimit() { + return serializerAttributeValueMapMemoryLimit; + } + + /** + * Sets the property <code>attributeValueMapMemoryLimit</code> on FastInfoset StAX Serializers created and used + * by this interceptor. The property controls attribute value map size and can be used to control + * the memory and (indirectly) CPU footprint of processing. + * + * @param serializerAttributeValueMapMemoryLimit + * The value for the limit, measured as a number of Unicode characters. + */ + public void setSerializerAttributeValueMapMemoryLimit(Integer serializerAttributeValueMapMemoryLimit) { + logSetter("serializerAttributeValueMapMemoryLimit", serializerAttributeValueMapMemoryLimit); + this.serializerAttributeValueMapMemoryLimit = serializerAttributeValueMapMemoryLimit; + } + + private void logSetter(String propertyName, Object propertyValue) { + if (LOG.isLoggable(Level.CONFIG)) { + LOG.config("Setting " + propertyName + " to " + propertyValue); + } + } } Modified: cxf/branches/2.6.x-fixes/rt/core/src/main/java/org/apache/cxf/service/factory/AnnotationsFactoryBeanListener.java URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/core/src/main/java/org/apache/cxf/service/factory/AnnotationsFactoryBeanListener.java?rev=1463387&r1=1463386&r2=1463387&view=diff ============================================================================== --- cxf/branches/2.6.x-fixes/rt/core/src/main/java/org/apache/cxf/service/factory/AnnotationsFactoryBeanListener.java (original) +++ cxf/branches/2.6.x-fixes/rt/core/src/main/java/org/apache/cxf/service/factory/AnnotationsFactoryBeanListener.java Tue Apr 2 05:15:24 2013 @@ -276,7 +276,16 @@ public class AnnotationsFactoryBeanListe private void addFastInfosetSupport(InterceptorProvider provider, FastInfoset annotation) { if (annotation != null) { FIStaxInInterceptor in = new FIStaxInInterceptor(); + FIStaxOutInterceptor out = new FIStaxOutInterceptor(annotation.force()); + out.setSerializerAttributeValueMapMemoryLimit(annotation.serializerAttributeValueMapMemoryLimit()); + out.setSerializerMinAttributeValueSize(annotation.serializerMinAttributeValueSize()); + out.setSerializerMaxAttributeValueSize(annotation.serializerMaxAttributeValueSize()); + out.setSerializerCharacterContentChunkMapMemoryLimit( + annotation.serializerCharacterContentChunkMapMemoryLimit()); + out.setSerializerMinCharacterContentChunkSize(annotation.serializerMinCharacterContentChunkSize()); + out.setSerializerMaxCharacterContentChunkSize(annotation.serializerMaxCharacterContentChunkSize()); + provider.getInInterceptors().add(in); provider.getInFaultInterceptors().add(in); provider.getOutInterceptors().add(out);
