--- /dev/null
+/*******************************************************************************\r
+ * ============LICENSE_START====================================================\r
+ * * org.onap.aai\r
+ * * ===========================================================================\r
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
+ * * Copyright © 2017 Amdocs\r
+ * * ===========================================================================\r
+ * * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * * you may not use this file except in compliance with the License.\r
+ * * You may obtain a copy of the License at\r
+ * * \r
+ * * http://www.apache.org/licenses/LICENSE-2.0\r
+ * * \r
+ * * Unless required by applicable law or agreed to in writing, software\r
+ * * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * * See the License for the specific language governing permissions and\r
+ * * limitations under the License.\r
+ * * ============LICENSE_END====================================================\r
+ * *\r
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
+ * *\r
+ ******************************************************************************/\r
+package com.att.dao.session;\r
+\r
+import java.io.IOException;\r
+\r
+import javax.servlet.Filter;\r
+import javax.servlet.FilterChain;\r
+import javax.servlet.FilterConfig;\r
+import javax.servlet.ServletException;\r
+import javax.servlet.ServletRequest;\r
+import javax.servlet.ServletResponse;\r
+\r
+import com.att.cssa.rserv.TransFilter;\r
+import com.att.inno.env.APIException;\r
+import com.att.inno.env.Env;\r
+import com.att.inno.env.EnvStore;\r
+import com.att.inno.env.Slot;\r
+import com.att.inno.env.TransStore;\r
+import com.att.inno.env.util.Pool;\r
+import com.att.inno.env.util.Pool.Creator;\r
+import com.att.inno.env.util.Pool.Pooled;\r
+import com.datastax.driver.core.Cluster;\r
+import com.datastax.driver.core.Session;\r
+\r
+public class SessionFilter<TRANS extends TransStore> implements Filter {\r
+ public static final String SESSION_SLOT = "__SESSION__";\r
+ private static Slot sessionSlot;\r
+ private static Pool<Session> pool;\r
+\r
+ public SessionFilter(EnvStore<?> env, Cluster cluster, String keyspace) {\r
+ synchronized(env) {\r
+ if(sessionSlot==null) {\r
+ sessionSlot = env.slot(SESSION_SLOT);\r
+ }\r
+ if(pool==null) {\r
+ pool = new Pool<Session>(new SessionCreator(env,cluster,keyspace));\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void init(FilterConfig fc) throws ServletException {\r
+ // Session does not need any sort of configuration from Filter\r
+ }\r
+\r
+ @Override\r
+ public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {\r
+ @SuppressWarnings("unchecked")\r
+ TRANS trans = (TRANS)req.getAttribute(TransFilter.TRANS_TAG);\r
+ try {\r
+ Pooled<Session> psess = pool.get();\r
+ try {\r
+ trans.put(sessionSlot, psess.content);\r
+ chain.doFilter(req, resp);\r
+ } finally {\r
+ psess.done();\r
+ }\r
+ } catch (APIException e) {\r
+ throw new ServletException(e);\r
+ }\r
+ }\r
+\r
+ public Pooled<Session> load(TRANS trans) throws APIException {\r
+ Pooled<Session> psess = pool.get();\r
+ trans.put(sessionSlot, psess.content);\r
+ return psess;\r
+ }\r
+ \r
+ \r
+ /**\r
+ * Clear will drain the pool, so that new Sessions will be constructed.\r
+ * \r
+ * Suitable for Management calls. \r
+ */\r
+ public static void clear() {\r
+ if(pool!=null) {\r
+ pool.drain();\r
+ } \r
+ }\r
+ \r
+ @Override\r
+ public void destroy() {\r
+ pool.drain();\r
+ }\r
+\r
+ private class SessionCreator implements Creator<Session> {\r
+ private Cluster cluster;\r
+ private String keyspace;\r
+ private Env env;\r
+ \r
+ public SessionCreator(Env env, Cluster cluster, String keyspace) {\r
+ this.cluster = cluster;\r
+ this.keyspace = keyspace;\r
+ this.env = env;\r
+ }\r
+ \r
+ @Override\r
+ public Session create() throws APIException {\r
+ env.info().log("Creating a Cassandra Session");\r
+ return cluster.connect(keyspace);\r
+ }\r
+\r
+ @Override\r
+ public void destroy(Session t) {\r
+ env.info().log("Shutting down a Cassandra Session");\r
+ t.close();\r
+ }\r
+\r
+ @Override\r
+ public boolean isValid(Session t) {\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public void reuse(Session t) {\r
+ // Nothing is needed to reuse this Session\r
+ }\r
+ \r
+ }\r
+}\r