in eureka-client/src/main/java/com/netflix/discovery/converters/EurekaJacksonCodec.java [498:656]
public InstanceInfo deserialize(JsonParser jp, DeserializationContext context) throws IOException {
if (Thread.currentThread().isInterrupted()) {
throw new JsonParseException(jp, "processing aborted");
}
DeserializerStringCache intern = DeserializerStringCache.from(context);
InstanceInfo.Builder builder = InstanceInfo.Builder.newBuilder(self);
JsonToken jsonToken;
while ((jsonToken = jp.nextToken()) != JsonToken.END_OBJECT) {
InstanceInfoField instanceInfoField = InstanceInfoField.lookup.find(jp);
jsonToken = jp.nextToken();
if (instanceInfoField != null && jsonToken != JsonToken.VALUE_NULL) {
switch(instanceInfoField) {
case HOSTNAME:
builder.setHostName(intern.apply(jp));
break;
case INSTANCE_ID:
builder.setInstanceId(intern.apply(jp));
break;
case APP:
builder.setAppNameForDeser(
intern.apply(jp, CacheScope.APPLICATION_SCOPE,
()->{
try {
return jp.getText().toUpperCase();
} catch (IOException e) {
throw new RuntimeJsonMappingException(e.getMessage());
}
}));
break;
case IP:
builder.setIPAddr(intern.apply(jp));
break;
case SID:
builder.setSID(intern.apply(jp, CacheScope.GLOBAL_SCOPE));
break;
case ID_ATTR:
// nothing
break;
case STATUS:
builder.setStatus(statusLookup.find(jp, InstanceStatus.UNKNOWN));
break;
case OVERRIDDEN_STATUS:
builder.setOverriddenStatus(statusLookup.find(jp, InstanceStatus.UNKNOWN));
break;
case OVERRIDDEN_STATUS_LEGACY:
builder.setOverriddenStatus(statusLookup.find(jp, InstanceStatus.UNKNOWN));
break;
case PORT:
while ((jsonToken = jp.nextToken()) != JsonToken.END_OBJECT) {
PortField field = PortField.lookup.find(jp);
switch(field) {
case PORT:
if (jsonToken == JsonToken.FIELD_NAME) jp.nextToken();
builder.setPort(jp.getValueAsInt());
break;
case ENABLED:
if (jsonToken == JsonToken.FIELD_NAME) jp.nextToken();
builder.enablePort(PortType.UNSECURE, jp.getValueAsBoolean());
break;
default:
}
}
break;
case SECURE_PORT:
while ((jsonToken = jp.nextToken()) != JsonToken.END_OBJECT) {
PortField field = PortField.lookup.find(jp);
switch(field) {
case PORT:
if (jsonToken == JsonToken.FIELD_NAME) jp.nextToken();
builder.setSecurePort(jp.getValueAsInt());
break;
case ENABLED:
if (jsonToken == JsonToken.FIELD_NAME) jp.nextToken();
builder.enablePort(PortType.SECURE, jp.getValueAsBoolean());
break;
default:
}
}
break;
case COUNTRY_ID:
builder.setCountryId(jp.getValueAsInt());
break;
case DATACENTER:
builder.setDataCenterInfo(DeserializerStringCache.init(mapper.readerFor(DataCenterInfo.class), context).readValue(jp));
break;
case LEASE:
builder.setLeaseInfo(mapper.readerFor(LeaseInfo.class).readValue(jp));
break;
case HEALTHCHECKURL:
builder.setHealthCheckUrlsForDeser(intern.apply(jp.getText()), null);
break;
case SECHEALTHCHECKURL:
builder.setHealthCheckUrlsForDeser(null, intern.apply(jp.getText()));
break;
case APPGROUPNAME:
builder.setAppGroupNameForDeser(intern.apply(jp, CacheScope.GLOBAL_SCOPE,
()->{
try {
return jp.getText().toUpperCase();
} catch (IOException e) {
throw new RuntimeJsonMappingException(e.getMessage());
}
}));
break;
case HOMEPAGEURL:
builder.setHomePageUrlForDeser(intern.apply(jp.getText()));
break;
case STATUSPAGEURL:
builder.setStatusPageUrlForDeser(intern.apply(jp.getText()));
break;
case VIPADDRESS:
builder.setVIPAddressDeser(intern.apply(jp));
break;
case SECVIPADDRESS:
builder.setSecureVIPAddressDeser(intern.apply(jp));
break;
case ISCOORDINATINGDISCSERVER:
builder.setIsCoordinatingDiscoveryServer(jp.getValueAsBoolean());
break;
case LASTUPDATEDTS:
builder.setLastUpdatedTimestamp(jp.getValueAsLong());
break;
case LASTDIRTYTS:
builder.setLastDirtyTimestamp(jp.getValueAsLong());
break;
case ACTIONTYPE:
builder.setActionType(actionTypeLookup.find(jp.getTextCharacters(), jp.getTextOffset(), jp.getTextLength()));
break;
case ASGNAME:
builder.setASGName(intern.apply(jp));
break;
case METADATA:
Map<String, String> metadataMap = null;
while ((jsonToken = jp.nextToken()) != JsonToken.END_OBJECT) {
char[] parserChars = jp.getTextCharacters();
if (parserChars[0] == '@' && EnumLookup.equals(BUF_AT_CLASS, parserChars, jp.getTextOffset(), jp.getTextLength())) {
// skip this
jsonToken = jp.nextToken();
}
else { // For backwards compatibility
String key = intern.apply(jp, CacheScope.GLOBAL_SCOPE);
jsonToken = jp.nextToken();
String value = intern.apply(jp, CacheScope.APPLICATION_SCOPE );
metadataMap = Optional.ofNullable(metadataMap).orElseGet(METADATA_MAP_SUPPLIER);
metadataMap.put(key, value);
}
};
builder.setMetadata(metadataMap == null ? Collections.emptyMap() : metadataMap);
break;
default:
autoUnmarshalEligible(jp.getCurrentName(), jp.getValueAsString(), builder.getRawInstance());
}
}
else {
autoUnmarshalEligible(jp.getCurrentName(), jp.getValueAsString(), builder.getRawInstance());
}
}
return builder.build();
}