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