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;
}
}
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));
}
}
Aggregations