package nebula.data.impl;
import java.util.List;
import nebula.data.Entity;
import nebula.lang.Field;
import nebula.lang.Reference;
import nebula.lang.Type;
import nebula.lang.TypeStandalone;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
public class IdMakerBuilder {
static Log log = LogFactory.getLog(IdMakerBuilder.class);
public static Function<Entity, Object> getIDReader(Type type) {
List<String> keys = Lists.newArrayList();
switch (type.getStandalone()) {
case Master:
for (Field f : type.getFields()) {
if (f.getType().getStandalone() == TypeStandalone.Basic && f.isKey()) {
keys.add(f.getName());
} else if (f.getRefer() == Reference.ByRef && f.isKey()) {
for (Field inf : f.getType().getFields()) {
if (inf.getRefer() == Reference.ByVal && inf.isKey()) {
keys.add(f.getName() + "_" + inf.getName());
}
}
}
}
if (log.isTraceEnabled()) {
log.trace("\tbuilder " + type.getName() + " IDSetter with " + keys.size() + " keys " + keys);
}
switch (keys.size()) {
case 1:
return new IDReader1(keys.get(0));
case 2:
return new IDReader2(keys.get(0), keys.get(1));
case 3:
return new IDReader3(keys.get(0), keys.get(1), keys.get(2));
case 4:
return new IDReader4(keys.get(0), keys.get(1), keys.get(2), keys.get(3));
default:
throw new UnsupportedOperationException("max 4 key");
}
case Transaction:
case Relation:
case Flow:
for (Field f : type.getFields()) {
if (f.getType().getStandalone() == TypeStandalone.Basic && f.isKey()) {
keys.add(f.getName());
} else if (f.getRefer() == Reference.ByRef && f.isKey()) {
for (Field inf : f.getType().getFields()) {
if (inf.getRefer() == Reference.ByVal && inf.isKey()) {
keys.add(f.getName() + "_" + inf.getName());
}
}
}
}
if (log.isTraceEnabled()) {
log.trace("\tbuilder " + type.getName() + " IDSetter with " + keys.size() + " keys " + keys);
}
switch (keys.size()) {
case 1:
return new IDSetterLong(keys.get(0));
default:
throw new UnsupportedOperationException("max 4 key");
}
default:
throw new UnsupportedOperationException("not master,");
}
}
static private class IDSetterLong implements Function<Entity, Object> {
final String key1;
IDSetterLong(String key1) {
this.key1 = key1;
}
@Override
public Long apply(Entity entity) {
return (Long) entity.get(key1);
}
}
static private class IDReader1 implements Function<Entity, Object> {
final String key1;
IDReader1(String key1) {
this.key1 = key1;
}
@Override
public String apply(Entity entity) {
return (String) entity.get(key1).toString();
}
}
static private class IDReader2 implements Function<Entity, Object> {
final String key1;
final String key2;
IDReader2(String key1, String key2) {
this.key1 = key1;
this.key2 = key2;
}
@Override
public String apply(Entity entity) {
return (String) entity.get(key1) + (String) entity.get(key2);
}
}
static private class IDReader3 implements Function<Entity, Object> {
final String key1;
final String key2;
final String key3;
IDReader3(String key1, String key2, String key3) {
this.key1 = key1;
this.key2 = key2;
this.key3 = key3;
}
@Override
public String apply(Entity entity) {
return (String) entity.get(key1) + (String) entity.get(key2) + (String) entity.get(key3);
}
}
static private class IDReader4 implements Function<Entity, Object> {
final String key1;
final String key2;
final String key3;
final String key4;
IDReader4(String key1, String key2, String key3, String key4) {
this.key1 = key1;
this.key2 = key2;
this.key3 = key3;
this.key4 = key4;
}
@Override
public String apply(Entity entity) {
return (String) entity.get(key1) + (String) entity.get(key2) + (String) entity.get(key3)
+ (String) entity.get(key4);
}
}
}