You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@crunch.apache.org by jw...@apache.org on 2012/10/04 21:26:19 UTC
[3/3] git commit: Add support for working with protoc 2.4.x into
Crunch's protobuf utility methods
Add support for working with protoc 2.4.x into Crunch's protobuf utility methods
Project: http://git-wip-us.apache.org/repos/asf/incubator-crunch/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-crunch/commit/910b1450
Tree: http://git-wip-us.apache.org/repos/asf/incubator-crunch/tree/910b1450
Diff: http://git-wip-us.apache.org/repos/asf/incubator-crunch/diff/910b1450
Branch: refs/heads/master
Commit: 910b1450de30db0748ff06cfc9626ea4ea367416
Parents: a79ce8a
Author: Josh Wills <jw...@apache.org>
Authored: Mon Oct 1 18:38:41 2012 -0700
Committer: Josh Wills <jw...@apache.org>
Committed: Mon Oct 1 18:38:41 2012 -0700
----------------------------------------------------------------------
.../main/java/org/apache/crunch/util/PTypes.java | 3 +-
.../main/java/org/apache/crunch/util/Protos.java | 24 ++++++++++++++-
2 files changed, 25 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/910b1450/crunch/src/main/java/org/apache/crunch/util/PTypes.java
----------------------------------------------------------------------
diff --git a/crunch/src/main/java/org/apache/crunch/util/PTypes.java b/crunch/src/main/java/org/apache/crunch/util/PTypes.java
index 64fb5f6..a38ba70 100644
--- a/crunch/src/main/java/org/apache/crunch/util/PTypes.java
+++ b/crunch/src/main/java/org/apache/crunch/util/PTypes.java
@@ -17,6 +17,7 @@
*/
package org.apache.crunch.util;
+import java.lang.reflect.Method;
import java.math.BigInteger;
import java.nio.ByteBuffer;
@@ -129,7 +130,7 @@ public class PTypes {
@Override
public void initialize() {
- this.instance = ReflectionUtils.newInstance(clazz, getConfiguration());
+ this.instance = Protos.getDefaultInstance(clazz);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-crunch/blob/910b1450/crunch/src/main/java/org/apache/crunch/util/Protos.java
----------------------------------------------------------------------
diff --git a/crunch/src/main/java/org/apache/crunch/util/Protos.java b/crunch/src/main/java/org/apache/crunch/util/Protos.java
index 9d661c6..fc61ffa 100644
--- a/crunch/src/main/java/org/apache/crunch/util/Protos.java
+++ b/crunch/src/main/java/org/apache/crunch/util/Protos.java
@@ -23,6 +23,7 @@ import java.util.List;
import org.apache.crunch.DoFn;
import org.apache.crunch.Emitter;
import org.apache.crunch.MapFn;
+import org.apache.crunch.impl.mr.run.CrunchRuntimeException;
import org.apache.hadoop.util.ReflectionUtils;
import com.google.common.base.Splitter;
@@ -35,6 +36,27 @@ import com.google.protobuf.Message.Builder;
*/
public class Protos {
+ /**
+ * Utility function for creating a default PB Messgae from a Class object that
+ * works with both protoc 2.3.0 and 2.4.x.
+ * @param clazz The class of the protocol buffer to create
+ * @return An instance of a protocol buffer
+ */
+ public static <M extends Message> M getDefaultInstance(Class<M> clazz) {
+ if (clazz.getConstructors().length > 0) {
+ // Protobuf 2.3.0
+ return ReflectionUtils.newInstance(clazz, null);
+ } else {
+ // Protobuf 2.4.x
+ try {
+ Message.Builder mb = (Message.Builder) clazz.getDeclaredMethod("newBuilder").invoke(null);
+ return (M) mb.getDefaultInstanceForType();
+ } catch (Exception e) {
+ throw new CrunchRuntimeException(e);
+ }
+ }
+ }
+
public static <M extends Message, K> MapFn<M, K> extractKey(String fieldName) {
return new ExtractKeyFn<M, K>(fieldName);
}
@@ -89,7 +111,7 @@ public class Protos {
@Override
public void initialize() {
- this.msgInstance = ReflectionUtils.newInstance(msgClass, getConfiguration());
+ this.msgInstance = getDefaultInstance(msgClass);
this.fields = msgInstance.getDescriptorForType().getFields();
this.splitter = Splitter.on(sep);
}