Hi

Can you explain why you did this code change?
It seems wrong to me to change the code to force using a byte[] where
the existing code works fine, and is optimized for streams. And don't
load the data into a 2nd byte[] which mean 2x the memory comsumption.

Also the option useSharedSchema=false is intended for a workaround in
an old JDK6 bug. So ideally the option should not be used etc.


On Thu, Jun 20, 2013 at 10:13 PM,  <cmuel...@apache.org> wrote:
> Updated Branches:
>   refs/heads/master a52864dfc -> c5d5d6124
>
>
> CAMEL-6317: Camel-validator not able to resolve schema when using 
> useSharedSchema=false
> Thanks David J. M. Karlsen for reporting it
>
>
> Project: http://git-wip-us.apache.org/repos/asf/camel/repo
> Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a2593990
> Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a2593990
> Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a2593990
>
> Branch: refs/heads/master
> Commit: a2593990d45ae9acac14778701cc8e0cce24f6f4
> Parents: b21239f
> Author: cmueller <cmuel...@apache.org>
> Authored: Thu Jun 20 22:07:31 2013 +0200
> Committer: cmueller <cmuel...@apache.org>
> Committed: Thu Jun 20 22:08:01 2013 +0200
>
> ----------------------------------------------------------------------
>  .../component/validator/ValidatorComponent.java | 19 +++++++++++--------
>  .../validation/ValidatingProcessor.java         | 20 +++++++++++++++++++-
>  .../component/validator/ValidatorRouteTest.java | 15 ++++++++++++---
>  3 files changed, 42 insertions(+), 12 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/camel/blob/a2593990/camel-core/src/main/java/org/apache/camel/component/validator/ValidatorComponent.java
> ----------------------------------------------------------------------
> diff --git 
> a/camel-core/src/main/java/org/apache/camel/component/validator/ValidatorComponent.java
>  
> b/camel-core/src/main/java/org/apache/camel/component/validator/ValidatorComponent.java
> index 58de3e7..f69a5b9 100644
> --- 
> a/camel-core/src/main/java/org/apache/camel/component/validator/ValidatorComponent.java
> +++ 
> b/camel-core/src/main/java/org/apache/camel/component/validator/ValidatorComponent.java
> @@ -19,11 +19,8 @@ package org.apache.camel.component.validator;
>  import java.io.InputStream;
>  import java.util.Map;
>
> -import javax.xml.transform.stream.StreamSource;
> -
> -import org.w3c.dom.ls.LSResourceResolver;
> -
>  import org.apache.camel.Endpoint;
> +import org.apache.camel.converter.IOConverter;
>  import org.apache.camel.impl.DefaultComponent;
>  import org.apache.camel.impl.ProcessorEndpoint;
>  import org.apache.camel.processor.validation.ValidatingProcessor;
> @@ -31,6 +28,7 @@ import org.apache.camel.util.IOHelper;
>  import org.apache.camel.util.ResourceHelper;
>  import org.slf4j.Logger;
>  import org.slf4j.LoggerFactory;
> +import org.w3c.dom.ls.LSResourceResolver;
>
>  /**
>   * The <a href="http://camel.apache.org/validation.html";>Validator 
> Component</a>
> @@ -43,18 +41,23 @@ public class ValidatorComponent extends DefaultComponent {
>      protected Endpoint createEndpoint(String uri, String remaining, 
> Map<String, Object> parameters) throws Exception {
>          final String resourceUri = remaining;
>          InputStream is = 
> ResourceHelper.resolveMandatoryResourceAsInputStream(getCamelContext().getClassResolver(),
>  resourceUri);
> -        StreamSource source = new StreamSource(is);
> +        byte[] bytes = null;
> +        try {
> +            bytes = IOConverter.toBytes(is);
> +        } finally {
> +            // and make sure to close the input stream after the schema has 
> been loaded
> +            IOHelper.close(is);
> +        }
>
>          ValidatingProcessor validator = new ValidatingProcessor();
> -        validator.setSchemaSource(source);
> +        validator.setSchemaAsByteArray(bytes);
> +        //validator.setSchemaSource(source);
>          LOG.debug("{} using schema resource: {}", this, resourceUri);
>          configureValidator(validator, uri, remaining, parameters);
>
>          // force loading of schema at create time otherwise concurrent
>          // processing could cause thread safe issues for the 
> javax.xml.validation.SchemaFactory
>          validator.loadSchema();
> -        // and make sure to close the input stream after the schema has been 
> loaded
> -        IOHelper.close(is);
>
>          return new ProcessorEndpoint(uri, this, validator);
>      }
>
> http://git-wip-us.apache.org/repos/asf/camel/blob/a2593990/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
> ----------------------------------------------------------------------
> diff --git 
> a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
>  
> b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
> index f2922bc..bd9f783 100644
> --- 
> a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
> +++ 
> b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
> @@ -16,6 +16,7 @@
>   */
>  package org.apache.camel.processor.validation;
>
> +import java.io.ByteArrayInputStream;
>  import java.io.File;
>  import java.io.IOException;
>  import java.io.InputStream;
> @@ -68,6 +69,7 @@ public class ValidatingProcessor implements AsyncProcessor {
>      private SchemaFactory schemaFactory;
>      private URL schemaUrl;
>      private File schemaFile;
> +    private byte[] schemaAsByteArray;
>      private ValidatorErrorHandler errorHandler = new 
> DefaultValidationErrorHandler();
>      private boolean useDom;
>      private boolean useSharedSchema = true;
> @@ -235,6 +237,14 @@ public class ValidatingProcessor implements 
> AsyncProcessor {
>          this.schemaFile = schemaFile;
>      }
>
> +    public byte[] getSchemaAsByteArray() {
> +        return schemaAsByteArray;
> +    }
> +
> +    public void setSchemaAsByteArray(byte[] schemaAsByteArray) {
> +        this.schemaAsByteArray = schemaAsByteArray;
> +    }
> +
>      public SchemaFactory getSchemaFactory() {
>          if (schemaFactory == null) {
>              schemaFactory = createSchemaFactory();
> @@ -331,11 +341,19 @@ public class ValidatingProcessor implements 
> AsyncProcessor {
>          if (url != null) {
>              return factory.newSchema(url);
>          }
> +
>          File file = getSchemaFile();
>          if (file != null) {
>              return factory.newSchema(file);
>          }
> -        return factory.newSchema(getSchemaSource());
> +
> +        byte[] bytes = getSchemaAsByteArray();
> +        if (bytes != null) {
> +            return factory.newSchema(new StreamSource(new 
> ByteArrayInputStream(schemaAsByteArray)));
> +        }
> +
> +        Source source = getSchemaSource();
> +        return factory.newSchema(source);
>      }
>
>      /**
>
> http://git-wip-us.apache.org/repos/asf/camel/blob/a2593990/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
> ----------------------------------------------------------------------
> diff --git 
> a/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
>  
> b/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
> index c3d1880..036704f 100644
> --- 
> a/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
> +++ 
> b/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
> @@ -24,9 +24,6 @@ import org.apache.camel.builder.RouteBuilder;
>  import org.apache.camel.component.mock.MockEndpoint;
>  import org.apache.camel.processor.validation.NoXmlHeaderValidationException;
>
> -/**
> - *
> - */
>  public class ValidatorRouteTest extends ContextTestSupport {
>
>      protected MockEndpoint validEndpoint;
> @@ -125,6 +122,14 @@ public class ValidatorRouteTest extends 
> ContextTestSupport {
>          MockEndpoint.assertIsSatisfied(validEndpoint, invalidEndpoint, 
> finallyEndpoint);
>      }
>
> +    public void testUseNotASharedSchema() throws Exception {
> +        validEndpoint.expectedMessageCount(1);
> +
> +        template.sendBody("direct:useNotASharedSchema", "<mail 
> xmlns='http://foo.com/bar'><subject>Hey</subject><body>Hello 
> world!</body></mail>");
> +
> +        MockEndpoint.assertIsSatisfied(validEndpoint, invalidEndpoint, 
> finallyEndpoint);
> +    }
> +
>      @Override
>      protected void setUp() throws Exception {
>          super.setUp();
> @@ -166,6 +171,10 @@ public class ValidatorRouteTest extends 
> ContextTestSupport {
>                  from("direct:startNullHeaderNoFail")
>                          
> .to("validator:org/apache/camel/component/validator/schema.xsd?headerName=headerToValidate&failOnNullHeader=false")
>                          .to("mock:valid");
> +
> +                from("direct:useNotASharedSchema")
> +                    
> .to("validator:org/apache/camel/component/validator/schema.xsd?useSharedSchema=false")
> +                    .to("mock:valid");
>              }
>          };
>      }
>



-- 
Claus Ibsen
-----------------
www.camelone.org: The open source integration conference.

Red Hat, Inc.
FuseSource is now part of Red Hat
Email: cib...@redhat.com
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen

Reply via email to