[AAF-21] Initial code import
[aaf/authz.git] / authz-cass / src / main / java / com / att / dao / session / SessionFilter.java
diff --git a/authz-cass/src/main/java/com/att/dao/session/SessionFilter.java b/authz-cass/src/main/java/com/att/dao/session/SessionFilter.java
new file mode 100644 (file)
index 0000000..6f83519
--- /dev/null
@@ -0,0 +1,142 @@
+/*******************************************************************************\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