/** * Unwrap {@link Descriptors.EnumValueDescriptor} or a {@link Collection} to a raw {@link Enum} * If the value is neither {@link Descriptors.EnumValueDescriptor} or a {@link Collection}, the value is returned. * * @param value {@link Descriptors.EnumValueDescriptor} or a {@link Collection} * @param beanContainer {@link BeanContainer} instance * @return {@link Enum} if value is {@link Descriptors.EnumValueDescriptor}, else a {@link Collection} of {@link Enum} */ @SuppressWarnings("unchecked") public static Object unwrapEnums(Object value, BeanContainer beanContainer) { if (value instanceof Descriptors.EnumValueDescriptor) { Descriptors.EnumValueDescriptor descriptor = (Descriptors.EnumValueDescriptor)value; Class<? extends Enum> enumClass = getEnumClassByEnumDescriptor(descriptor.getType(), beanContainer); for (Enum enumValue : enumClass.getEnumConstants()) { if (((Descriptors.EnumValueDescriptor)value).getName().equals(enumValue.name())) { return enumValue; } } return null; } if (value instanceof Collection) { Collection valueCollection = (Collection)value; List modifiedList = new ArrayList(valueCollection.size()); for (Object element : valueCollection) { modifiedList.add(unwrapEnums(element, beanContainer)); } return modifiedList; } return value; }
@VisibleForTesting EnumInfo newEnumInfo(EnumDescriptor enumDescriptor) { return new EnumInfo( enumDescriptor.getFullName(), enumDescriptor.getValues().stream() .map(d -> new EnumValueInfo(d.getName())) .collect(toImmutableList())); }
private Schema getSchema(EnumDescriptor d) { List<String> symbols = new ArrayList<>(); for (EnumValueDescriptor e : d.getValues()) { symbols.add(e.getName()); } return Schema.createEnum(d.getName(), null, getNamespace(d.getFile(), d.getContainingType()), symbols); }
private void serialize(JsonGenerator jgen, EnumDescriptor enumType) throws IOException, JsonProcessingException { jgen.writeObjectField("name", enumType.getName()); jgen.writeArrayFieldStart("values"); { for (EnumValueDescriptor value : enumType.getValues()) { jgen.writeString(value.getName()); } } jgen.writeEndArray(); } }
private void generateProtoFromDescriptor(EnumValueDescriptor descriptor, Appendable out, String indent) throws IOException { out.append(indent); out.append(descriptor.getName() + " = " + descriptor.getNumber()); out.append(";\n"); }
/** * Gets the name of the enum value, for example: * <ul> * <li>org.waveprotocol.pst.examples.Example1.Person.Gender.MALE = "MALE".</li> * </ul> * * @return the name of the enum value */ public String getName() { return descriptor.getName(); }
private Schema getSchema(EnumDescriptor d) { List<String> symbols = new ArrayList<String>(); for (EnumValueDescriptor e : d.getValues()) { symbols.add(e.getName()); } return Schema.createEnum(d.getName(), null, getNamespace(d.getFile(), d.getContainingType()), symbols); }
@Override protected void writeEnum(Schema schema, Object datum, Encoder out) throws IOException { if (!(datum instanceof EnumValueDescriptor)) super.writeEnum(schema, datum, out); // punt to generic else out.writeEnum (schema.getEnumOrdinal(((EnumValueDescriptor)datum).getName())); }
generator.print(((EnumValueDescriptor) value).getName()); generator.print("\""); break;
private void serialize(JsonGenerator jgen, EnumDescriptor enumType) throws IOException { jgen.writeObjectField("name", enumType.getName()); jgen.writeArrayFieldStart("values"); for (EnumValueDescriptor value : enumType.getValues()) { jgen.writeString(value.getName()); } jgen.writeEndArray(); } }
generator.print(((EnumValueDescriptor) value).getName()); break;
generator.print(((EnumValueDescriptor) value).getName()); break;
private static void writeFieldValue(Descriptors.FieldDescriptor fieldDescriptor, Object value, JsonWriter writer) { switch (fieldDescriptor.getJavaType()) { case INT: writer.value((Integer) value); break; case LONG: writer.value((Long) value); break; case DOUBLE: writer.value((Double) value); break; case BOOLEAN: writer.value((Boolean) value); break; case STRING: writer.value((String) value); break; case ENUM: writer.value(((Descriptors.EnumValueDescriptor) value).getName()); break; case MESSAGE: writeMessageValue((Message) value, writer); break; default: throw new IllegalStateException(String.format("JSON format does not support type '%s' of field '%s'", fieldDescriptor.getJavaType(), fieldDescriptor.getName())); } }
Descriptors.EnumValueDescriptor val = enumDescriptor.findValueByNumberCreatingIfUnknown(RubyNumeric.num2int(value)); if (val.getIndex() != -1) value = context.runtime.newSymbol(val.getName());
private IRubyObject wrapField(ThreadContext context, Descriptors.FieldDescriptor fieldDescriptor, Object value) { if (value == null) { return context.runtime.getNil(); } Ruby runtime = context.runtime; switch (fieldDescriptor.getType()) { case INT32: case INT64: case UINT32: case UINT64: case FLOAT: case DOUBLE: case BOOL: case BYTES: case STRING: return Utils.wrapPrimaryValue(context, fieldDescriptor.getType(), value); case MESSAGE: RubyClass typeClass = (RubyClass) ((RubyDescriptor) getDescriptorForField(context, fieldDescriptor)).msgclass(context); RubyMessage msg = (RubyMessage) typeClass.newInstance(context, Block.NULL_BLOCK); return msg.buildFrom(context, (DynamicMessage) value); case ENUM: Descriptors.EnumValueDescriptor enumValueDescriptor = (Descriptors.EnumValueDescriptor) value; if (enumValueDescriptor.getIndex() == -1) { // UNKNOWN ENUM VALUE return runtime.newFixnum(enumValueDescriptor.getNumber()); } return runtime.newSymbol(enumValueDescriptor.getName()); default: return runtime.newString(value.toString()); } }
@Override protected void writeEnum(Schema schema, Object datum, Encoder out) throws IOException { if (!(datum instanceof EnumValueDescriptor)) super.writeEnum(schema, datum, out); // punt to generic else out.writeEnum (schema.getEnumOrdinal(((EnumValueDescriptor)datum).getName())); }
@JRubyMethod(meta = true) public static IRubyObject lookup(ThreadContext context, IRubyObject recv, IRubyObject number) { RubyEnumDescriptor rubyEnumDescriptorescriptor = (RubyEnumDescriptor) getDescriptor(context, recv); Descriptors.EnumDescriptor descriptor = rubyEnumDescriptorescriptor.getDescriptor(); Descriptors.EnumValueDescriptor value = descriptor.findValueByNumber(RubyNumeric.num2int(number)); if (value == null) return context.runtime.getNil(); return context.runtime.newSymbol(value.getName()); }
@JRubyMethod public IRubyObject each(ThreadContext context, Block block) { Ruby runtime = context.runtime; for (Descriptors.EnumValueDescriptor enumValueDescriptor : descriptor.getValues()) { block.yield(context, runtime.newArray(runtime.newSymbol(enumValueDescriptor.getName()), runtime.newFixnum(enumValueDescriptor.getNumber()))); } return runtime.getNil(); }
private RubyModule buildModuleFromDescriptor(ThreadContext context) { Ruby runtime = context.runtime; Utils.checkNameAvailability(context, name.asJavaString()); RubyModule enumModule = RubyModule.newModule(runtime); for (Descriptors.EnumValueDescriptor value : descriptor.getValues()) { enumModule.defineConstant(value.getName(), runtime.newFixnum(value.getNumber())); } enumModule.instance_variable_set(runtime.newString(Utils.DESCRIPTOR_INSTANCE_VAR), this); enumModule.defineAnnotatedMethods(RubyEnum.class); return enumModule; }