Search in sources :

Example 11 with PMap

use of net.morimekta.providence.descriptor.PMap in project providence by morimekta.

the class JacksonMessageFormatter method appendReadValue.

private void appendReadValue(JField field) throws GeneratorException {
    switch(field.type()) {
        case MAP:
            {
                PMap mType = (PMap) field.field().getDescriptor();
                PDescriptor kType = mType.keyDescriptor();
                writer.formatln("%s kType = ctxt.getTypeFactory().constructSimpleType(%s.class, null);", JavaType.class.getName(), helper.getFieldType(kType));
                PDescriptor iType = mType.itemDescriptor();
                if (iType instanceof PMap) {
                    PMap imType = (PMap) iType;
                    PDescriptor ikType = imType.keyDescriptor();
                    PDescriptor iiType = imType.itemDescriptor();
                    if (iiType instanceof PContainer) {
                        throw new GeneratorException("Too many levels of containers: " + field.toString());
                    }
                    // double level of container...
                    writer.formatln("%s iType = ctxt.getTypeFactory().constructMapType(%s.class, %s.class, %s.class);", MapType.class.getName(), HashMap.class.getName(), helper.getFieldType(ikType), helper.getFieldType(iiType));
                } else if (iType instanceof PContainer) {
                    PContainer icType = (PContainer) iType;
                    PDescriptor iiType = icType.itemDescriptor();
                    if (iiType instanceof PContainer) {
                        throw new GeneratorException("Too many levels of containers: " + field.toString());
                    }
                    // double level of container...
                    writer.formatln("%s iType = ctxt.getTypeFactory().constructArrayType(%s.class);", MapType.class.getName(), helper.getFieldType(iiType));
                } else {
                    writer.formatln("%s iType = ctxt.getTypeFactory().constructSimpleType(%s.class, null);", JavaType.class.getName(), helper.getFieldType(iType));
                }
                writer.formatln("%s type = ctxt.getTypeFactory().constructMapType(%s.class, kType, iType);", MapType.class.getName(), HashMap.class.getName());
                writer.formatln("builder.%s(ctxt.readValue(jp, type));", field.setter());
                break;
            }
        case SET:
        case LIST:
            {
                PContainer cType = (PContainer) field.field().getDescriptor();
                PDescriptor iType = cType.itemDescriptor();
                if (iType instanceof PMap) {
                    PMap imType = (PMap) iType;
                    PDescriptor ikType = imType.keyDescriptor();
                    PDescriptor iiType = imType.itemDescriptor();
                    // double level of container...
                    writer.formatln("%s itype = ctxt.getTypeFactory().constructMapType(%s.class, %s.class, %s.class);", MapType.class.getName(), LinkedHashMap.class.getName(), helper.getFieldType(ikType), helper.getFieldType(iiType));
                    writer.formatln("%s type = ctxt.getTypeFactory().constructArrayType(itype);", ArrayType.class.getName(), helper.getFieldType(iType));
                    writer.formatln("builder.%s(%s.asList(ctxt.readValue(jp, type)));", field.setter(), Arrays.class.getName());
                } else if (iType instanceof PContainer) {
                    PContainer icType = (PContainer) iType;
                    PDescriptor iiType = icType.itemDescriptor();
                    // double level of container...
                    writer.formatln("%s itype = ctxt.getTypeFactory().constructArrayType(%s.class);", ArrayType.class.getName(), helper.getFieldType(iiType));
                    writer.formatln("%s type = ctxt.getTypeFactory().constructArrayType(itype);", ArrayType.class.getName(), helper.getFieldType(iType));
                    writer.formatln("builder.%s(%s.asList(ctxt.readValue(jp, type)));", field.setter(), Arrays.class.getName());
                } else {
                    writer.formatln("%s type = ctxt.getTypeFactory().constructArrayType(%s.class);", ArrayType.class.getName(), helper.getFieldType(iType));
                    writer.formatln("builder.%s(%s.asList(ctxt.readValue(jp, type)));", field.setter(), Arrays.class.getName());
                }
                break;
            }
        case BINARY:
        case STRING:
        case MESSAGE:
        case ENUM:
            writer.formatln("builder.%s(ctxt.readValue(jp, %s.class));", field.setter(), field.instanceType());
            break;
        default:
            writer.formatln("builder.%s(ctxt.readValue(jp, %s.TYPE));", field.setter(), field.instanceType());
            break;
    }
}
Also used : ArrayType(com.fasterxml.jackson.databind.type.ArrayType) PDescriptor(net.morimekta.providence.descriptor.PDescriptor) JavaType(com.fasterxml.jackson.databind.JavaType) PContainer(net.morimekta.providence.descriptor.PContainer) PMap(net.morimekta.providence.descriptor.PMap) GeneratorException(net.morimekta.providence.generator.GeneratorException) Arrays(java.util.Arrays) MapType(com.fasterxml.jackson.databind.type.MapType)

