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