node-web-mvc
Version:
node spring mvc
62 lines (61 loc) • 3.03 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const MediaType_1 = __importDefault(require("../../http/MediaType"));
const HttpMediaTypeNotAcceptableException_1 = __importDefault(require("../../../errors/HttpMediaTypeNotAcceptableException"));
const HandlerMapping_1 = require("../../mapping/HandlerMapping");
const ALL_APPLICATION_MEDIA_TYPES = [
MediaType_1.default.ALL,
new MediaType_1.default('application'),
];
class AbstractMessageConverterMethodProcessor {
constructor(messageConverters, contentNegotiationManager) {
this.messageConverters = messageConverters;
this.contentNegotiationManager = contentNegotiationManager;
}
writeWithMessageConverters(data, servletContext) {
const mediaType = this.selectMediaType(servletContext, data);
return this.messageConverters.write(data, mediaType, servletContext);
}
readWithMessageConverters(servletContext, dataType) {
return this.messageConverters.read(servletContext, dataType);
}
getProducibleMediaTypes(servletContext, data) {
const configMediaTypes = servletContext.request.getAttribute(HandlerMapping_1.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE) || [];
if (configMediaTypes.length > 0) {
return configMediaTypes;
}
const mediaTypes = [];
const messageConverters = this.messageConverters;
messageConverters.forEach((converter) => {
if (converter.canWrite(data, null)) {
mediaTypes.push(...converter.getSupportedMediaTypes());
}
});
return mediaTypes;
}
getMostSpecifiMediaType(requestType, producibleType) {
const mediaType = producibleType.copyQualityValue(requestType);
return MediaType_1.default.specificityCompare(requestType, mediaType) <= 0 ? requestType : mediaType;
}
selectMediaType(servletContext, data) {
const requestedTypes = this.contentNegotiationManager.resolveMediaTypes(servletContext.request);
const dataType = data === null || data === void 0 ? void 0 : data.constructor;
const producibleTypes = this.getProducibleMediaTypes(servletContext, dataType);
const mediaTypesToUse = [];
for (const requestType of requestedTypes) {
for (const producibleType of producibleTypes) {
if (requestType.isCompatibleWith(producibleType)) {
mediaTypesToUse.push(this.getMostSpecifiMediaType(requestType, producibleType));
}
}
}
if (mediaTypesToUse.length < 1) {
throw new HttpMediaTypeNotAcceptableException_1.default(producibleTypes);
}
return mediaTypesToUse.find((m) => m.isConcrete || m.isPresentIn(ALL_APPLICATION_MEDIA_TYPES)) || MediaType_1.default.ALL;
}
}
exports.default = AbstractMessageConverterMethodProcessor;