Class Resolver

java.lang.Object
com.cedarsoftware.util.io.Resolver
Direct Known Subclasses:
MapResolver, ObjectResolver

public abstract class Resolver extends Object
This class is used to convert a source of Java Maps that were created from the JsonParser. These are in 'raw' form with no 'pointers'. This code will reconstruct the 'shape' of the graph by connecting @ref's to @ids. The subclasses that override this class can build an object graph using Java classes or a Map-of-Map representation. In both cases, the @ref value will be replaced with the Object (or Map) that had the corresponding @id.
Author:
John DeRegnaucourt ([email protected])
Copyright (c) Cedar Software LLC

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.*
  • Field Details

  • Constructor Details

    • Resolver

      protected Resolver(ReadOptions readOptions)
  • Method Details

    • getReader

      @Deprecated protected JsonReader getReader()
      Deprecated.
    • convertMapsToObjects

      protected <T> T convertMapsToObjects(JsonObject root)
      Walk a JsonObject (Map of String keys to values) and return the Java object equivalent filled in as best as possible (everything except unresolved reference fields or unresolved array/collection elements).
      Parameters:
      root - JsonObject reference to a Map-of-Maps representation of the JSON input after it has been completely read.
      Returns:
      Properly constructed, typed, Java object graph built from a Map of Maps representation (JsonObject root).
    • readWithFactoryIfExists

      protected abstract Object readWithFactoryIfExists(Object o, Class compType, Deque<JsonObject> stack)
    • traverseFields

      public abstract void traverseFields(Deque<JsonObject> stack, JsonObject jsonObj)
    • traverseFields

      public abstract void traverseFields(Deque<JsonObject> stack, JsonObject jsonObj, Set<String> excludeFields)
    • traverseCollection

      protected abstract void traverseCollection(Deque<JsonObject> stack, JsonObject jsonObj)
    • traverseArray

      protected abstract void traverseArray(Deque<JsonObject> stack, JsonObject jsonObj)
    • cleanup

      protected void cleanup()
    • traverseMap

      protected void traverseMap(Deque<JsonObject> stack, JsonObject jsonObj)
      Process java.util.Map and it's derivatives. These are written specially so that the serialization does not expose the class internals (internal fields of TreeMap for example).
      Parameters:
      stack - a Stack (Deque) used to support graph traversal.
      jsonObj - a Map-of-Map representation of the JSON input stream.
    • convertMapToKeysItems

      protected static void convertMapToKeysItems(JsonObject map)
      Convert an input JsonObject map (known to represent a Map.class or derivative) that has regular keys and values to have its keys placed into @keys, and its values placed into @items.
      Parameters:
      map - Map to convert
    • createInstance

      protected Object createInstance(Class clazz, JsonObject jsonObj)
      This method creates a Java Object instance based on the passed in parameters. If the JsonObject contains a key '@type' then that is used, as the type was explicitly set in the JSON stream. If the key '@type' does not exist, then the passed in Class is used to create the instance, handling creating an Array or regular Object instance.
      The '@type' is not often specified in the JSON input stream, as in many cases it can be inferred from a field reference or array component type.
      Parameters:
      clazz - Instance will be create of this class.
      jsonObj - Map-of-Map representation of object to create.
      Returns:
      a new Java object of the appropriate type (clazz) using the jsonObj to provide enough hints to get the right class instantiated. It is not populated when returned.
    • createInstanceUsingType

      protected Object createInstanceUsingType(JsonObject jsonObj)
      Create an instance of a Java class using the ".type" field on the jsonObj. The clazz argument is not used for determining type, just for clarity in an exception message.
    • createInstanceUsingClass

      protected Object createInstanceUsingClass(Class clazz, JsonObject jsonObj)
      Create an instance using the Class (clazz) provided and the values in the jsonObj.
    • coerceCertainTypes

      protected Object coerceCertainTypes(String type)
    • getCustomReader

      protected JsonReader.JsonClassReader getCustomReader(Class c)
    • extractEnumSet

      protected EnumSet<?> extractEnumSet(Class c, JsonObject jsonObj)
    • patchUnresolvedReferences

      protected void patchUnresolvedReferences()
      For all fields where the value was "@ref":"n" where 'n' was the id of an object that had not yet been encountered in the stream, make the final substitution.
    • rehashMaps

      protected void rehashMaps()
      Process Maps/Sets (fix up their internal indexing structure) This is required because Maps hash items using hashCode(), which will change between VMs. Rehashing the map fixes this.
      If useMaps==true, then move @keys to keys and @items to values and then drop these two entries from the map.
      This hashes both Sets and Maps because the JDK sets are implemented as Maps. If you have a custom built Set, this would not 'treat' it and you would need to provide a custom reader for that set.