protected Schema createSchema()

in avro-1.5.3/src/main/java/org/apache/avro/specific/SpecificData.java [172:231]


    protected Schema createSchema(java.lang.reflect.Type type,
                                  Map<String, Schema> names) {
        if (type instanceof Class
                && CharSequence.class.isAssignableFrom((Class) type))
            return Schema.create(Type.STRING);
        else if (type == ByteBuffer.class)
            return Schema.create(Type.BYTES);
        else if ((type == Integer.class) || (type == Integer.TYPE))
            return Schema.create(Type.INT);
        else if ((type == Long.class) || (type == Long.TYPE))
            return Schema.create(Type.LONG);
        else if ((type == Float.class) || (type == Float.TYPE))
            return Schema.create(Type.FLOAT);
        else if ((type == Double.class) || (type == Double.TYPE))
            return Schema.create(Type.DOUBLE);
        else if ((type == Boolean.class) || (type == Boolean.TYPE))
            return Schema.create(Type.BOOLEAN);
        else if ((type == Void.class) || (type == Void.TYPE))
            return Schema.create(Type.NULL);
        else if (type instanceof ParameterizedType) {
            ParameterizedType ptype = (ParameterizedType) type;
            Class raw = (Class) ptype.getRawType();
            java.lang.reflect.Type[] params = ptype.getActualTypeArguments();
            if (Collection.class.isAssignableFrom(raw)) { // array
                if (params.length != 1)
                    throw new AvroTypeException("No array type specified.");
                return Schema.createArray(createSchema(params[0], names));
            } else if (Map.class.isAssignableFrom(raw)) {   // map
                java.lang.reflect.Type key = params[0];
                java.lang.reflect.Type value = params[1];
                if (!(type instanceof Class
                        && CharSequence.class.isAssignableFrom((Class) type)))
                    throw new AvroTypeException("Map key class not CharSequence: " + key);
                return Schema.createMap(createSchema(value, names));
            } else {
                return createSchema(raw, names);
            }
        } else if (type instanceof Class) {               // class
            Class c = (Class) type;
            String fullName = c.getName();
            Schema schema = names.get(fullName);
            if (schema == null)
                try {
                    schema = (Schema) (c.getDeclaredField("SCHEMA$").get(null));

                    if (!fullName.equals(getClassName(schema)))
                        // HACK: schema mismatches class. maven shade plugin? try replacing.
                        schema = Schema.parse
                                (schema.toString().replace(schema.getNamespace(),
                                        c.getPackage().getName()));
                } catch (NoSuchFieldException e) {
                    throw new AvroRuntimeException(e);
                } catch (IllegalAccessException e) {
                    throw new AvroRuntimeException(e);
                }
            names.put(fullName, schema);
            return schema;
        }
        throw new AvroTypeException("Unknown type: " + type);
    }