package osm.surveyor.task.city;
import java.util.List;
import org.springframework.boot.CommandLineRunner;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import osm.surveyor.task.city.model.CitiesJson;
import osm.surveyor.task.city.model.City;
import osm.surveyor.task.city.model.CityJson;
import osm.surveyor.task.city.model.Status;
import osm.surveyor.task.mesh.CitymeshRepository;
import osm.surveyor.task.mesh.model.Citymesh;
import osm.surveyor.task.task.TaskService;
import osm.surveyor.task.task.model.TaskEntity;
import osm.surveyor.task.util.Geojson;
import osm.surveyor.task.util.JsonFeature;
import osm.surveyor.task.util.JsonGeometryLine;
import osm.surveyor.task.util.JsonGeometryPoint;
import osm.surveyor.task.util.JsonProperties;
import osm.surveyor.task.util.Point;
@RequiredArgsConstructor
@Component
public class DataLoader implements CommandLineRunner {
private final CityRepository cityRepository;
private final CitymeshRepository meshRepository;
private final TaskService taskService;
private final CityService cityService;
String url = "http://192.168.0.200/osm-data";
@Override
public void run(String... args) throws Exception {
// 「src/main/resources/static/city/index.json」を読み込む
String body = httpGet(url + "/index.json");
CitiesJson pojo = new ObjectMapper().readValue(body, CitiesJson.class);
String site = pojo.getSite();
for (CityJson citiesJson : pojo.getList()) {
City city = new City();
city.setSite(site);
city.setCitycode(citiesJson.getCode());
city.setCityname(citiesJson.getName());
city.setFolder(citiesJson.getPath());
Status status = citiesJson.getStatus();
if (status != null) {
city.setStatus(status);
}
Point coordinates = citiesJson.toCoordinates();
city.setLng(coordinates.getLng());
city.setLat(coordinates.getLat());
cityRepository.save(city);
storeTask(city);
cityService.updateStatus(city.getCitycode());
}
}
private String httpGet(String url) throws Exception {
RestTemplate restTemplate = new RestTemplate();
System.out.println(String.format("INFO: httpGet(%s)", url));
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
HttpStatus httpStatus = (HttpStatus) response.getStatusCode();
if (httpStatus.isError()) {
System.out.println("ERROE: Can not access '"+ url +"'");
throw new Exception("ERROE: Can not access '"+ url +"'");
}
String body = response.getBody();
return body;
}
private void storeTask(City city) throws Exception {
String folder = city.getFolder();
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(httpGet(url + "/" + folder + "/bldg/index.geojson"));
Geojson geojson = new Geojson();
geojson.parse(node);
List<JsonFeature> features = geojson.getFeatures();
for (JsonFeature f : features) {
JsonProperties prop = f.getProperties();
if (prop != null) {
String meshcode = prop.getId();
if (meshcode != null) {
// メッシュの中心点
JsonGeometryPoint geometryPoint = f.getGeometryPoint();
if (geometryPoint != null) {
Citymesh mesh = new Citymesh();
mesh.setCitycode(city.getCitycode());
mesh.setMeshcode(meshcode);
mesh.setVersion(prop.getVersion());
mesh.setSurveyYear(prop.getSurveyYear());
mesh.setPath(prop.getPath());
mesh.setPoint(geometryPoint.getPoint());
mesh.setCity(city);
TaskEntity task = (TaskEntity) taskService.getTaskByMesh(city.getCitycode(), meshcode);
if (task == null) {
Status status = city.getStatus();
if (status != null) {
mesh.setStatus(status);
}
}
else {
mesh.setStatus(task.getStatus());
mesh.setUsername(task.getUsername());
}
meshRepository.save(mesh);
}
// メッシュの範囲
// [制限事項] 'index.geojson' 内の配列は必ず、LINE_STRINGフィーチャの前にPOINTフィーチャが存在していなければならない
JsonGeometryLine geometryLine = f.getGeometryLine();
if (geometryLine != null) {
Citymesh mesh = new Citymesh();
mesh.setCitycode(city.getCitycode());
mesh.setMeshcode(meshcode);
mesh.setLine(geometryLine);
mesh.setPoint(geometryLine.getCenter());
mesh.setCity(city);
// [制限事項]
Citymesh meshDb = (Citymesh) meshRepository.findOne(city.getCitycode(), meshcode);
if (meshDb != null) {
mesh.setVersion(meshDb.getVersion());
mesh.setSurveyYear(meshDb.getSurveyYear());
mesh.setPath(meshDb.getPath());
mesh.setLng(meshDb.getLng());
mesh.setLat(meshDb.getLat());
mesh.setStatus(meshDb.getStatus());
mesh.setUsername(meshDb.getUsername());
mesh.setStatus(meshDb.getStatus());
}
meshRepository.save(mesh);
}
}
}
}
}
}