[AAF-21] Initial code import
[aaf/authz.git] / authz-cass / src / main / java / com / att / dao / Loader.java
diff --git a/authz-cass/src/main/java/com/att/dao/Loader.java b/authz-cass/src/main/java/com/att/dao/Loader.java
new file mode 100644 (file)
index 0000000..6b09df9
--- /dev/null
@@ -0,0 +1,215 @@
+/*******************************************************************************\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;\r
+\r
+import java.io.DataInputStream;\r
+import java.io.DataOutputStream;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+import java.util.Set;\r
+\r
+import com.datastax.driver.core.Row;\r
+\r
+public abstract class Loader<DATA> {\r
+       private int keylimit;\r
+       public Loader(int keylimit) {\r
+               this.keylimit = keylimit;\r
+       }\r
+       \r
+       public int keylimit() {\r
+               return keylimit;\r
+       }\r
+       \r
+       protected abstract DATA load(DATA data, Row row);\r
+       protected abstract void key(DATA data, int idx, Object[] obj);\r
+       protected abstract void body(DATA data, int idx, Object[] obj);\r
+\r
+       public final Object[] extract(DATA data, int size, CassDAOImpl.CRUD type) {\r
+               Object[] rv=null;\r
+               switch(type) {\r
+                       case delete:\r
+                               rv = new Object[keylimit()];\r
+                               key(data,0,rv);\r
+                               break;\r
+                       case update:\r
+                               rv = new Object[size];\r
+                               body(data,0,rv);\r
+                               int body = size-keylimit();\r
+                               if(body>0) {\r
+                                   key(data,body,rv);\r
+                               }\r
+                               break;\r
+                       default:\r
+                               rv = new Object[size];\r
+                               key(data,0,rv);\r
+                               if(size>keylimit()) {\r
+                                   body(data,keylimit(),rv);\r
+                               }\r
+                               break;\r
+               }\r
+               return rv;\r
+       }\r
+       \r
+       public static void writeString(DataOutputStream os, String s) throws IOException {\r
+               if(s==null) {\r
+                       os.writeInt(-1);\r
+               } else {\r
+                       switch(s.length()) {\r
+                               case 0:\r
+                                       os.writeInt(0);\r
+                                       break;\r
+                               default:\r
+                                       byte[] bytes = s.getBytes();\r
+                                       os.writeInt(bytes.length);\r
+                                       os.write(bytes);\r
+                       }\r
+               }\r
+       }\r
+       \r
+       /**\r
+        * We use bytes here to set a Maximum\r
+        * \r
+        * @param is\r
+        * @param MAX\r
+        * @return\r
+        * @throws IOException\r
+        */\r
+       public static String readString(DataInputStream is, byte[] _buff) throws IOException {\r
+               int l = is.readInt();\r
+               byte[] buff = _buff;\r
+               switch(l) {\r
+                       case -1: return null;\r
+                       case  0: return "";\r
+                       default:\r
+                               // Cover case where there is a large string, without always allocating a large buffer.\r
+                               if(l>buff.length) {\r
+                                   buff = new byte[l];\r
+                               }\r
+                               is.read(buff,0,l);\r
+                               return new String(buff,0,l);\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Write a set with proper sizing\r
+        * \r
+        * Note: at the moment, this is just String.  Probably can develop system where types\r
+        * are supported too... but not now.\r
+        * \r
+        * @param os\r
+        * @param set\r
+        * @throws IOException\r
+        */\r
+       public static void writeStringSet(DataOutputStream os, Collection<String> set) throws IOException {\r
+               if(set==null) {\r
+                       os.writeInt(-1);\r
+               } else {\r
+                       os.writeInt(set.size());\r
+                       for(String s : set) {\r
+                               writeString(os, s);\r
+                       }\r
+               }\r
+\r
+       }\r
+       \r
+       public static Set<String> readStringSet(DataInputStream is, byte[] buff) throws IOException {\r
+               int l = is.readInt();\r
+               if(l<0) {\r
+                   return null;\r
+               }\r
+               Set<String> set = new HashSet<String>(l);\r
+               for(int i=0;i<l;++i) {\r
+                       set.add(readString(is,buff));\r
+               }\r
+               return set;\r
+       }\r
+       \r
+       public static List<String> readStringList(DataInputStream is, byte[] buff) throws IOException {\r
+               int l = is.readInt();\r
+               if(l<0) {\r
+                   return null;\r
+               }\r
+               List<String> list = new ArrayList<String>(l);\r
+               for(int i=0;i<l;++i) {\r
+                       list.add(Loader.readString(is,buff));\r
+               }\r
+               return list;\r
+       }\r
+\r
+       /** \r
+        * Write a map\r
+        * @param os\r
+        * @param map\r
+        * @throws IOException\r
+        */\r
+       public static void writeStringMap(DataOutputStream os, Map<String,String> map) throws IOException {\r
+               if(map==null) {\r
+                       os.writeInt(-1);\r
+               } else {\r
+                       Set<Entry<String, String>> es = map.entrySet();\r
+                       os.writeInt(es.size());\r
+                       for(Entry<String,String> e : es) {\r
+                               writeString(os, e.getKey());\r
+                               writeString(os, e.getValue());\r
+                       }\r
+               }\r
+\r
+       }\r
+\r
+       public static Map<String,String> readStringMap(DataInputStream is, byte[] buff) throws IOException {\r
+               int l = is.readInt();\r
+               if(l<0) {\r
+                   return null;\r
+               }\r
+               Map<String,String> map = new HashMap<String,String>(l);\r
+               for(int i=0;i<l;++i) {\r
+                       String key = readString(is,buff);\r
+                       map.put(key,readString(is,buff));\r
+               }\r
+               return map;\r
+       }\r
+       public static void writeHeader(DataOutputStream os, int magic, int version) throws IOException {\r
+               os.writeInt(magic);\r
+               os.writeInt(version);\r
+       }\r
+       \r
+       public static int readHeader(DataInputStream is, final int magic, final int version) throws IOException {\r
+               if(is.readInt()!=magic) {\r
+                   throw new IOException("Corrupted Data Stream");\r
+               }\r
+               int v = is.readInt();\r
+               if(version<0 || v>version) {\r
+                   throw new IOException("Unsupported Data Version: " + v);\r
+               }\r
+               return v;\r
+       }\r
+\r
+}\r
+\r