public static String identKey(GroovyObject thisObj, Map<String, Object> cassandraMapping)
     throws IOException, CassandraMappingNullIndexException {
   Object primaryKey = cassandraMapping.get("primaryKey");
   if (primaryKey == null) {
     primaryKey = cassandraMapping.get("unindexedPrimaryKey");
   }
   List<String> names = OrmHelper.stringList(primaryKey);
   List<String> values = new ArrayList<String>(names.size());
   for (String it : names) {
     Object value = thisObj.getProperty(it);
     values.add(KeyHelper.primaryRowKey(value));
   }
   return KeyHelper.makeComposite(values);
 }
  public static String primaryRowKey(Object obj)
      throws CassandraMappingNullIndexException, IOException {
    if (obj instanceof String) {
      String str = (String) obj;
      if (str.length() == 0) {
        throw new CassandraMappingNullIndexException(
            "Primary keys and indexed properties cannot have null values");
      } else {
        return str;
      }
    } else if (obj instanceof UUID) {
      UUID id = (UUID) obj;
      if (id.version() == 1) {
        long time = UuidDynamicMethods.time(id);
        return timePrefix(time) + "_" + id.toString();
      } else {
        return id.toString();
      }

    } else if (obj instanceof Date) {
      return timePrefix(((Date) obj).getTime());
    } else if (obj instanceof GroovyObject) {
      GroovyObject g = (GroovyObject) obj;
      if (OrmHelper.isMappedObject(g)) {
        return (String) g.getProperty("id");
      }
    } else if (obj == null) {
      throw new CassandraMappingNullIndexException(
          "Primary keys and indexed properties cannot have null values");
    } else if (obj instanceof Collection) {
      Collection c = (Collection) obj;
      List<String> items = new ArrayList<String>(c.size());
      for (Object it : c) {
        items.add(primaryRowKey(it));
      }
      return makeComposite(items);
    } else if (obj instanceof Number || obj instanceof Boolean) {
      return obj.toString();
    }

    try {
      return String.valueOf(DataMapper.dataProperty(obj));
    } catch (IllegalArgumentException e) {
      // TODO - why do we get this for enums in counters and not in simple properties?
      return obj.toString();
    }
  }
 public static List<String> objectIndexRowKeys(List<String> propNames, GroovyObject bean)
     throws IOException {
   try {
     boolean hasNull = false;
     List<Object> valueList = new ArrayList<Object>(propNames.size());
     for (String it : propNames) {
       Object value = bean.getProperty(it);
       if (value != null) {
         valueList.add(value);
       } else {
         hasNull = true;
         break;
       }
     }
     List<String> result;
     if (hasNull) {
       result = new ArrayList<String>();
     } else {
       result = new ArrayList<String>(valueList.size());
       List<List<String>> v2 = OrmHelper.expandNestedArray(valueList);
       for (List values : v2) {
         List<List<Object>> pairs = new ArrayList<List<Object>>();
         int index = 0;
         for (String name : propNames) {
           List<Object> tuple = new ArrayList<Object>(2);
           tuple.add(name);
           tuple.add(values.get(index));
           pairs.add(tuple);
           index++;
         }
         String key = indexRowKey(pairs);
         if (key != null && key.length() > 0) {
           result.add(key);
         }
       }
     }
     return result;
   } catch (CassandraMappingNullIndexException e) {
     return null;
   }
 }