package de.skuzzle.polly.core.internal.persistence;
import de.skuzzle.polly.sdk.EntityConverter;
import de.skuzzle.polly.sdk.PersistenceManagerV2;
import de.skuzzle.polly.sdk.PersistenceManagerV2.Atomic;
import de.skuzzle.polly.sdk.PersistenceManagerV2.Write;
import de.skuzzle.polly.sdk.exceptions.DatabaseException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.apache.log4j.Logger;
public class EntityConverterManagerImpl {
private final static Logger logger = Logger
.getLogger(EntityConverterManagerImpl.class.getName());
private List<EntityConverter> converters;
private PersistenceManagerV2 persistence;
public EntityConverterManagerImpl(PersistenceManagerV2 persistence) {
this.persistence = persistence;
this.converters = new LinkedList<EntityConverter>();
}
public void convertAll() throws DatabaseException {
for (final EntityConverter ec : this.converters) {
this.persistence.writeAtomicParallel(new Atomic() {
@Override
public void perform(Write write) {
try {
logger.info("Running Entity Converter: " + ec);
runConverter(ec, write);
} catch (Exception e) {
logger.error("Error while converting entities", e);
}
}
});
}
}
private void runConverter(EntityConverter ec, Write write) {
logger.trace("Retrieving list of old entities...");
List<Object> olds = ec.getOldEntities(write.read());
List<Object> converted = new ArrayList<Object>(olds.size());
logger.trace("Converting " + olds.size() + " entities...");
for (Object old : olds) {
converted.add(ec.convertEntity(old));
}
logger.trace("Persisting list of converted entities...");
write.all(converted);
logger.trace("Deleting old entities (optional operation, may have no effect)...");
ec.deleteOldEntities(olds, write);
}
public void addConverter(EntityConverter ec) {
logger.info("Registered entity converter:" + ec);
this.converters.add(ec);
}
}