1 /*******************************************************************************
\r
2 * ============LICENSE_START====================================================
\r
4 * * ===========================================================================
\r
5 * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
\r
6 * * ===========================================================================
\r
7 * * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * * you may not use this file except in compliance with the License.
\r
9 * * You may obtain a copy of the License at
\r
11 * * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * * Unless required by applicable law or agreed to in writing, software
\r
14 * * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * * See the License for the specific language governing permissions and
\r
17 * * limitations under the License.
\r
18 * * ============LICENSE_END====================================================
\r
20 * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
\r
22 ******************************************************************************/
\r
23 package org.onap.aaf.cssa.rserv;
\r
25 import java.io.IOException;
\r
26 import java.util.List;
\r
28 import javax.servlet.Servlet;
\r
29 import javax.servlet.ServletConfig;
\r
30 import javax.servlet.ServletException;
\r
31 import javax.servlet.ServletRequest;
\r
32 import javax.servlet.ServletResponse;
\r
33 import javax.servlet.http.HttpServletRequest;
\r
34 import javax.servlet.http.HttpServletResponse;
\r
36 import org.onap.aaf.inno.env.Env;
\r
37 import org.onap.aaf.inno.env.TimeTaken;
\r
38 import org.onap.aaf.inno.env.Trans;
\r
40 public abstract class RServlet<TRANS extends Trans> implements Servlet {
\r
41 private Routes<TRANS> routes = new Routes<TRANS>();
\r
43 private ServletConfig config;
\r
46 public void init(ServletConfig config) throws ServletException {
\r
47 this.config = config;
\r
51 public ServletConfig getServletConfig() {
\r
55 public void route(Env env, HttpMethods meth, String path, HttpCode<TRANS, ?> code, String ... moreTypes) {
\r
56 Route<TRANS> r = routes.findOrCreate(meth,path);
\r
57 r.add(code,moreTypes);
\r
58 env.init().log(r.report(code),code);
\r
62 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
\r
63 HttpServletRequest request = (HttpServletRequest)req;
\r
64 HttpServletResponse response = (HttpServletResponse)res;
\r
66 @SuppressWarnings("unchecked")
\r
67 TRANS trans = (TRANS)req.getAttribute(TransFilter.TRANS_TAG);
\r
69 response.setStatus(404); // Not Found, because it didn't go through TransFilter
\r
74 HttpCode<TRANS,?> code=null;
\r
75 String ct = req.getContentType();
\r
76 TimeTaken tt = trans.start("Resolve to Code", Env.SUB);
\r
78 // routes have multiple code sets. This object picks the best code set
\r
79 // based on Accept or Content-Type
\r
80 CodeSetter<TRANS> codesetter = new CodeSetter<TRANS>(trans,request,response);
\r
81 // Find declared route
\r
82 route = routes.derive(request, codesetter);
\r
84 String method = request.getMethod();
\r
85 trans.checkpoint("No Route matches "+ method + ' ' + request.getPathInfo());
\r
86 response.setStatus(404); // Not Found
\r
88 // Find best Code in Route based on "Accepts (Get) or Content-Type" (if exists)
\r
89 code = codesetter.code();// route.getCode(trans, request, response);
\r
95 if(route!=null && code!=null) {
\r
96 StringBuilder sb = new StringBuilder(72);
\r
97 sb.append(route.auditText);
\r
99 sb.append(code.desc());
\r
101 sb.append(", ContentType: ");
\r
104 tt = trans.start(sb.toString(),Env.SUB);
\r
107 code.handle(trans, request, response);
\r
108 response.flushBuffer();
\r
109 } catch (ServletException e) {
\r
110 trans.error().log(e);
\r
112 } catch (Exception e) {
\r
113 trans.error().log(e,request.getMethod(),request.getPathInfo());
\r
114 throw new ServletException(e);
\r
122 public String getServletInfo() {
\r
123 return "RServlet for Jetty";
\r
127 public void destroy() {
\r
130 public String applicationJSON(Class<?> cls, String version) {
\r
131 StringBuilder sb = new StringBuilder();
\r
132 sb.append("application/");
\r
133 sb.append(cls.getSimpleName());
\r
134 sb.append("+json");
\r
135 sb.append(";charset=utf-8");
\r
136 sb.append(";version=");
\r
137 sb.append(version);
\r
138 return sb.toString();
\r
141 public String applicationXML(Class<?> cls, String version) {
\r
142 StringBuilder sb = new StringBuilder();
\r
143 sb.append("application/");
\r
144 sb.append(cls.getSimpleName());
\r
146 sb.append(";charset=utf-8");
\r
147 sb.append(";version=");
\r
148 sb.append(version);
\r
149 return sb.toString();
\r
152 public List<RouteReport> routeReport() {
\r
153 return routes.routeReport();
\r