package regexgolf2.services.persistence.saving; import regexgolf2.model.SolvableChallenge; import regexgolf2.model.Word; import regexgolf2.model.containers.ChallengePool; import regexgolf2.model.containers.WordPool; import regexgolf2.services.persistence.PersistenceException; import regexgolf2.services.persistence.changetracking.ChangeTrackingService; import regexgolf2.services.persistence.mappers.Mappers; public class SaveVisitorImpl implements SaveVisitor { private final ChangeTrackingService _changeTrackingService; private final Mappers _mappers; public SaveVisitorImpl(ChangeTrackingService changeTrackingService, Mappers mappers) { _changeTrackingService = changeTrackingService; _mappers = mappers; } @Override public void visit(ChallengePool challengePool) throws PersistenceException { for (SolvableChallenge challenge : challengePool) visit(challenge); } @Override public void visit(SolvableChallenge solvableChallenge) throws PersistenceException { if (!_changeTrackingService.isChanged(solvableChallenge)) return; if (_changeTrackingService.isNew(solvableChallenge)) _mappers.getSolvableChallengeMapper().insert(solvableChallenge); else _mappers.getSolvableChallengeMapper().update(solvableChallenge); _changeTrackingService.objectWasPersisted(solvableChallenge); } @Override public void visit(WordPool wordPool) throws PersistenceException { for (Word word : wordPool) save(word); } private void save(Word word) throws PersistenceException { assert _changeTrackingService.isTracked(word); if (_changeTrackingService.isNew(word)) _mappers.getWordMapper().insert(word); else if (_changeTrackingService.isChanged(word)) _mappers.getWordMapper().update(word); _changeTrackingService.objectWasPersisted(word); } }