package eu.lsem.bakalarka.dao;
import eu.lsem.bakalarka.model.Directory;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.dao.DataAccessException;
import java.util.*;
public class DirectoriesDaoImpl extends SqlMapClientDaoSupport implements DirectoriesDao {
private TransactionTemplate transactionTemplate;
public void setTransactionTemplate(TransactionTemplate transactionTemplate) { //injected by spring
this.transactionTemplate = transactionTemplate;
}
@Override
@SuppressWarnings("unchecked")
public List<Directory> getChildDirectories(Integer id) {
return (List<Directory>) getSqlMapClientTemplate().queryForList("Directories.getChildDirectories", id);
}
@Override
public void insertDirectory(Directory dir) {
getSqlMapClientTemplate().insert("Directories.insertDirectory", dir);
}
@Override
public Directory getDirectory(Integer id) {
return (Directory) getSqlMapClientTemplate().queryForObject("Directories.getDirectory", id);
}
@Override
@SuppressWarnings("unchecked")
public int updateDirectoryName(Integer id, String name) {
Map m = new HashMap(2);
m.put("id", id);
m.put("name", name);
return getSqlMapClientTemplate().update("Directories.updateDirectoryName", m);
}
@Override
public int deleteDirectoriesAndMoveTheses(final Integer rootDirId) {
final DataAccessException[] exc = new DataAccessException[1];
Integer deleted = (Integer) transactionTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
try {
Directory dirToDelete = getDirectory(rootDirId); //adr.ktery smazat
moveThesesInDirectory(dirToDelete.getId(), dirToDelete.getParentId());
return getSqlMapClientTemplate().delete("Directories.deleteDirectory", dirToDelete.getId());
} catch (DataAccessException e) {
exc[0] = e;
}
return null;
}
});
if (exc[0] != null) {
throw exc[0];
} else {
return deleted;
}
}
/**
* Tato metoda presume vsechny prace v adresari nahoru a zavola se pro vsechny podadresare
*
* @param dirId Adresar, ze ktereho prace presunout
* @param newParentDirId Adresar, kam prace presunout
*/
@SuppressWarnings("unchecked")
private void moveThesesInDirectory(Integer dirId, Integer newParentDirId) {
Map m = new HashMap(2);
m.put("newParentId", newParentDirId);
m.put("oldParentId", dirId);
getSqlMapClientTemplate().update("Theses.updateThesesDirectoryByParent", m);
List<Directory> dirs = getChildDirectories(dirId);
for (Directory d : dirs) {
moveThesesInDirectory(d.getId(), newParentDirId);
}
}
@Override
public List<Directory> getDirectoriesPath(Integer directoryId) {
LinkedList<Directory> list = new LinkedList<Directory>();
while (directoryId != null) {
Directory currentDir = getDirectory(directoryId);
list.addFirst(currentDir);
directoryId = currentDir.getParentId();
}
list.addFirst(new Directory());
return list;
}
}