1 package org.apache.turbine.modules.screens; 2 3 /* 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 import java.io.OutputStreamWriter; 23 import java.io.PrintWriter; 24 import java.nio.charset.Charset; 25 import java.nio.charset.StandardCharsets; 26 27 import org.apache.turbine.pipeline.PipelineData; 28 import org.apache.turbine.util.RunData; 29 import org.slf4j.Logger; 30 import org.slf4j.LoggerFactory; 31 32 33 /** 34 * A Screen class for dealing with JSON requests. Typically you would 35 * extend this class and override the doOutput() method to use it by setting the JSON output into 36 * rundata.setMessage( serialized ). 37 * As convenience you may use inject in your extended class the Turbine service JsonService 38 * Use {@link PlainJSONSecureAnnotatedScreen} if you need the user to be 39 * logged in or having a special role in prior to executing the functions you provide. 40 * 41 * <p>Here is an example from a subclass: 42 * 43 * <code> 44 * 45 * 46 * public void doOutput(PipelineData pipelineData) throws Exception 47 * { 48 * RunData data = pipelineData.getRunData(); 49 * JSONStrategy strategy = null; 50 * 51 * try 52 * { 53 * strategy = new XYStrategy(); 54 * // the result goes into rundata.message 55 * strategy.execute(data, jsonService); 56 * } 57 * catch ( Exception e ) 58 * { 59 * log.error( "init failed for "+strategy , e); 60 * String msg = new JSONObject().put("error", e.getMessage()).toString(); 61 * data.setMessage( msg ); 62 * } 63 * 64 * super.doOutput(data); 65 * } 66 * </code> 67 * 68 * 69 * @author gk 70 * @version $Id$ 71 */ 72 public class PlainJSONScreen extends RawScreen 73 { 74 protected static final String JSON_TYPE = "application/json;charset=utf-8"; 75 76 protected final static int BUFFER_SIZE = 4096; 77 78 static final Logger log = LoggerFactory.getLogger(PlainJSONScreen.class); 79 80 /** Injected service instance */ 81 //@TurbineService 82 //protected JsonService jsonService; 83 84 /** 85 * @see org.apache.turbine.modules.screens.RawScreen#getContentType(org.apache.turbine.pipeline.PipelineData) 86 */ 87 @Override 88 protected String getContentType(PipelineData pipelineData) 89 { 90 return JSON_TYPE; 91 } 92 93 /** 94 * Output JSON content set into {@link RunData#getMessage()}. 95 * 96 * Encoding is UTF-8. @{@link #JSON_TYPE}: {@value #JSON_TYPE}. 97 * 98 * @param pipelineData The PipelineData object. 99 */ 100 @Override 101 protected void doOutput(PipelineData pipelineData) throws Exception 102 { 103 RunData data = pipelineData.getRunData(); 104 // read in json! 105 Charset charset = StandardCharsets.UTF_8; //request.getCharacterEncoding(); 106 107 String json_res = data.getMessage(); 108 109 log.debug( "json_res output: {}", json_res ); 110 try (PrintWriter out = new PrintWriter( 111 new OutputStreamWriter( 112 data.getResponse().getOutputStream(),charset))) 113 { 114 out.print(json_res.toString()); 115 out.flush(); 116 } 117 } 118 }