package org.pegadi.server.service.impl;
import no.dusken.common.model.Department;
import no.dusken.common.service.DepartmentService;
import org.apache.commons.lang.NotImplementedException;
import org.springframework.dao.DataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DepartmentServiceImpl extends NamedParameterJdbcDaoSupport implements DepartmentService<Department> {
private final DepartmentMapper departmentMapper = new DepartmentMapper();
@Override
public Department getByName(String name) {
try {
return getNamedParameterJdbcTemplate().queryForObject("SELECT * FROM Department where name = :name",
Collections.singletonMap("name", name), departmentMapper);
} catch (DataAccessException e) {
return null;
}
}
@Override
public Department getByExternalID(Long aLong) {
throw new NotImplementedException();
}
@Override
public List<Department> findAll() {
throw new NotImplementedException();
}
@Override
public Iterable<Department> findAll(Iterable<Long> longs) {
throw new NotImplementedException();
}
@Override
public long count() {
throw new NotImplementedException();
}
@Override
public void delete(Long aLong) {
throw new NotImplementedException();
}
@Override
public void delete(Department entity) {
throw new NotImplementedException();
}
@Override
public void delete(Iterable<? extends Department> entities) {
throw new NotImplementedException();
}
@Override
public void deleteAll() {
throw new NotImplementedException();
}
@Override
public List<Department> findAll(Sort sort) {
throw new NotImplementedException();
}
@Override
public Page<Department> findAll(Pageable pageable) {
throw new NotImplementedException();
}
@Override
public <S extends Department> S save(S entity) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("name", entity.getName());
parameters.put("description", entity.getName());
String sql;
if(entity.isNew()){
parameters.put("version", 0);
sql = "INSERT INTO Department (name, description) values (:name, :description)";
GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
getNamedParameterJdbcTemplate().update(sql, new MapSqlParameterSource(parameters), generatedKeyHolder);
return (S) findOne(generatedKeyHolder.getKey().longValue());
}else {
parameters.put("id", entity.getId());
sql = "UPDATE Department set name=:name, description=:description WHERE id=:id";
getNamedParameterJdbcTemplate().update(sql, new MapSqlParameterSource(parameters));
return (S) findOne(entity.getId());
}
}
@Override
public <S extends Department> List<S> save(Iterable<S> entities) {
throw new NotImplementedException();
}
@Override
public Department findOne(Long id) {
try {
return getNamedParameterJdbcTemplate().queryForObject("SELECT * FROM Department where id = :id", Collections.singletonMap("id", id), departmentMapper);
} catch (DataAccessException e) {
return null;
}
}
@Override
public boolean exists(Long aLong) {
throw new NotImplementedException();
}
@Override
public void flush() {
throw new NotImplementedException();
}
@Override
public Department saveAndFlush(Department entity) {
throw new NotImplementedException();
}
@Override
public void deleteInBatch(Iterable<Department> entities) {
throw new NotImplementedException();
}
@Override
public void deleteAllInBatch() {
throw new NotImplementedException();
}
@Override
public Department findOne(Specification spec) {
throw new NotImplementedException();
}
@Override
public List<Department> findAll(Specification spec) {
throw new NotImplementedException();
}
@Override
public Page<Department> findAll(Specification spec, Pageable pageable) {
throw new NotImplementedException();
}
@Override
public List<Department> findAll(Specification spec, Sort sort) {
throw new NotImplementedException();
}
@Override
public long count(Specification spec) {
throw new NotImplementedException();
}
private class DepartmentMapper implements RowMapper<Department> {
@Override
public Department mapRow(ResultSet rs, int rowNum) throws SQLException {
final long id = rs.getLong("id");
Department department = new Department(){
@Override
public Long getId() {
return id;
}
};
department.setName(rs.getString("name"));
return department;
}
}
}