AT&T 2.0.19 Code drop, stage 3
[aaf/authz.git] / auth / auth-core / src / main / java / org / onap / aaf / auth / rserv / RServlet.java
1 /**
2  * ============LICENSE_START====================================================
3  * org.onap.aaf
4  * ===========================================================================
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6  * ===========================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END====================================================
19  *
20  */
21
22 package org.onap.aaf.auth.rserv;
23
24 import java.io.IOException;
25 import java.util.List;
26
27 import javax.servlet.Servlet;
28 import javax.servlet.ServletConfig;
29 import javax.servlet.ServletException;
30 import javax.servlet.ServletRequest;
31 import javax.servlet.ServletResponse;
32 import javax.servlet.http.HttpServletRequest;
33 import javax.servlet.http.HttpServletResponse;
34
35 import org.onap.aaf.misc.env.Env;
36 import org.onap.aaf.misc.env.TimeTaken;
37 import org.onap.aaf.misc.env.Trans;
38
39 public abstract class RServlet<TRANS extends Trans> implements Servlet {
40         private Routes<TRANS> routes = new Routes<TRANS>();
41
42         private ServletConfig config;
43
44         @Override
45         public void init(ServletConfig config) throws ServletException {
46                 this.config = config;
47         }
48
49         @Override
50         public ServletConfig getServletConfig() {
51                 return config;
52         }
53
54         public void route(Env env, HttpMethods meth, String path, HttpCode<TRANS, ?> code, String ... moreTypes) {
55                 Route<TRANS> r = routes.findOrCreate(meth,path);
56                 r.add(code,moreTypes);
57                 env.init().log(r.report(code),code);
58         }
59         
60         @Override
61         public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
62                 HttpServletRequest request = (HttpServletRequest)req;
63                 HttpServletResponse response = (HttpServletResponse)res;
64                 
65                 @SuppressWarnings("unchecked")
66                 TRANS trans = (TRANS)req.getAttribute(TransFilter.TRANS_TAG);
67                 if(trans==null) {
68                         response.setStatus(404); // Not Found, because it didn't go through TransFilter
69                         return;
70                 }
71                 
72                 Route<TRANS> route;
73                 HttpCode<TRANS,?> code=null;
74                 String ct = req.getContentType();
75                 TimeTaken tt = trans.start("Resolve to Code", Env.SUB);
76                 try {
77                         // routes have multiple code sets.  This object picks the best code set
78                         // based on Accept or Content-Type
79                         CodeSetter<TRANS> codesetter = new CodeSetter<TRANS>(trans,request,response);
80                         // Find declared route
81                         route = routes.derive(request, codesetter);
82                         if(route==null) {
83                                 String method = request.getMethod();
84                                 trans.checkpoint("No Route matches "+ method + ' ' + request.getPathInfo());
85                                 response.setStatus(404); // Not Found
86                         } else {
87                                 // Find best Code in Route based on "Accepts (Get) or Content-Type" (if exists)
88                                 code = codesetter.code();// route.getCode(trans, request, response);
89                         }
90                 } finally {
91                         tt.done();
92                 }
93                 
94                 if(route!=null && code!=null) {
95                         StringBuilder sb = new StringBuilder(72);
96                         sb.append(route.auditText);
97                         sb.append(',');
98                         sb.append(code.desc());
99                         if(ct!=null) {
100                                 sb.append(", ContentType: ");
101                                 sb.append(ct);
102                         }
103                         tt = trans.start(sb.toString(),Env.SUB);
104                         try {
105                                 /*obj = */
106                                 code.handle(trans, request, response);
107                                 response.flushBuffer();
108                         } catch (ServletException e) {
109                                 trans.error().log(e);
110                                 throw e;
111                         } catch (Exception e) {
112                                 trans.error().log(e,request.getMethod(),request.getPathInfo());
113                                 throw new ServletException(e);
114                         } finally {
115                                 tt.done();
116                         }
117                 }
118         }
119         
120         @Override
121         public String getServletInfo() {
122                 return "RServlet for Jetty";
123         }
124
125         @Override
126         public void destroy() {
127         }
128
129         public String applicationJSON(Class<?> cls, String version) {
130                 StringBuilder sb = new StringBuilder();
131                 sb.append("application/");
132                 sb.append(cls.getSimpleName());
133                 sb.append("+json");
134                 sb.append(";charset=utf-8");
135                 sb.append(";version=");
136                 sb.append(version);
137                 return sb.toString();
138         }
139
140         public String applicationXML(Class<?> cls, String version) {
141                 StringBuilder sb = new StringBuilder();
142                 sb.append("application/");
143                 sb.append(cls.getSimpleName());
144                 sb.append("+xml");
145                 sb.append(";charset=utf-8");
146                 sb.append(";version=");
147                 sb.append(version);
148                 return sb.toString();
149         }
150
151         public List<RouteReport> routeReport() {
152                 return routes.routeReport();
153         }
154 }