Example 12 with PMap

use of net.morimekta.providence.descriptor.PMap in project providence by morimekta.

the class JField method getProvider.

public String getProvider() throws GeneratorException {
    String container = field.getAnnotationValue("container");
    String containerProvider = "provider";
    if (container != null) {
        ThriftContainer containerType = ThriftContainer.forName(container);
        switch(containerType) {
            case DEFAULT:
                containerProvider = "provider";
                break;
            case SORTED:
                containerProvider = "sortedProvider";
                break;
            case ORDERED:
                containerProvider = "orderedProvider";
                break;
            default:
                break;
        }
    }
    switch(field.getType()) {
        case ENUM:
        case MESSAGE:
            return String.format(Locale.US, "%s.provider()", helper.getFieldType(field.getDescriptor()));
        case LIST:
            PList<?> lType = (PList<?>) field.getDescriptor();
            return String.format(Locale.US, "%s.provider(%s)", PList.class.getName(), helper.getProviderName(lType.itemDescriptor()));
        case SET:
            PSet<?> sType = (PSet<?>) field.getDescriptor();
            return String.format(Locale.US, "%s.%s(%s)", PSet.class.getName(), containerProvider, helper.getProviderName(sType.itemDescriptor()));
        case MAP:
            PMap<?, ?> mType = (PMap<?, ?>) field.getDescriptor();
            return String.format(Locale.US, "%s.%s(%s,%s)", PMap.class.getName(), containerProvider, helper.getProviderName(mType.keyDescriptor()), helper.getProviderName(mType.itemDescriptor()));
        default:
            if (!(field.getDescriptor() instanceof PPrimitive)) {
                throw new IllegalArgumentException("Unhandled type group " + field.getType());
            }
            return String.format(Locale.US, "%s.%s.provider()", PPrimitive.class.getName(), field.getDescriptor().getName().toUpperCase(Locale.US));
    }
}
Also used : ThriftContainer(net.morimekta.providence.util.ThriftContainer) PList(net.morimekta.providence.descriptor.PList) PSet(net.morimekta.providence.descriptor.PSet) PMap(net.morimekta.providence.descriptor.PMap) PPrimitive(net.morimekta.providence.descriptor.PPrimitive)

Aggregations

PMap (net.morimekta.providence.descriptor.PMap)12 PList (net.morimekta.providence.descriptor.PList)6 PSet (net.morimekta.providence.descriptor.PSet)6 Map (java.util.Map)4 PDescriptor (net.morimekta.providence.descriptor.PDescriptor)4 PEnumDescriptor (net.morimekta.providence.descriptor.PEnumDescriptor)4 PEnumValue (net.morimekta.providence.PEnumValue)3 PMessageBuilder (net.morimekta.providence.PMessageBuilder)3 PContainer (net.morimekta.providence.descriptor.PContainer)3 LinkedHashMap (java.util.LinkedHashMap)2 PEnumBuilder (net.morimekta.providence.PEnumBuilder)2 PMessage (net.morimekta.providence.PMessage)2 ProvidenceConfigException (net.morimekta.providence.config.ProvidenceConfigException)2 PDescriptorProvider (net.morimekta.providence.descriptor.PDescriptorProvider)2 PMessageDescriptor (net.morimekta.providence.descriptor.PMessageDescriptor)2 SerializerException (net.morimekta.providence.serializer.SerializerException)2 TokenizerException (net.morimekta.providence.serializer.pretty.TokenizerException)2 TList (org.apache.thrift.protocol.TList)2 TMap (org.apache.thrift.protocol.TMap)2 TSet (org.apache.thrift.protocol.TSet)2