// Path: westty-protobuf/src/main/java/org/deephacks/westty/protobuf/ProtobufSerializer.java
// @Alternative
// public class ProtobufSerializer {
//     private static final Logger log = LoggerFactory.getLogger(ProtobufSerializer.class);
//     private HashMap<Integer, Method> numToMethod = new HashMap<>();
//     private HashMap<String, Integer> protoToNum = new HashMap<>();
//     private static final String UNRECOGNIZED_PROTOCOL_MSG = "Unrecognized protocol.";
// 
//     public ProtobufSerializer() {
//         registerResource("META-INF/failure.desc");
//         registerResource("META-INF/void.desc");
//     }
// 
//     public void register(URL protodesc) {
//         try {
//             registerDesc(protodesc.getFile(), protodesc.openStream());
//         } catch (IOException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public void register(File protodesc) {
//         try {
//             registerDesc(protodesc.getName(), new FileInputStream(protodesc));
//         } catch (FileNotFoundException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public void registerResource(String protodesc) {
//         URL url = Thread.currentThread().getContextClassLoader().getResource(protodesc);
//         register(url);
//     }
// 
//     private void registerDesc(String name, InputStream in) {
//         try {
//             FileDescriptorSet descriptorSet = FileDescriptorSet.parseFrom(in);
//             for (FileDescriptorProto fdp : descriptorSet.getFileList()) {
//                 FileDescriptor fd = FileDescriptor.buildFrom(fdp, new FileDescriptor[] {});
// 
//                 for (Descriptor desc : fd.getMessageTypes()) {
//                     FieldDescriptor fdesc = desc.findFieldByName("protoType");
//                     if (fdesc == null) {
//                         throw new IllegalArgumentException(name
//                                 + ".proto file must define protoType field "
//                                 + "with unqiue number that identify proto type");
//                     }
//                     String packageName = fdp.getOptions().getJavaPackage();
// 
//                     if (Strings.isNullOrEmpty(packageName)) {
//                         throw new IllegalArgumentException(name
//                                 + ".proto file must define java_package");
//                     }
//                     String simpleClassName = fdp.getOptions().getJavaOuterClassname();
//                     if (Strings.isNullOrEmpty(simpleClassName)) {
//                         throw new IllegalArgumentException(name
//                                 + " .proto file must define java_outer_classname");
//                     }
// 
//                     String className = packageName + "." + simpleClassName + "$" + desc.getName();
//                     Class<?> cls = Thread.currentThread().getContextClassLoader()
//                             .loadClass(className);
//                     protoToNum.put(desc.getFullName(), fdesc.getNumber());
//                     numToMethod.put(fdesc.getNumber(), cls.getMethod("parseFrom", byte[].class));
//                     log.debug("Registered protobuf resource {}.", name);
//                 }
//             }
//         } catch (Exception e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public Object read(byte[] bytes) throws Exception {
//         try {
//             ByteBuffer buf = ByteBuffer.wrap(bytes);
//             Varint32 vint = new Varint32(buf);
//             int protoTypeNum = vint.read();
//             buf = vint.getByteBuffer();
//             byte[] message = new byte[buf.remaining()];
//             buf.get(message);
//             Method m = numToMethod.get(protoTypeNum);
//             if (m == null) {
//                 return Failure.newBuilder().setCode(BAD_REQUEST.getCode())
//                         .setMsg("proto_type=" + protoTypeNum).build();
//             }
//             return m.invoke(null, message);
//         } catch (Exception e) {
//             return Failure.newBuilder().setCode(BAD_REQUEST.getCode())
//                     .setMsg(UNRECOGNIZED_PROTOCOL_MSG).build();
//         }
//     }
// 
//     public byte[] write(Object proto) throws IOException {
//         Message msg = (Message) proto;
//         String protoName = msg.getDescriptorForType().getFullName();
//         Integer num = protoToNum.get(protoName);
//         if(num == null){
//             throw new IllegalArgumentException("Could not find protoType mapping for " + protoName);
//         }
//         byte[] msgBytes = msg.toByteArray();
//         Varint32 vint = new Varint32(num);
//         int vsize = vint.getSize();
//         byte[] bytes = new byte[vsize + msgBytes.length];
//         System.arraycopy(vint.write(), 0, bytes, 0, vsize);
//         System.arraycopy(msgBytes, 0, bytes, vsize, msgBytes.length);
//         return bytes;
//     }
// }


import org.deephacks.westty.protobuf.ProtobufSerializer;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Singleton;
package org.deephacks.westty.internal.protobuf;



@Singleton
class ProtobufProducer {

    @Inject
    private ProtobufExtension extension;

