package com.netflix.eureka.resources; import com.netflix.appinfo.EurekaAccept; import com.netflix.discovery.converters.wrappers.CodecWrapper; import com.netflix.discovery.converters.wrappers.CodecWrappers; import com.netflix.discovery.converters.wrappers.EncoderWrapper; import com.netflix.eureka.EurekaServerConfig; import com.netflix.eureka.registry.Key; import javax.inject.Inject; import javax.inject.Singleton; /** * @author David Liu */ @Singleton public class DefaultServerCodecs implements ServerCodecs { protected final CodecWrapper fullJsonCodec; protected final CodecWrapper compactJsonCodec; protected final CodecWrapper fullXmlCodec; protected final CodecWrapper compactXmlCodec; private static CodecWrapper getFullJson(EurekaServerConfig serverConfig) { CodecWrapper codec = CodecWrappers.getCodec(serverConfig.getJsonCodecName()); return codec == null ? CodecWrappers.getCodec(CodecWrappers.LegacyJacksonJson.class) : codec; } private static CodecWrapper getFullXml(EurekaServerConfig serverConfig) { CodecWrapper codec = CodecWrappers.getCodec(serverConfig.getXmlCodecName()); return codec == null ? CodecWrappers.getCodec(CodecWrappers.XStreamXml.class) : codec; } @Inject public DefaultServerCodecs(EurekaServerConfig serverConfig) { this ( getFullJson(serverConfig), CodecWrappers.getCodec(CodecWrappers.JacksonJsonMini.class), getFullXml(serverConfig), CodecWrappers.getCodec(CodecWrappers.JacksonXmlMini.class) ); } protected DefaultServerCodecs(CodecWrapper fullJsonCodec, CodecWrapper compactJsonCodec, CodecWrapper fullXmlCodec, CodecWrapper compactXmlCodec) { this.fullJsonCodec = fullJsonCodec; this.compactJsonCodec = compactJsonCodec; this.fullXmlCodec = fullXmlCodec; this.compactXmlCodec = compactXmlCodec; } @Override public CodecWrapper getFullJsonCodec() { return fullJsonCodec; } @Override public CodecWrapper getCompactJsonCodec() { return compactJsonCodec; } @Override public CodecWrapper getFullXmlCodec() { return fullXmlCodec; } @Override public CodecWrapper getCompactXmlCodecr() { return compactXmlCodec; } @Override public EncoderWrapper getEncoder(Key.KeyType keyType, boolean compact) { switch (keyType) { case JSON: return compact ? compactJsonCodec : fullJsonCodec; case XML: default: return compact ? compactXmlCodec : fullXmlCodec; } } @Override public EncoderWrapper getEncoder(Key.KeyType keyType, EurekaAccept eurekaAccept) { switch (eurekaAccept) { case compact: return getEncoder(keyType, true); case full: default: return getEncoder(keyType, false); } } public static Builder builder() { return new Builder(); } public static class Builder { protected CodecWrapper fullJsonCodec; protected CodecWrapper compactJsonCodec; protected CodecWrapper fullXmlCodec; protected CodecWrapper compactXmlCodec; protected Builder() {} public Builder withFullJsonCodec(CodecWrapper fullJsonCodec) { this.fullJsonCodec = fullJsonCodec; return this; } public Builder withCompactJsonCodec(CodecWrapper compactJsonCodec) { this.compactJsonCodec = compactJsonCodec; return this; } public Builder withFullXmlCodec(CodecWrapper fullXmlCodec) { this.fullXmlCodec = fullXmlCodec; return this; } public Builder withCompactXmlCodec(CodecWrapper compactXmlEncoder) { this.compactXmlCodec = compactXmlEncoder; return this; } public Builder withEurekaServerConfig(EurekaServerConfig config) { fullJsonCodec = CodecWrappers.getCodec(config.getJsonCodecName()); fullXmlCodec = CodecWrappers.getCodec(config.getXmlCodecName()); return this; } public ServerCodecs build() { if (fullJsonCodec == null) { fullJsonCodec = CodecWrappers.getCodec(CodecWrappers.LegacyJacksonJson.class); } if (compactJsonCodec == null) { compactJsonCodec = CodecWrappers.getCodec(CodecWrappers.JacksonJsonMini.class); } if (fullXmlCodec == null) { fullXmlCodec = CodecWrappers.getCodec(CodecWrappers.XStreamXml.class); } if (compactXmlCodec == null) { compactXmlCodec = CodecWrappers.getCodec(CodecWrappers.JacksonXmlMini.class); } return new DefaultServerCodecs( fullJsonCodec, compactJsonCodec, fullXmlCodec, compactXmlCodec ); } } }