package com.opentravelsoft.providers.hibernate.product;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.LockMode;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
import com.opentravelsoft.entity.District;
import com.opentravelsoft.entity.LineDistrict;
import com.opentravelsoft.entity.LineDistrictId;
import com.opentravelsoft.providers.hibernate.GenericDaoHibernate;
import com.opentravelsoft.providers.product.LineDistrictDao;
import com.opentravelsoft.util.RowDataUtil;
import com.opentravelsoft.util.StringUtil;
/**
*
* @author <a herf="mailto:zhangsitao@gmail.com">Steven Zhang</a>
*/
@Repository("RouteDistrictDao")
public class LineDistrictDaoImpl extends
GenericDaoHibernate<LineDistrict, Long> implements LineDistrictDao {
public LineDistrictDaoImpl() {
super(LineDistrict.class);
}
@SuppressWarnings("unchecked")
public List<District> getDomesticLineDistrict(String lineNo) {
StringBuilder sql = new StringBuilder();
sql.append("select a.id.districtNo,b.cnName,b.province.cnName,");
sql.append("b.cnNote ");
sql.append("from LineDistrict as a,");
sql.append("District as b ");
sql.append("where a.id.lineNo=? and a.id.districtNo=b.districtNo ");
Object[] params = { lineNo };
List<Object[]> list = getHibernateTemplate().find(sql.toString(), params);
District district = null;
List<District> districtList = new ArrayList<District>();
for (Object[] obj : list) {
district = new District();
district.setDistrictNo(RowDataUtil.getString(obj[0]));
district.setCnName(RowDataUtil.getString(obj[1]).trim());
district.getProvince().setCnName(RowDataUtil.getString(obj[2]).trim());
district.setCnNote(RowDataUtil.getString(obj[3]));
districtList.add(district);
}
return districtList;
}
@SuppressWarnings("unchecked")
public List<District> getOverseaLineDistrict(String lineNo) {
StringBuilder sql = new StringBuilder();
sql.append("select a.id.districtNo,b.cnName,b.country.name,b.cnNote ");
sql.append("from LineDistrict as a,");
sql.append("District as b ");
sql.append("where a.id.lineNo=? and a.id.districtNo=b.districtNo ");
Object[] params = { lineNo };
List<Object[]> list = getHibernateTemplate().find(sql.toString(), params);
District district = null;
List<District> districtList = new ArrayList<District>();
for (Object[] obj : list) {
district = new District();
district.setDistrictNo(RowDataUtil.getString(obj[0]));
district.setCnName(RowDataUtil.getString(obj[1]));
district.getCountry().setName(RowDataUtil.getString(obj[2]));
district.setCnNote(RowDataUtil.getString(obj[3]));
districtList.add(district);
}
return districtList;
}
@SuppressWarnings("unchecked")
public List<District> findOverseaLineDistrict(String countryNo,
String provinceNo, String lineNo) {
StringBuilder sql = new StringBuilder();
sql.append("from District ");
sql.append("where districtNo not in ");
sql.append("(select id.districtNo ");
sql.append("from LineDistrict ");
sql.append("where id.lineNo=? ) ");
Object[] params = { lineNo };
if (StringUtil.hasLength(provinceNo)) {
sql.append("and province.code=? ");
params = new Object[2];
params[0] = lineNo;
params[1] = provinceNo;
} else if (StringUtil.hasLength(countryNo)) {
sql.append("and country.countryId=? ");
params = new Object[2];
params[0] = lineNo;
params[1] = countryNo;
}
List<District> list = getHibernateTemplate().find(sql.toString(), params);
return list;
}
@SuppressWarnings("unchecked")
public void saveLineDistrict(List<District> list, String lineNo) {
HibernateTemplate template = getHibernateTemplate();
List<String> keyList = new ArrayList<String>();
for (District obj : list) {
LineDistrictId districtId = new LineDistrictId();
districtId.setLineNo(lineNo);
districtId.setDistrictNo(obj.getDistrictNo());
LineDistrict lineDistrict = (LineDistrict) template.get(
LineDistrict.class, districtId, LockMode.PESSIMISTIC_WRITE);
if (lineDistrict == null) {
lineDistrict = new LineDistrict();
lineDistrict.setId(districtId);
template.save(lineDistrict);
}
keyList.add(obj.getDistrictNo());
}
StringBuilder sql = new StringBuilder();
sql.append("from LineDistrict where id.lineNo=? ");
Object[] params = { lineNo };
List<LineDistrict> oldList = template.find(sql.toString(), params);
for (LineDistrict ooj : oldList) {
if (!keyList.contains((ooj.getId()).getDistrictNo())) {
template.delete(ooj);
}
}
}
}