ProtoEnumKeyDeserializer.java

  1. /*
  2.  * Copyright 2017 Providence Authors
  3.  *
  4.  * Licensed to the Apache Software Foundation (ASF) under one
  5.  * or more contributor license agreements. See the NOTICE file
  6.  * distributed with this work for additional information
  7.  * regarding copyright ownership. The ASF licenses this file
  8.  * to you under the Apache License, Version 2.0 (the
  9.  * "License"); you may not use this file except in compliance
  10.  * with the License. You may obtain a copy of the License at
  11.  *
  12.  *   http://www.apache.org/licenses/LICENSE-2.0
  13.  *
  14.  * Unless required by applicable law or agreed to in writing,
  15.  * software distributed under the License is distributed on an
  16.  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  17.  * KIND, either express or implied. See the License for the
  18.  * specific language governing permissions and limitations
  19.  * under the License.
  20.  */
  21. package net.morimekta.proto.jackson.adapter;

  22. import com.fasterxml.jackson.databind.DeserializationContext;
  23. import com.fasterxml.jackson.databind.KeyDeserializer;
  24. import com.google.protobuf.ProtocolMessageEnum;
  25. import net.morimekta.proto.ProtoEnum;

  26. import java.util.regex.Pattern;

  27. /**
  28.  * Deserializes proto enums for map keys.
  29.  */
  30. public class ProtoEnumKeyDeserializer
  31.         extends KeyDeserializer {
  32.     private static final Pattern NUMERIC = Pattern.compile("(0|[1-9][0-9]*)");

  33.     private final ProtoEnum<?> descriptor;

  34.     /**
  35.      * Instantiate deserializer.
  36.      *
  37.      * @param descriptor The proto enum descriptor.
  38.      */
  39.     public ProtoEnumKeyDeserializer(ProtoEnum<?> descriptor) {
  40.         this.descriptor = descriptor;
  41.     }

  42.     @Override
  43.     public ProtocolMessageEnum deserializeKey(String key, DeserializationContext deserializationContext) {
  44.         if (NUMERIC.matcher(key).matches()) {
  45.             return descriptor.findByNumber(Integer.parseInt(key));
  46.         } else {
  47.             return descriptor.findByName(key);
  48.         }
  49.     }
  50. }