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.ib...@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: cib...@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
>  

Reply via email to