package org.hivedb.services;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.shards.strategy.access.SequentialShardAccessStrategy;
import org.hibernate.shards.util.Lists;
import org.hibernate.shards.util.Maps;
import org.hivedb.Hive;
import org.hivedb.annotations.Resource;
import org.hivedb.configuration.EntityConfig;
import org.hivedb.hibernate.*;
import org.hivedb.util.PrimitiveUtils;
import org.hivedb.util.classgen.GenerateInstance;
import org.hivedb.util.classgen.GeneratePrimitiveValue;
import org.hivedb.util.classgen.ReflectionTools;
import org.hivedb.util.functional.Generator;
import org.hivedb.util.functional.Transform;
import org.hivedb.util.functional.Unary;
import javax.jws.WebService;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@WebService(endpointInterface = "org.hivedb.services.DataGenerationService")
public class DataGenerationServiceImpl implements DataGenerationService {
private ConfigurationReader config;
private Map<Class, DataAccessObject<Object, Serializable>> daos = Maps.newHashMap();
private Log log = LogFactory.getLog(DataGenerationServiceImpl.class);
public DataGenerationServiceImpl(Collection<Class<?>> classes, Hive hive) {
config = new ConfigurationReader(classes);
List<Class<?>> hiveSessionClasses = Lists.newArrayList();
hiveSessionClasses.addAll(new EntityResolver(config.getHiveConfiguration()).getEntityClasses());
HiveSessionFactory factory = new HiveSessionFactoryBuilderImpl(config.getHiveConfiguration(), classes, hive, new SequentialShardAccessStrategy());
for (Class clazz : hiveSessionClasses) {
if (clazz.getAnnotation(Resource.class) != null) {
daos.put(clazz, new BaseDataAccessObject(config.getEntityConfig(clazz.getName()), hive, factory));
}
}
}
/* (non-Javadoc)
* @see org.hivedb.services.DataGenerationService#listClasses()
*/
public Collection<String> listClasses() {
return Transform.map(new Unary<EntityConfig, String>() {
public String f(EntityConfig item) {
return item.getRepresentedInterface().getName();
}
}, config.getConfigurations());
}
/* (non-Javadoc)
* @see org.hivedb.services.DataGenerationService#generate(java.lang.String, java.lang.Integer, java.lang.Integer)
*/
public Collection<Long> generate(String clazz, Integer partitionKeyCount, Integer instanceCount) {
Collection<Long> ids = Lists.newArrayList();
try {
EntityConfig entityConfig = config.getEntityConfig(clazz);
Generator<Object> pKeyGenerator;
if (PrimitiveUtils.isPrimitiveClass(entityConfig.getPrimaryKeyClass()))
pKeyGenerator = new GeneratePrimitiveValue<Object>((Class<Object>) entityConfig.getPrimaryKeyClass());
else
pKeyGenerator = new GenerateInstance<Object>((Class<Object>) entityConfig.getPrimaryKeyClass());
for (int i = 0; i < partitionKeyCount; i++) {
Object pkey = pKeyGenerator.generate();
DataAccessObject<Object, Serializable> dao = daos.get(entityConfig.getRepresentedInterface());
GenerateInstance<Object> instanceGenerator = new GenerateInstance<Object>((Class<Object>) entityConfig.getRepresentedInterface());
for (int j = 0; j < instanceCount; j++) {
Object instance = instanceGenerator.generate();
ReflectionTools.invokeSetter(instance, entityConfig.getPrimaryIndexKeyPropertyName(), pkey);
dao.save(instance);
Serializable id = entityConfig.getId(instance);
if (Number.class.isAssignableFrom(id.getClass())) {
ids.add(Long.parseLong(id.toString()));
} else
throw new UnsupportedOperationException("This implementation can only generate classes with numeric ids.");
}
}
} catch (RuntimeException e) {
log.fatal(e);
log.fatal(e.getMessage());
throw e;
}
return ids;
}
}