You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2014/04/08 16:07:33 UTC

git commit: CAMEL-7349 cach the schema in JaxbDataFormate

Repository: camel
Updated Branches:
  refs/heads/master 5a74dfca3 -> 41d7eca93


CAMEL-7349 cach the schema in JaxbDataFormate


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/41d7eca9
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/41d7eca9
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/41d7eca9

Branch: refs/heads/master
Commit: 41d7eca93409a71ce731dd9a54f8caa86ce78cfb
Parents: 5a74dfc
Author: Willem Jiang <wi...@gmail.com>
Authored: Tue Apr 8 22:06:45 2014 +0800
Committer: Willem Jiang <wi...@gmail.com>
Committed: Tue Apr 8 22:06:45 2014 +0800

----------------------------------------------------------------------
 .../camel/converter/jaxb/JaxbDataFormat.java    | 70 ++++++++++++--------
 1 file changed, 42 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/41d7eca9/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java
----------------------------------------------------------------------
diff --git a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java
index 1e866e1..d34836d 100644
--- a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java
+++ b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java
@@ -91,6 +91,7 @@ public class JaxbDataFormat extends ServiceSupport implements DataFormat, CamelC
     private JaxbNamespacePrefixMapper namespacePrefixMapper;
     private JaxbXmlStreamWriterWrapper xmlStreamWriterWrapper;
     private TypeConverter typeConverter;
+    private volatile Schema cachedSchema;
 
     public JaxbDataFormat() {
     }
@@ -367,47 +368,60 @@ public class JaxbDataFormat extends ServiceSupport implements DataFormat, CamelC
         }
     }
     
