private MapDataSchema parseMap(MapDeclarationContext map) throws ParseException { TypeAssignmentContext keyType = map.typeParams.key; TypeAssignmentContext valueType = map.typeParams.value; MapDataSchema schema = new MapDataSchema(toDataSchema(valueType)); Map<String, Object> propsToAdd = new HashMap<String, Object>(); if (keyType.typeReference() != null) { String typeName = keyType.typeReference().value; // TODO(jbetz): // Replace with https://github.com/coursera/courier/tree/with-restli-upstream-fixes // once https://github.com/linkedin/rest.li/pull/61 is accepted. if (!typeName.equals("string")) { String qualifiedKeyName = computeFullName(typeName); propsToAdd.put("keys", qualifiedKeyName); } } else if (keyType.typeDeclaration() != null) { DataSchema keySchema = parseType(keyType.typeDeclaration()); String json = SchemaToJsonEncoder.schemaToJson(keySchema, JsonBuilder.Pretty.COMPACT); try { DataMap dataMap = codec.stringToMap(json); propsToAdd.put("keys", dataMap); } catch (IOException e) { startErrorMessage(map) .append("Unexpected error parsing map: ").append(e.getMessage()).append("\n"); } } schema.setProperties(propsToAdd); return schema; }
@Override public RecordDataSchema schema() { synchronized (this) { // Don't use double-checked locking because _schema isn't volatile if (_schema == null) { final StringBuilder errorMessageBuilder = new StringBuilder(10); final Name elementSchemaName = new Name(_valueClass.getSimpleName(), errorMessageBuilder); final MapDataSchema resultsSchema = new MapDataSchema(new RecordDataSchema(elementSchemaName, RecordDataSchema.RecordType.RECORD)); final RecordDataSchema.Field resultsField = new RecordDataSchema.Field(resultsSchema); resultsField.setName(RESULTS, errorMessageBuilder); final MapDataSchema errorsSchema = new MapDataSchema(DataTemplateUtil.getSchema(ErrorResponse.class)); final RecordDataSchema.Field errorsField = new RecordDataSchema.Field(errorsSchema); errorsField.setName(ERRORS, errorMessageBuilder); final Name name = new Name(BATCH_KV_RESPONSE_CLASSNAME, errorMessageBuilder); _schema = new RecordDataSchema(name, RecordDataSchema.RecordType.RECORD); _schema.setFields(Arrays.asList(resultsField, errorsField), errorMessageBuilder); } } return _schema; }
MapDataSchema schema = new MapDataSchema(toDataSchema(valueType)); Map<String, Object> propsToAdd = new HashMap<String, Object>();
case MAP: DataSchema valuesSchema = getSchemaData(map, VALUES_KEY); MapDataSchema mapSchema = new MapDataSchema(valuesSchema); mapSchema.setValuesDeclaredInline(isDeclaredInline(map.get(VALUES_KEY))); schema = mapSchema;
if (modifiedValuesSchema != null) modifiedSchema = new MapDataSchema(modifiedValuesSchema);