cbc05c76d82cf97567054e96ffb1b0c0ff901109
[aaf/authz.git] / authz-cass / src / main / java / com / att / dao / session / SessionFilter.java
1 /*******************************************************************************\r
2  * ============LICENSE_START====================================================\r
3  * * org.onap.aaf\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
10  * * \r
11  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * * \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
19  * *\r
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
21  * *\r
22  ******************************************************************************/\r
23 package com.att.dao.session;\r
24 \r
25 import java.io.IOException;\r
26 \r
27 import javax.servlet.Filter;\r
28 import javax.servlet.FilterChain;\r
29 import javax.servlet.FilterConfig;\r
30 import javax.servlet.ServletException;\r
31 import javax.servlet.ServletRequest;\r
32 import javax.servlet.ServletResponse;\r
33 \r
34 import com.att.cssa.rserv.TransFilter;\r
35 import com.att.inno.env.APIException;\r
36 import com.att.inno.env.Env;\r
37 import com.att.inno.env.EnvStore;\r
38 import com.att.inno.env.Slot;\r
39 import com.att.inno.env.TransStore;\r
40 import com.att.inno.env.util.Pool;\r
41 import com.att.inno.env.util.Pool.Creator;\r
42 import com.att.inno.env.util.Pool.Pooled;\r
43 import com.datastax.driver.core.Cluster;\r
44 import com.datastax.driver.core.Session;\r
45 \r
46 public class SessionFilter<TRANS extends TransStore> implements Filter {\r
47         public static final String SESSION_SLOT = "__SESSION__";\r
48         private static Slot sessionSlot;\r
49         private static Pool<Session> pool;\r
50 \r
51         public SessionFilter(EnvStore<?> env, Cluster cluster, String keyspace) {\r
52                 synchronized(env) {\r
53                         if(sessionSlot==null) {\r
54                                 sessionSlot = env.slot(SESSION_SLOT);\r
55                         }\r
56                         if(pool==null) {\r
57                                 pool = new Pool<Session>(new SessionCreator(env,cluster,keyspace));\r
58                         }\r
59                 }\r
60         }\r
61 \r
62         @Override\r
63         public void init(FilterConfig fc) throws ServletException {\r
64                 // Session does not need any sort of configuration from Filter\r
65         }\r
66 \r
67         @Override\r
68         public void doFilter(ServletRequest req, ServletResponse resp,  FilterChain chain) throws IOException, ServletException {\r
69                 @SuppressWarnings("unchecked")\r
70                 TRANS trans = (TRANS)req.getAttribute(TransFilter.TRANS_TAG);\r
71                 try {\r
72                         Pooled<Session> psess = pool.get();\r
73                         try {\r
74                                 trans.put(sessionSlot, psess.content);\r
75                                 chain.doFilter(req, resp);\r
76                         } finally {\r
77                                 psess.done();\r
78                         }\r
79                 } catch (APIException e) {\r
80                         throw new ServletException(e);\r
81                 }\r
82         }\r
83 \r
84         public Pooled<Session> load(TRANS trans) throws APIException {\r
85                 Pooled<Session> psess = pool.get();\r
86                 trans.put(sessionSlot, psess.content);\r
87                 return psess;\r
88         }\r
89         \r
90         \r
91         /**\r
92          * Clear will drain the pool, so that new Sessions will be constructed.\r
93          * \r
94          * Suitable for Management calls.        \r
95          */\r
96         public static void clear() {\r
97                 if(pool!=null) {\r
98                         pool.drain();\r
99                 } \r
100         }\r
101         \r
102         @Override\r
103         public void destroy() {\r
104                 pool.drain();\r
105         }\r
106 \r
107         private class SessionCreator implements Creator<Session> {\r
108                 private Cluster cluster;\r
109                 private String keyspace;\r
110                 private Env env;\r
111                 \r
112                 public SessionCreator(Env env, Cluster cluster, String keyspace) {\r
113                         this.cluster = cluster;\r
114                         this.keyspace = keyspace;\r
115                         this.env = env;\r
116                 }\r
117                 \r
118                 @Override\r
119                 public Session create() throws APIException {\r
120                         env.info().log("Creating a Cassandra Session");\r
121                         return cluster.connect(keyspace);\r
122                 }\r
123 \r
124                 @Override\r
125                 public void destroy(Session t) {\r
126                         env.info().log("Shutting down a Cassandra Session");\r
127                         t.close();\r
128                 }\r
129 \r
130                 @Override\r
131                 public boolean isValid(Session t) {\r
132                         return true;\r
133                 }\r
134 \r
135                 @Override\r
136                 public void reuse(Session t) {\r
137                         // Nothing is needed to reuse this Session\r
138                 }\r
139                 \r
140         }\r
141 }\r