-    protected Unmarshaller createUnmarshaller() throws JAXBException, SAXException, FileNotFoundException, MalformedURLException {
+    protected Unmarshaller createUnmarshaller() throws JAXBException, SAXException, FileNotFoundException,
+        MalformedURLException {
         Unmarshaller unmarshaller = getContext().createUnmarshaller();
         if (schema != null) {
-            SchemaFactory factory = getOrCreateSchemaFactory();
-            try {
-                Schema newSchema = factory.newSchema(getSources());
-                unmarshaller.setSchema(newSchema);
-                unmarshaller.setEventHandler(new ValidationEventHandler() {
-                    public boolean handleEvent(ValidationEvent event) {
-                        // stop unmarshalling if the event is an ERROR or FATAL ERROR
-                        return event.getSeverity() == ValidationEvent.WARNING;
-                    }
-                });
-            } finally {
-                returnSchemaFactory(factory);
-            }
+            unmarshaller.setSchema(getCachedSchema());
+            unmarshaller.setEventHandler(new ValidationEventHandler() {
+                public boolean handleEvent(ValidationEvent event) {
+                    // stop unmarshalling if the event is an ERROR or FATAL
+                    // ERROR
+                    return event.getSeverity() == ValidationEvent.WARNING;
+                }
+            });
+
         }
 
         return unmarshaller;
     }
 
-    protected Marshaller createMarshaller() throws JAXBException, SAXException, FileNotFoundException, MalformedURLException {
+    protected Marshaller createMarshaller() throws JAXBException, SAXException, FileNotFoundException,
+        MalformedURLException {
         Marshaller marshaller = getContext().createMarshaller();
         if (schema != null) {
-            SchemaFactory factory = getOrCreateSchemaFactory();
-            try {
-                Schema newSchema = factory.newSchema(getSources());
-                marshaller.setSchema(newSchema);
-                marshaller.setEventHandler(new ValidationEventHandler() {
-                    public boolean handleEvent(ValidationEvent event) {
-                        // stop marshalling if the event is an ERROR or FATAL ERROR
-                        return event.getSeverity() == ValidationEvent.WARNING;
-                    }
-                });
-            } finally {
-                returnSchemaFactory(factory);
-            }
+            marshaller.setSchema(getCachedSchema());
+            marshaller.setEventHandler(new ValidationEventHandler() {
+                public boolean handleEvent(ValidationEvent event) {
+                    // stop marshalling if the event is an ERROR or FATAL ERROR
+                    return event.getSeverity() == ValidationEvent.WARNING;
+                }
+            });
+
         }
 
         return marshaller;
     }
+    
+    private Schema getCachedSchema() throws FileNotFoundException, MalformedURLException, SAXException {
+        if (cachedSchema == null) {
+            synchronized (this) {
+                if (cachedSchema == null) {
+                    cachedSchema = createSchema(getSources());
+                }
+            }
+        }
+        return cachedSchema;
+    }
+    
+    private Schema createSchema(Source[] sources) throws SAXException {
+        SchemaFactory factory = getOrCreateSchemaFactory();
+        try {
+            return factory.newSchema(sources);
+        } finally {
+            returnSchemaFactory(factory);
+        }
+    }
 
     private Source[] getSources() throws FileNotFoundException, MalformedURLException {
         // we support multiple schema by delimiting they by ','


Re: git commit: CAMEL-7349 cach the schema in JaxbDataFormate

Posted by Willem Jiang <wi...@gmail.com>.
good suggestion, I just updated the code that way :)


--  
Willem Jiang

Red Hat, Inc.
Web: http://www.redhat.com
Blog: http://willemjiang.blogspot.com (English)
http://jnn.iteye.com (Chinese)
Twitter: willemjiang  
Weibo: 姜宁willem



On April 8, 2014 at 10:24:06 PM, Claus Ibsen (claus.ibsen@gmail.com) wrote:
> Hi
>  
> Instead of synchrnoized logic which isn't ideal, we should use doStart
> / doStop to do this kind of logic. eg you can extend ServiceSupport
> and then in doStart / doStop you can load the schema, so its ready
> before use. So then you don't need any scynrhonized code and whatnot.
>  
> On Tue, Apr 8, 2014 at 4:07 PM, wrote:
> > Repository: camel
> > Updated Branches:
> > refs/heads/master 5a74dfca3 -> 41d7eca93
> >
> >
> > CAMEL-7349 cach the schema in JaxbDataFormate
> >
> >
> > Project: http://git-wip-us.apache.org/repos/asf/camel/repo
> > Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/41d7eca9
> > Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/41d7eca9
> > Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/41d7eca9
> >
> > Branch: refs/heads/master
> > Commit: 41d7eca93409a71ce731dd9a54f8caa86ce78cfb
> > Parents: 5a74dfc
> > Author: Willem Jiang  
> > Authored: Tue Apr 8 22:06:45 2014 +0800
> > Committer: Willem Jiang  
> > Committed: Tue Apr 8 22:06:45 2014 +0800
> >
> > ----------------------------------------------------------------------  
> > .../camel/converter/jaxb/JaxbDataFormat.java | 70 ++++++++++++--------
> > 1 file changed, 42 insertions(+), 28 deletions(-)
> > ----------------------------------------------------------------------  
> >
> >
> > http://git-wip-us.apache.org/repos/asf/camel/blob/41d7eca9/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java  
> > ----------------------------------------------------------------------  
> > diff --git a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java  
> b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java  
> > index 1e866e1..d34836d 100644
> > --- a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java  
> > +++ b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java  
> > @@ -91,6 +91,7 @@ public class JaxbDataFormat extends ServiceSupport implements  
> DataFormat, CamelC
> > private JaxbNamespacePrefixMapper namespacePrefixMapper;
> > private JaxbXmlStreamWriterWrapper xmlStreamWriterWrapper;
> > private TypeConverter typeConverter;
> > + private volatile Schema cachedSchema;
> >
> > public JaxbDataFormat() {
> > }
> > @@ -367,47 +368,60 @@ public class JaxbDataFormat extends ServiceSupport implements  
> DataFormat, CamelC
> > }
> > }
> >
> > - protected Unmarshaller createUnmarshaller() throws JAXBException, SAXException,  
> FileNotFoundException, MalformedURLException {
> > + protected Unmarshaller createUnmarshaller() throws JAXBException, SAXException,  
> FileNotFoundException,
> > + MalformedURLException {
> > Unmarshaller unmarshaller = getContext().createUnmarshaller();
> > if (schema != null) {
> > - SchemaFactory factory = getOrCreateSchemaFactory();
> > - try {
> > - Schema newSchema = factory.newSchema(getSources());
> > - unmarshaller.setSchema(newSchema);
> > - unmarshaller.setEventHandler(new ValidationEventHandler() {
> > - public boolean handleEvent(ValidationEvent event) {
> > - // stop unmarshalling if the event is an ERROR or FATAL ERROR
> > - return event.getSeverity() == ValidationEvent.WARNING;
> > - }
> > - });
> > - } finally {
> > - returnSchemaFactory(factory);
> > - }
> > + unmarshaller.setSchema(getCachedSchema());
> > + unmarshaller.setEventHandler(new ValidationEventHandler() {
> > + public boolean handleEvent(ValidationEvent event) {
> > + // stop unmarshalling if the event is an ERROR or FATAL
> > + // ERROR
> > + return event.getSeverity() == ValidationEvent.WARNING;
> > + }
> > + });
> > +
> > }
> >
> > return unmarshaller;
> > }
> >
> > - protected Marshaller createMarshaller() throws JAXBException, SAXException,  
> FileNotFoundException, MalformedURLException {
> > + protected Marshaller createMarshaller() throws JAXBException, SAXException,  
> FileNotFoundException,
> > + MalformedURLException {
> > Marshaller marshaller = getContext().createMarshaller();
> > if (schema != null) {
> > - SchemaFactory factory = getOrCreateSchemaFactory();
> > - try {
> > - Schema newSchema = factory.newSchema(getSources());
> > - marshaller.setSchema(newSchema);
> > - marshaller.setEventHandler(new ValidationEventHandler() {
> > - public boolean handleEvent(ValidationEvent event) {
> > - // stop marshalling if the event is an ERROR or FATAL ERROR
> > - return event.getSeverity() == ValidationEvent.WARNING;
> > - }
> > - });
> > - } finally {
> > - returnSchemaFactory(factory);
> > - }
> > + marshaller.setSchema(getCachedSchema());
> > + marshaller.setEventHandler(new ValidationEventHandler() {
> > + public boolean handleEvent(ValidationEvent event) {
> > + // stop marshalling if the event is an ERROR or FATAL ERROR
> > + return event.getSeverity() == ValidationEvent.WARNING;
> > + }
> > + });
> > +
> > }
> >
> > return marshaller;
> > }
> > +
> > + private Schema getCachedSchema() throws FileNotFoundException, MalformedURLException,  
> SAXException {
> > + if (cachedSchema == null) {
> > + synchronized (this) {
> > + if (cachedSchema == null) {
> > + cachedSchema = createSchema(getSources());
> > + }
> > + }
> > + }
> > + return cachedSchema;
> > + }
> > +
> > + private Schema createSchema(Source[] sources) throws SAXException {
> > + SchemaFactory factory = getOrCreateSchemaFactory();
> > + try {
> > + return factory.newSchema(sources);
> > + } finally {
> > + returnSchemaFactory(factory);
> > + }
> > + }
> >
> > private Source[] getSources() throws FileNotFoundException, MalformedURLException  
> {
> > // we support multiple schema by delimiting they by ','
> >
>  
>  
>  
> --
> Claus Ibsen
> -----------------
> Red Hat, Inc.
> Email: cibsen@redhat.com
> Twitter: davsclaus
> Blog: http://davsclaus.com
> Author of Camel in Action: http://www.manning.com/ibsen
> Make your Camel applications look hawt, try: http://hawt.io
>  


Re: git commit: CAMEL-7349 cach the schema in JaxbDataFormate

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

Instead of synchrnoized logic which isn't ideal, we should use doStart
/ doStop to do this kind of logic. eg you can extend ServiceSupport
and then in doStart / doStop you can load the schema, so its ready
before use. So then you don't need any scynrhonized code and whatnot.

On Tue, Apr 8, 2014 at 4:07 PM,  <ni...@apache.org> wrote:
> Repository: camel
> Updated Branches:
>   refs/heads/master 5a74dfca3 -> 41d7eca93
>
>
> CAMEL-7349 cach the schema in JaxbDataFormate
>
>
> Project: http://git-wip-us.apache.org/repos/asf/camel/repo
> Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/41d7eca9
> Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/41d7eca9
> Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/41d7eca9
>
> Branch: refs/heads/master
> Commit: 41d7eca93409a71ce731dd9a54f8caa86ce78cfb
> Parents: 5a74dfc
> Author: Willem Jiang <wi...@gmail.com>
> Authored: Tue Apr 8 22:06:45 2014 +0800
> Committer: Willem Jiang <wi...@gmail.com>
> Committed: Tue Apr 8 22:06:45 2014 +0800
>
> ----------------------------------------------------------------------
>  .../camel/converter/jaxb/JaxbDataFormat.java    | 70 ++++++++++++--------
>  1 file changed, 42 insertions(+), 28 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/camel/blob/41d7eca9/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java
> ----------------------------------------------------------------------
> diff --git a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java
> index 1e866e1..d34836d 100644
> --- a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java
> +++ b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbDataFormat.java
> @@ -91,6 +91,7 @@ public class JaxbDataFormat extends ServiceSupport implements DataFormat, CamelC
>      private JaxbNamespacePrefixMapper namespacePrefixMapper;
>      private JaxbXmlStreamWriterWrapper xmlStreamWriterWrapper;
>      private TypeConverter typeConverter;
> +    private volatile Schema cachedSchema;
>
>      public JaxbDataFormat() {
>      }
> @@ -367,47 +368,60 @@ public class JaxbDataFormat extends ServiceSupport implements DataFormat, CamelC
>          }
>      }
>
> -    protected Unmarshaller createUnmarshaller() throws JAXBException, SAXException, FileNotFoundException, MalformedURLException {
> +    protected Unmarshaller createUnmarshaller() throws JAXBException, SAXException, FileNotFoundException,
> +        MalformedURLException {
>          Unmarshaller unmarshaller = getContext().createUnmarshaller();
>          if (schema != null) {
> -            SchemaFactory factory = getOrCreateSchemaFactory();
> -            try {
> -                Schema newSchema = factory.newSchema(getSources());
> -                unmarshaller.setSchema(newSchema);
> -                unmarshaller.setEventHandler(new ValidationEventHandler() {
> -                    public boolean handleEvent(ValidationEvent event) {
> -                        // stop unmarshalling if the event is an ERROR or FATAL ERROR
> -                        return event.getSeverity() == ValidationEvent.WARNING;
> -                    }
> -                });
> -            } finally {
> -                returnSchemaFactory(factory);
> -            }
> +            unmarshaller.setSchema(getCachedSchema());
> +            unmarshaller.setEventHandler(new ValidationEventHandler() {
> +                public boolean handleEvent(ValidationEvent event) {
> +                    // stop unmarshalling if the event is an ERROR or FATAL
> +                    // ERROR
> +                    return event.getSeverity() == ValidationEvent.WARNING;
> +                }
> +            });
> +
>          }
>
>          return unmarshaller;
>      }
>
> -    protected Marshaller createMarshaller() throws JAXBException, SAXException, FileNotFoundException, MalformedURLException {
> +    protected Marshaller createMarshaller() throws JAXBException, SAXException, FileNotFoundException,
> +        MalformedURLException {
>          Marshaller marshaller = getContext().createMarshaller();
>          if (schema != null) {
> -            SchemaFactory factory = getOrCreateSchemaFactory();
> -            try {
> -                Schema newSchema = factory.newSchema(getSources());
> -                marshaller.setSchema(newSchema);
> -                marshaller.setEventHandler(new ValidationEventHandler() {
> -                    public boolean handleEvent(ValidationEvent event) {
> -                        // stop marshalling if the event is an ERROR or FATAL ERROR
> -                        return event.getSeverity() == ValidationEvent.WARNING;
> -                    }
> -                });
> -            } finally {
> -                returnSchemaFactory(factory);
> -            }
> +            marshaller.setSchema(getCachedSchema());
> +            marshaller.setEventHandler(new ValidationEventHandler() {
> +                public boolean handleEvent(ValidationEvent event) {
> +                    // stop marshalling if the event is an ERROR or FATAL ERROR
> +                    return event.getSeverity() == ValidationEvent.WARNING;
> +                }
> +            });
> +
>          }
>
>          return marshaller;
>      }
> +
> +    private Schema getCachedSchema() throws FileNotFoundException, MalformedURLException, SAXException {
> +        if (cachedSchema == null) {
> +            synchronized (this) {
> +                if (cachedSchema == null) {
> +                    cachedSchema = createSchema(getSources());
> +                }
> +            }
> +        }
> +        return cachedSchema;
> +    }
> +
> +    private Schema createSchema(Source[] sources) throws SAXException {
> +        SchemaFactory factory = getOrCreateSchemaFactory();
> +        try {
> +            return factory.newSchema(sources);
> +        } finally {
> +            returnSchemaFactory(factory);
> +        }
> +    }
>
>      private Source[] getSources() throws FileNotFoundException, MalformedURLException {
>          // we support multiple schema by delimiting they by ','
>



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cibsen@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
Make your Camel applications look hawt, try: http://hawt.io