package org.easycassandra.persistence;
import java.lang.reflect.Field;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import javax.persistence.Embeddable;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;
import org.apache.cassandra.thrift.Column;
import org.easycassandra.EasyCassandraException;
import org.easycassandra.annotations.Index;
import org.easycassandra.annotations.write.EnumWrite;
import org.easycassandra.util.EncodingUtil;
import org.easycassandra.util.ReflectionUtil;
Entity colunaFamilia = (Entity) object.getAnnotation(Entity.class);
if (colunaFamilia != null) {
return colunaFamilia.name().equals("")
? object.getSimpleName() : colunaFamilia.name();
}
return object.getSimpleName();
}
return field.getAnnotation(
javax.persistence.Column.class).name().equals("")
? field.getName() : field.getAnnotation(
javax.persistence.Column.class).name();
}
if (isNormalField(field)) {
return getColumnName(field);
}
return field.getName();
}
public static Field
getKeyField(Class<?> persistenceClass) {
return getField(persistenceClass, Id.class);
}
return getField(persistenceClass, Index.class);
}
@SuppressWarnings({"unchecked", "rawtypes"})
public static Field
getField(Class object, Class annotation) {
for (Field field : object.getDeclaredFields()) {
if (field.getAnnotation(annotation) != null) {
return field;
} else if (field.getAnnotation(Embeddable.class) != null) {
return getField(field.getType(), annotation);
}
}
return null;
}
public static List<Column>
getColumns(Object object) {
Long timeStamp = System.currentTimeMillis();
List<Column> columns = new ArrayList<Column>();
List<Field> fields = listFields(object.getClass());
for (Field field : fields) {
if (field.getName().equals("serialVersionUID")
|| field.getAnnotation(Id.class) != null
|| ReflectionUtil.getMethod(object, field) == null) {
continue;
}
if (ColumnUtil.isNormalField(field)) {
Column column = makeColumn(timeStamp,
ColumnUtil.getColumnName(field), object, field);
addColumn(columns, column);
} else if (ColumnUtil.isEmbeddedField(field)) {
if (ReflectionUtil.getMethod(object, field) != null) {
columns.addAll(getColumns(
ReflectionUtil.getMethod(object, field)));
}
} else if (ColumnUtil.isEnumField(field)) {
Column column = doEnumColumn(object, timeStamp, field);
addColumn(columns, column);
}
}
return columns;
}
public static List<Field>
listFields(Class<?> class1) {
List<Field> fields =new ArrayList<Field>();
feedFieldList(class1, fields);
if(isMappedSuperclass(class1)){
feedFieldList(class1.getSuperclass(), fields);
}
return fields;
}
private static void feedFieldList(Class<?> class1, List<Field> fields) {
for(Field field:class1.getDeclaredFields()){
fields.add(field);
}
}
private static Column
doEnumColumn(Object object, Long timeStamp,
Field field) {
Column column = new Column();
column.setTimestamp(timeStamp);
column.setName(EncodingUtil.stringToByte(
ColumnUtil.getEnumeratedName(field)));
ByteBuffer byteBuffer = new EnumWrite().getBytebyObject(
ReflectionUtil.getMethod(object, field));
column.setValue(byteBuffer);
return column;
}
private static void addColumn(List<Column> columns, Column column) {
if (column != null) {
columns.add(column);
}
}
public static Column
makeColumn(
long timeStamp, String coluna,
Object object, Field field) {
Object subObject = ReflectionUtil.getMethod(object, field);
if (subObject != null) {
Column column = new Column();
column.setTimestamp(timeStamp);
column.setName(EncodingUtil.stringToByte(coluna));
column.setValue(BasePersistence.getWriteManager().convert(subObject));
return column;
} else {
return null;
}
}
String columnFamily, AtomicReference<ColumnFamilyIds> superColumnRef,
String keyStore) {
if (!contains(keyField.getType())) {
throw new EasyCassandraException(" There are not supported "
+ "auto counting for this class, see: java.lang.String,"
+ " java.lang.Long, java.lang.Integer, java.lang.Byte,"
+ " java.lang.Short, java.math.BigInteger ");
}
Object id = superColumnRef.get().getId(columnFamily, keyStore);
if (String.class.equals(keyField.getType())) {
id = id.toString();
} else if (!BigInteger.class.equals(keyField.getType())) {
id = ReflectionUtil.valueOf(keyField.getType(), id.toString());
}
ReflectionUtil.setMethod(object, keyField, id);
}
private static boolean contains(Class<?> clazz) {
Class<?>[] classes = {String.class, Long.class, Integer.class,
Byte.class, Short.class, BigInteger.class};
for (Class<?> claZZ : classes) {
if (clazz.equals(claZZ)) {
return true;
}
}
return false;
}
public static boolean isIdField(Field field) {
return field.getAnnotation(Id.class) != null;
}
@GeneratedValue
return field.getAnnotation(GeneratedValue.class) != null;
}
return field.getAnnotation(Index.class) != null;
}
return field.getAnnotation(javax.persistence.Column.class) != null;
}
return field.getAnnotation(Enumerated.class) != null;
}
return field.getAnnotation(Embedded.class) != null;
}
return field.getAnnotation(Version.class) != null;
}
}
return class1.getSuperclass().getAnnotation(MappedSuperclass.class)!=null;
}
}