/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.fuseki.servlets;
import java.io.IOException ;
import java.io.PrintWriter ;
import javax.servlet.ServletOutputStream ;
import javax.servlet.http.HttpServletResponse ;
import org.apache.jena.atlas.json.JSON ;
import org.apache.jena.atlas.json.JsonValue ;
import org.apache.jena.fuseki.servlets.UploadDetails.PreState ;
import org.apache.jena.riot.WebContent ;
import org.apache.jena.riot.web.HttpNames ;
import org.apache.jena.web.HttpSC ;
public class ServletOps {
public static void responseSendError(HttpServletResponse response, int statusCode, String message) {
try {
response.sendError(statusCode, message) ;
} catch (IOException ex) {
errorOccurred(ex) ;
} catch (IllegalStateException ex) {}
}
public static void responseSendError(HttpServletResponse response, int statusCode) {
try {
response.sendError(statusCode) ;
} catch (IOException ex) {
errorOccurred(ex) ;
}
}
public static void successNoContent(HttpAction action) {
success(action, HttpSC.NO_CONTENT_204) ;
}
public static void success(HttpAction action) {
success(action, HttpSC.OK_200) ;
}
public static void successCreated(HttpAction action) {
success(action, HttpSC.CREATED_201) ;
}
// When 404 is no big deal e.g. HEAD
public static void successNotFound(HttpAction action) {
success(action, HttpSC.NOT_FOUND_404) ;
}
//
public static void success(HttpAction action, int httpStatusCode) {
action.response.setStatus(httpStatusCode) ;
}
public static void successPage(HttpAction action, String message) {
try {
action.response.setContentType("text/html") ;
action.response.setStatus(HttpSC.OK_200) ;
PrintWriter out = action.response.getWriter() ;
out.println("<html>") ;
out.println("<head>") ;
out.println("</head>") ;
out.println("<body>") ;
out.println("<h1>Success</h1>") ;
if ( message != null ) {
out.println("<p>") ;
out.println(message) ;
out.println("</p>") ;
}
out.println("</body>") ;
out.println("</html>") ;
out.flush() ;
} catch (IOException ex) {
errorOccurred(ex) ;
}
}
public static void warning(HttpAction action, String string) {
action.log.warn(string) ;
}
public static void warning(HttpAction action, String string, Throwable thorwable) {
action.log.warn(string, thorwable) ;
}
public static void errorBadRequest(String string) {
error(HttpSC.BAD_REQUEST_400, string) ;
}
public static void errorNotFound(String string) {
error(HttpSC.NOT_FOUND_404, string) ;
}
public static void errorNotImplemented(String msg) {
error(HttpSC.NOT_IMPLEMENTED_501, msg) ;
}
public static void errorMethodNotAllowed(String method) {
errorMethodNotAllowed(method, "HTTP method not allowed: " + method) ;
}
public static void errorMethodNotAllowed(String method, String msg) {
error(HttpSC.METHOD_NOT_ALLOWED_405, msg) ;
}
public static void errorForbidden() {
error(HttpSC.FORBIDDEN_403, "Forbidden") ;
}
public static void errorForbidden(String msg) {
if ( msg != null )
error(HttpSC.FORBIDDEN_403, msg) ;
else
errorForbidden() ;
}
public static void error(int statusCode) {
throw new ActionErrorException(null, null, statusCode) ;
}
public static void error(int statusCode, String string) {
throw new ActionErrorException(null, string, statusCode) ;
}
public static void errorOccurred(String message) {
errorOccurred(message, null) ;
}
public static void errorOccurred(Throwable ex) {
errorOccurred(null, ex) ;
}
public static void errorOccurred(String message, Throwable ex) {
throw new ActionErrorException(ex, message, HttpSC.INTERNAL_SERVER_ERROR_500) ;
}
public static String formatForLog(String string) {
if ( string == null )
return "<null>" ;
string = string.replace('\n', ' ') ;
string = string.replace('\r', ' ') ;
return string ;
}
public static void setNoCache(HttpAction action) {
setNoCache(action.response) ;
}
public static void setNoCache(HttpServletResponse response) {
response.setHeader(HttpNames.hCacheControl, "must-revalidate,no-cache,no-store");
response.setHeader(HttpNames.hPragma, "no-cache");
}
/** Send a JSON value as a 200 response. Null object means no response body and no content-type headers. */
public static void sendJsonReponse(HttpAction action, JsonValue v) {
if ( v == null ) {
ServletOps.success(action);
//ServletOps.successNoContent(action);
return ;
}
ServletOps.success(action);
sendJson(action, v) ;
}
/** Send a JSON value as a 200 response. Null object means no response body and no content-type headers. */
public static void sendJson(HttpAction action, JsonValue v) {
if ( v == null )
return ;
try {
HttpServletResponse response = action.response ;
ServletOutputStream out = response.getOutputStream() ;
response.setContentType(WebContent.contentTypeJSON);
response.setCharacterEncoding(WebContent.charsetUTF8) ;
JSON.write(out, v) ;
out.println() ;
out.flush() ;
} catch (IOException ex) { ServletOps.errorOccurred(ex) ; }
}
/** response to a upload operation of some kind. */
public static void uploadResponse(HttpAction action, UploadDetails details) {
if ( details.getExistedBefore().equals(PreState.ABSENT) )
ServletOps.successCreated(action) ;
else
ServletOps.success(action) ; // successNoContent if empty body.
JsonValue v = details.detailsJson() ;
ServletOps.sendJson(action, v) ;
}
}