Repository: camel Updated Branches: refs/heads/master 114977438 -> db59f391e
CAMEL-3933: Get rid of synchronized code in unmarhal in protobuf dataformat. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/db59f391 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/db59f391 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/db59f391 Branch: refs/heads/master Commit: db59f391ede5a4d03216a7285880560a23cdc879 Parents: 1149774 Author: Claus Ibsen <[email protected]> Authored: Sun Mar 16 13:30:45 2014 +0100 Committer: Claus Ibsen <[email protected]> Committed: Sun Mar 16 13:30:45 2014 +0100 ---------------------------------------------------------------------- .../dataformat/protobuf/ProtobufDataFormat.java | 89 +++++++++++--------- .../protobuf/generated/AddressBookProtos.java | 19 ++++- 2 files changed, 66 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/db59f391/components/camel-protobuf/src/main/java/org/apache/camel/dataformat/protobuf/ProtobufDataFormat.java ---------------------------------------------------------------------- diff --git a/components/camel-protobuf/src/main/java/org/apache/camel/dataformat/protobuf/ProtobufDataFormat.java b/components/camel-protobuf/src/main/java/org/apache/camel/dataformat/protobuf/ProtobufDataFormat.java index 15b47a2..1c240d4 100755 --- a/components/camel-protobuf/src/main/java/org/apache/camel/dataformat/protobuf/ProtobufDataFormat.java +++ b/components/camel-protobuf/src/main/java/org/apache/camel/dataformat/protobuf/ProtobufDataFormat.java @@ -14,7 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.camel.dataformat.protobuf; import java.io.InputStream; @@ -24,30 +23,36 @@ import com.google.protobuf.Message; import com.google.protobuf.Message.Builder; import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; import org.apache.camel.CamelException; import org.apache.camel.Exchange; import org.apache.camel.InvalidPayloadException; import org.apache.camel.spi.DataFormat; +import org.apache.camel.support.ServiceSupport; import org.apache.camel.util.ObjectHelper; +public class ProtobufDataFormat extends ServiceSupport implements DataFormat, CamelContextAware { -public class ProtobufDataFormat implements DataFormat { - + private CamelContext camelContext; private Message defaultInstance; private String instanceClassName; - - /** - * @param defaultInstance - */ + public ProtobufDataFormat() { + } + public ProtobufDataFormat(Message defaultInstance) { this.defaultInstance = defaultInstance; } - - public ProtobufDataFormat() { + + public CamelContext getCamelContext() { + return camelContext; } - - public void setDefaultInstace(Message instance) { + + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + public void setDefaultInstance(Message instance) { this.defaultInstance = instance; } @@ -59,38 +64,11 @@ public class ProtobufDataFormat implements DataFormat { } } - public synchronized Message getInstance(Exchange exchange) throws Exception { - if (defaultInstance == null) { - if (instanceClassName == null) { - throw new CamelException("There is not defaultInstance for protobuf unmarshaling"); - } else { - defaultInstance = loadDefaultInstance(instanceClassName, exchange.getContext()); - } - } - return defaultInstance; - } - public void setInstanceClass(String className) throws Exception { ObjectHelper.notNull(className, "ProtobufDataFormat instaceClass"); instanceClassName = className; } - protected Message loadDefaultInstance(String className, CamelContext context) throws CamelException, ClassNotFoundException { - Class<?> instanceClass = context.getClassResolver().resolveMandatoryClass(className); - if (Message.class.isAssignableFrom(instanceClass)) { - try { - Method method = instanceClass.getMethod("getDefaultInstance", new Class[0]); - return (Message) method.invoke(null, new Object[0]); - } catch (Exception ex) { - throw new CamelException("Can't set the defaultInstance of ProtobufferDataFormat with " - + className + ", caused by " + ex); - } - } else { - throw new CamelException("Can't set the defaultInstance of ProtobufferDataFormat with " - + className + ", as the class is not a subClass of com.google.protobuf.Message"); - } - } - /* * (non-Javadoc) * @see org.apache.camel.spi.DataFormat#marshal(org.apache.camel.Exchange, @@ -106,14 +84,43 @@ public class ProtobufDataFormat implements DataFormat { * java.io.InputStream) */ public Object unmarshal(Exchange exchange, InputStream inputStream) throws Exception { - Message instance = getInstance(exchange); - Builder builder = instance.newBuilderForType().mergeFrom(inputStream); + ObjectHelper.notNull(defaultInstance, "defaultInstance or instanceClassName must be set", this); + + Builder builder = defaultInstance.newBuilderForType().mergeFrom(inputStream); if (!builder.isInitialized()) { // TODO which exception should be thrown here? - throw new InvalidPayloadException(exchange, instance.getClass()); + throw new InvalidPayloadException(exchange, defaultInstance.getClass()); } return builder.build(); } + protected Message loadDefaultInstance(String className, CamelContext context) throws CamelException, ClassNotFoundException { + Class<?> instanceClass = context.getClassResolver().resolveMandatoryClass(className); + if (Message.class.isAssignableFrom(instanceClass)) { + try { + Method method = instanceClass.getMethod("getDefaultInstance", new Class[0]); + return (Message) method.invoke(null, new Object[0]); + } catch (Exception ex) { + throw new CamelException("Can't set the defaultInstance of ProtobufferDataFormat with " + + className + ", caused by " + ex); + } + } else { + throw new CamelException("Can't set the defaultInstance of ProtobufferDataFormat with " + + className + ", as the class is not a subClass of com.google.protobuf.Message"); + } + } + + @Override + protected void doStart() throws Exception { + if (defaultInstance == null && instanceClassName != null) { + defaultInstance = loadDefaultInstance(instanceClassName, getCamelContext()); + } + } + + @Override + protected void doStop() throws Exception { + // noop + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/db59f391/components/camel-protobuf/src/test/java/org/apache/camel/dataformat/protobuf/generated/AddressBookProtos.java ---------------------------------------------------------------------- diff --git a/components/camel-protobuf/src/test/java/org/apache/camel/dataformat/protobuf/generated/AddressBookProtos.java b/components/camel-protobuf/src/test/java/org/apache/camel/dataformat/protobuf/generated/AddressBookProtos.java index 33dff5f..f88a9c0 100644 --- a/components/camel-protobuf/src/test/java/org/apache/camel/dataformat/protobuf/generated/AddressBookProtos.java +++ b/components/camel-protobuf/src/test/java/org/apache/camel/dataformat/protobuf/generated/AddressBookProtos.java @@ -1,8 +1,25 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + // Generated by the protocol buffer compiler. DO NOT EDIT! // source: addressbook.proto - package org.apache.camel.dataformat.protobuf.generated; +//CHECKSTYLE:OFF public final class AddressBookProtos { private AddressBookProtos() {} public static void registerAllExtensions(
