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