001// Licensed under the Apache License, Version 2.0 (the "License"); 002// you may not use this file except in compliance with the License. 003// You may obtain a copy of the License at 004// 005// http://www.apache.org/licenses/LICENSE-2.0 006// 007// Unless required by applicable law or agreed to in writing, software 008// distributed under the License is distributed on an "AS IS" BASIS, 009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 010// See the License for the specific language governing permissions and 011// limitations under the License. 012package org.apache.tapestry5.rest.jackson.internal; 013 014import java.io.IOException; 015import java.io.PrintWriter; 016 017import org.apache.tapestry5.http.ContentType; 018import org.apache.tapestry5.http.TapestryHttpSymbolConstants; 019import org.apache.tapestry5.http.services.Response; 020import org.apache.tapestry5.internal.InternalConstants; 021import org.apache.tapestry5.ioc.annotations.Symbol; 022import org.apache.tapestry5.jacksondatabind.services.ObjectMapperSource; 023import org.apache.tapestry5.services.ComponentEventResultProcessor; 024import org.apache.tapestry5.services.rest.MappedEntityManager; 025 026import com.fasterxml.jackson.databind.ObjectMapper; 027 028/** 029 * Handles mapped entity class instances using Jackson Databind 030 * when they're returned by event handler methods. It uses the {@link ObjectMapper} 031 * instance provided by {@link ObjectMapperSource}. 032 * 033 * @see MappedEntityManager 034 * @see ObjectMapperSource 035 * @since 5.8.0 036 */ 037public class JacksonComponentEventResultProcessor<T> implements ComponentEventResultProcessor<T> { 038 039 private final Response response; 040 041 private final ContentType contentType; 042 043 private final ObjectMapperSource objectMapperSource; 044 045 private final Class<T> entityClass; 046 047 public JacksonComponentEventResultProcessor(Class<T> entityClass, Response response, 048 @Symbol(TapestryHttpSymbolConstants.CHARSET) String outputEncoding, 049 ObjectMapperSource objectMapperSource) 050 { 051 this.response = response; 052 this.objectMapperSource = objectMapperSource; 053 this.entityClass = entityClass; 054 contentType = new ContentType(InternalConstants.JSON_MIME_TYPE).withCharset(outputEncoding); 055 } 056 057 public void processResultValue(T object) throws IOException { 058 PrintWriter pw = response.getPrintWriter(contentType.toString()); 059 pw.write(objectMapperSource.get(entityClass).writeValueAsString(object)); 060 pw.close(); 061 } 062}