@Override public BaseMarshaller<?> getMarshaller(String typeName) { BaseMarshaller<?> m = context.get(); if (m != null && typeName.equals(m.getTypeName())) { return context.get(); } return null; }
@Override public void unregisterMarshaller(BaseMarshaller<?> marshaller) { if (marshaller == null) { throw new IllegalArgumentException("marshaller argument cannot be null"); } BaseMarshallerDelegate<?> marshallerDelegate = marshallersByName.get(marshaller.getTypeName()); if (marshallerDelegate == null || marshallerDelegate.getMarshaller() != marshaller) { throw new IllegalArgumentException("The given marshaller is not registered"); } marshallersByName.remove(marshaller.getTypeName()); marshallersByClass.remove(marshaller.getJavaClass()); }
ProtoTypeMetadata(BaseMarshaller<?> marshaller) { this.marshaller = marshaller; this.name = marshaller.getTypeName(); this.javaClass = marshaller.getJavaClass(); this.documentation = null; }
@Override public void registerMarshaller(BaseMarshaller<?> marshaller) { if (marshaller == null) { throw new IllegalArgumentException("marshaller argument cannot be null"); } BaseMarshallerDelegate<?> marshallerDelegate = makeMarshallerDelegate(marshaller); marshallersByName.put(marshaller.getTypeName(), marshallerDelegate); marshallersByClass.put(marshaller.getJavaClass(), marshallerDelegate); }
private BaseMarshallerDelegate<?> makeMarshallerDelegate(BaseMarshaller<?> marshaller) { if (marshaller.getJavaClass().isEnum() && !(marshaller instanceof EnumMarshaller)) { throw new IllegalArgumentException("Invalid marshaller (the produced class is a Java Enum but the marshaller is not an EnumMarshaller) : " + marshaller); } // we try to validate first that a message descriptor exists if (marshaller instanceof EnumMarshaller) { if (!marshaller.getJavaClass().isEnum()) { throw new IllegalArgumentException("Invalid enum marshaller (the produced class is not a Java Enum) : " + marshaller); } EnumDescriptor enumDescriptor = getEnumDescriptor(marshaller.getTypeName()); return new EnumMarshallerDelegate<>((EnumMarshaller<?>) marshaller, enumDescriptor); } else if (marshaller instanceof RawProtobufMarshaller) { return new RawProtobufMarshallerDelegate<>(this, (RawProtobufMarshaller<?>) marshaller); } Descriptor messageDescriptor = getMessageDescriptor(marshaller.getTypeName()); return new MessageMarshallerDelegate<>(this, (MessageMarshaller<?>) marshaller, messageDescriptor); }
protected ProtoTypeMetadata scanAnnotations(Class<?> javaType) { ProtoTypeMetadata protoTypeMetadata = metadataByClass.get(javaType); if (protoTypeMetadata != null) { // already seen return protoTypeMetadata; } if (serializationContext.canMarshall(javaType)) { // this is a known type, defined in another schema file that we'll need to import BaseMarshaller<?> m = serializationContext.getMarshaller(javaType); protoTypeMetadata = new ProtoTypeMetadata(m); imports.add(serializationContext.getDescriptorByName(m.getTypeName()).getFileDescriptor().getName()); } else if (javaType.isEnum()) { protoTypeMetadata = new ProtoEnumTypeMetadata((Class<? extends Enum>) javaType); } else { protoTypeMetadata = new ProtoMessageTypeMetadata(this, javaType); } defineType(protoTypeMetadata); return protoTypeMetadata; }
nestedOut.flush(); String typeName = marshallerDelegate.getMarshaller().getTypeName(); Integer typeId = ctx.getTypeIdByName(typeName); if (typeId == null) {
private static void writeMessage(ImmutableSerializationContext ctx, RawProtoStreamWriter out, MultiMessage t) throws IOException { if ( t == null ) { return; } // This is either an unknown primitive type or a message type. Try to use a message marshaller. BaseMarshallerDelegate marshallerDelegate = ( (SerializationContextImpl) ctx ).getMarshallerDelegate( t.getMessageType() ); ByteArrayOutputStreamEx buffer = new ByteArrayOutputStreamEx(); RawProtoStreamWriter nestedOut = RawProtoStreamWriterImpl.newInstance( buffer ); marshallerDelegate.marshall( null, t, null, nestedOut ); nestedOut.flush(); String typeName = marshallerDelegate.getMarshaller().getTypeName(); Integer typeId = ctx.getTypeIdByName( typeName ); if ( typeId == null ) { out.writeString( WRAPPED_DESCRIPTOR_FULL_NAME, typeName ); } else { out.writeInt32( WRAPPED_DESCRIPTOR_ID, typeId ); } out.writeBytes( WRAPPED_MESSAGE, buffer.getByteBuffer() ); out.flush(); } }