    @Produces
    @Singleton
// Path: westty-protobuf/src/main/java/org/deephacks/westty/protobuf/ProtobufSerializer.java
// @Alternative
// public class ProtobufSerializer {
//     private static final Logger log = LoggerFactory.getLogger(ProtobufSerializer.class);
//     private HashMap<Integer, Method> numToMethod = new HashMap<>();
//     private HashMap<String, Integer> protoToNum = new HashMap<>();
//     private static final String UNRECOGNIZED_PROTOCOL_MSG = "Unrecognized protocol.";
// 
//     public ProtobufSerializer() {
//         registerResource("META-INF/failure.desc");
//         registerResource("META-INF/void.desc");
//     }
// 
//     public void register(URL protodesc) {
//         try {
//             registerDesc(protodesc.getFile(), protodesc.openStream());
//         } catch (IOException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public void register(File protodesc) {
//         try {
//             registerDesc(protodesc.getName(), new FileInputStream(protodesc));
//         } catch (FileNotFoundException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public void registerResource(String protodesc) {
//         URL url = Thread.currentThread().getContextClassLoader().getResource(protodesc);
//         register(url);
//     }
// 
//     private void registerDesc(String name, InputStream in) {
//         try {
//             FileDescriptorSet descriptorSet = FileDescriptorSet.parseFrom(in);
//             for (FileDescriptorProto fdp : descriptorSet.getFileList()) {
//                 FileDescriptor fd = FileDescriptor.buildFrom(fdp, new FileDescriptor[] {});
// 
//                 for (Descriptor desc : fd.getMessageTypes()) {
//                     FieldDescriptor fdesc = desc.findFieldByName("protoType");
//                     if (fdesc == null) {
//                         throw new IllegalArgumentException(name
//                                 + ".proto file must define protoType field "
//                                 + "with unqiue number that identify proto type");
//                     }
//                     String packageName = fdp.getOptions().getJavaPackage();
// 
//                     if (Strings.isNullOrEmpty(packageName)) {
//                         throw new IllegalArgumentException(name
//                                 + ".proto file must define java_package");
//                     }
//                     String simpleClassName = fdp.getOptions().getJavaOuterClassname();
//                     if (Strings.isNullOrEmpty(simpleClassName)) {
//                         throw new IllegalArgumentException(name
//                                 + " .proto file must define java_outer_classname");
//                     }
// 
//                     String className = packageName + "." + simpleClassName + "$" + desc.getName();
//                     Class<?> cls = Thread.currentThread().getContextClassLoader()
//                             .loadClass(className);
//                     protoToNum.put(desc.getFullName(), fdesc.getNumber());
//                     numToMethod.put(fdesc.getNumber(), cls.getMethod("parseFrom", byte[].class));
//                     log.debug("Registered protobuf resource {}.", name);
//                 }
//             }
//         } catch (Exception e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     public Object read(byte[] bytes) throws Exception {
//         try {
//             ByteBuffer buf = ByteBuffer.wrap(bytes);
//             Varint32 vint = new Varint32(buf);
//             int protoTypeNum = vint.read();
//             buf = vint.getByteBuffer();
//             byte[] message = new byte[buf.remaining()];
//             buf.get(message);
//             Method m = numToMethod.get(protoTypeNum);
//             if (m == null) {
//                 return Failure.newBuilder().setCode(BAD_REQUEST.getCode())
//                         .setMsg("proto_type=" + protoTypeNum).build();
//             }
//             return m.invoke(null, message);
//         } catch (Exception e) {
//             return Failure.newBuilder().setCode(BAD_REQUEST.getCode())
//                     .setMsg(UNRECOGNIZED_PROTOCOL_MSG).build();
//         }
//     }
// 
//     public byte[] write(Object proto) throws IOException {
//         Message msg = (Message) proto;
//         String protoName = msg.getDescriptorForType().getFullName();
//         Integer num = protoToNum.get(protoName);
//         if(num == null){
//             throw new IllegalArgumentException("Could not find protoType mapping for " + protoName);
//         }
//         byte[] msgBytes = msg.toByteArray();
//         Varint32 vint = new Varint32(num);
//         int vsize = vint.getSize();
//         byte[] bytes = new byte[vsize + msgBytes.length];
//         System.arraycopy(vint.write(), 0, bytes, 0, vsize);
//         System.arraycopy(msgBytes, 0, bytes, vsize, msgBytes.length);
//         return bytes;
//     }
// }


// Path: westty-protobuf/src/main/java/org/deephacks/westty/internal/protobuf/ProtobufProducer.java
import org.deephacks.westty.protobuf.ProtobufSerializer;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Singleton;

package org.deephacks.westty.internal.protobuf;



@Singleton
class ProtobufProducer {

    @Inject
    private ProtobufExtension extension;

    @Produces
    @Singleton
    public ProtobufSerializer produceSerializer(){