/** * Registers an enum. Returns true if registration is successful. */ public <T extends Enum<T>> boolean registerEnum(Class<T> enumClass) { return null == enumMapping.putIfAbsent(enumClass.getName(), EnumIO.newEnumIO(enumClass, this)); }
/** * Writes the {@link Enum} to the output. */ public void writeTo(Output output, int number, boolean repeated, Enum<?> e) throws IOException { if (0 == (IdStrategy.ENUMS_BY_NAME & strategy.flags)) output.writeEnum(number, getTag(e), repeated); else output.writeString(number, getAlias(e), repeated); }
@Override @SuppressWarnings("unchecked") public <K, V> Map<K, V> newMessage() { return (Map<K, V>) eio.newEnumMap(); }
throw new ProtostuffException("Corrupt input."); value = eio.readFrom(input); break; final Collection<?> es = strategy.resolveEnumFrom(input).newEnumSet(); final Map<?, Object> em = strategy.resolveEnumFrom(input).newEnumMap();
eio.writeTo(output, ID_ENUM_VALUE, false, (Enum<?>) value); return; eio.writeTo(output, ID_ENUM_VALUE, false, (Enum<?>) value); return; EnumIO.getKeyTypeFromEnumMap(value)); EnumIO.getElementTypeFromEnumSet(value));
@Override @SuppressWarnings("unchecked") public <V> Collection<V> newMessage() { return (Collection<V>) eio.newEnumSet(); }
.getEnumIO(enumType).getEnumSetFactory(), enumType, strategy);
/** * Returns the factory for an EnumMap (lazy). */ public MapSchema.MessageFactory getEnumMapFactory() { MapSchema.MessageFactory enumMapFactory = this.enumMapFactory; if (enumMapFactory == null) { synchronized (this) { if ((enumMapFactory = this.enumMapFactory) == null) this.enumMapFactory = enumMapFactory = newEnumMapFactory(this); } } return enumMapFactory; }
@SuppressWarnings("unchecked") static void writeObjectTo(Output output, Object value, Schema<?> currentSchema, IdStrategy strategy) throws IOException { if (Collections.class == value.getClass().getDeclaringClass()) { writeNonPublicMapTo(output, value, currentSchema, strategy); return; } Class<Object> clazz = (Class<Object>) value.getClass(); if (EnumMap.class.isAssignableFrom(clazz)) { strategy.writeEnumIdTo(output, ID_ENUM_MAP, EnumIO.getKeyTypeFromEnumMap(value)); // TODO use enum schema } else { strategy.writeMapIdTo(output, ID_MAP, clazz); } if (output instanceof StatefulOutput) { // update using the derived schema. ((StatefulOutput) output).updateLast(strategy.MAP_SCHEMA, currentSchema); } strategy.MAP_SCHEMA.writeTo(output, (Map<Object, Object>) value); }
@SuppressWarnings("unchecked") static void writeObjectTo(Output output, Object value, Schema<?> currentSchema, IdStrategy strategy) throws IOException { if (Collections.class == value.getClass().getDeclaringClass()) { writeNonPublicCollectionTo(output, value, currentSchema, strategy); return; } if (EnumSet.class.isAssignableFrom(value.getClass())) { strategy.writeEnumIdTo(output, ID_ENUM_SET, EnumIO.getElementTypeFromEnumSet(value)); // TODO optimize } else { strategy.writeCollectionIdTo(output, ID_COLLECTION, value.getClass()); } if (output instanceof StatefulOutput) { // update using the derived schema. ((StatefulOutput) output).updateLast(strategy.COLLECTION_SCHEMA, currentSchema); } strategy.COLLECTION_SCHEMA.writeTo(output, (Collection<Object>) value); }
throw new ProtostuffException("Corrupt input."); value = eio.readFrom(input); break; final Collection<?> es = strategy.resolveEnumFrom(input).newEnumSet(); final Map<?, Object> em = strategy.resolveEnumFrom(input).newEnumMap();
eio.writeTo(output, ID_ENUM_VALUE, false, (Enum<?>) value); return; eio.writeTo(output, ID_ENUM_VALUE, false, (Enum<?>) value); return; EnumIO.getKeyTypeFromEnumMap(value)); EnumIO.getElementTypeFromEnumSet(value));
@Override @SuppressWarnings("unchecked") public <V> Collection<V> newMessage() { return (Collection<V>) eio.newEnumSet(); }
.getEnumIO(enumType).getEnumSetFactory(), enumType, strategy);
/** * Returns the factory for an EnumMap (lazy). */ public MapSchema.MessageFactory getEnumMapFactory() { MapSchema.MessageFactory enumMapFactory = this.enumMapFactory; if (enumMapFactory == null) { synchronized (this) { if ((enumMapFactory = this.enumMapFactory) == null) this.enumMapFactory = enumMapFactory = newEnumMapFactory(this); } } return enumMapFactory; }
@SuppressWarnings("unchecked") static void writeObjectTo(Output output, Object value, Schema<?> currentSchema, IdStrategy strategy) throws IOException { if (Collections.class == value.getClass().getDeclaringClass()) { writeNonPublicMapTo(output, value, currentSchema, strategy); return; } Class<Object> clazz = (Class<Object>) value.getClass(); if (EnumMap.class.isAssignableFrom(clazz)) { strategy.writeEnumIdTo(output, ID_ENUM_MAP, EnumIO.getKeyTypeFromEnumMap(value)); // TODO use enum schema } else { strategy.writeMapIdTo(output, ID_MAP, clazz); } if (output instanceof StatefulOutput) { // update using the derived schema. ((StatefulOutput) output).updateLast(strategy.MAP_SCHEMA, currentSchema); } strategy.MAP_SCHEMA.writeTo(output, (Map<Object, Object>) value); }
@SuppressWarnings("unchecked") static void writeObjectTo(Output output, Object value, Schema<?> currentSchema, IdStrategy strategy) throws IOException { if (Collections.class == value.getClass().getDeclaringClass()) { writeNonPublicCollectionTo(output, value, currentSchema, strategy); return; } if (EnumSet.class.isAssignableFrom(value.getClass())) { strategy.writeEnumIdTo(output, ID_ENUM_SET, EnumIO.getElementTypeFromEnumSet(value)); // TODO optimize } else { strategy.writeCollectionIdTo(output, ID_COLLECTION, value.getClass()); } if (output instanceof StatefulOutput) { // update using the derived schema. ((StatefulOutput) output).updateLast(strategy.COLLECTION_SCHEMA, currentSchema); } strategy.COLLECTION_SCHEMA.writeTo(output, (Collection<Object>) value); }
/** * Registers an enum. Returns true if registration is successful. */ public <T extends Enum<T>> boolean registerEnum(Class<T> enumClass) { return null == enumMapping.putIfAbsent(enumClass.getName(), EnumIO.newEnumIO(enumClass, this)); }