mirror of https://github.com/balkian/SOJA.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
5.4 KiB
Java
211 lines
5.4 KiB
Java
/**
|
|
*
|
|
*/
|
|
package es.upm.dit.gsi.sojason.services.travel;
|
|
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.IOException;
|
|
import java.util.Properties;
|
|
import java.util.regex.Pattern;
|
|
|
|
import es.upm.dit.gsi.jason.utils.NotationUtils;
|
|
import es.upm.dit.gsi.sojason.beans.ErrorReport;
|
|
|
|
/**
|
|
* This class describes the
|
|
* @author gsi.dit.upm.es
|
|
* @version 1.0
|
|
*/
|
|
public class RenfeServiceConvenion {
|
|
|
|
public final static String SERVICE_URL = "http://horarios.renfe.com/HIRRenfeWeb/buscar.do";
|
|
public final static String ORIGIN_PARAM = "O";
|
|
public final static String DESTINATION_PARAM = "D";
|
|
public final static String YEAR_PARAM = "AF";
|
|
public final static String MONTH_PARAM = "MF";
|
|
public final static String DAY_PARAM = "DF";
|
|
public final static String DEFAULT_PATH_TO_CITY_CODES_FILE = "conf/cities.xml";
|
|
|
|
private Properties cityCodes;
|
|
|
|
/**
|
|
*
|
|
* @param cityCodesFile
|
|
* @throws IOException
|
|
*/
|
|
public RenfeServiceConvenion (File cityCodesFile) throws IOException {
|
|
this.cityCodes = new Properties();
|
|
this.cityCodes.loadFromXML(new FileInputStream(cityCodesFile));
|
|
}
|
|
|
|
/**
|
|
* Default constructor
|
|
* @throws IOException
|
|
*/
|
|
public RenfeServiceConvenion () throws IOException {
|
|
this(new File(DEFAULT_PATH_TO_CITY_CODES_FILE));
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
* @param origin
|
|
* @param destination
|
|
* @param day
|
|
* @param month
|
|
* @param year
|
|
* @return
|
|
*/
|
|
public String generateQuery (String origin, String destination,
|
|
String day, String month, String year){
|
|
|
|
origin = NotationUtils.uncompact(origin);
|
|
destination = NotationUtils.uncompact(destination);
|
|
|
|
if(!validateParams(origin, destination, day, month, year)){
|
|
throw new IllegalArgumentException();
|
|
}
|
|
|
|
String res = SERVICE_URL;
|
|
res = res.concat("?");
|
|
res = res.concat(ORIGIN_PARAM);
|
|
res = res.concat("=");
|
|
res = res.concat(this.cityCodes.getProperty(origin.toLowerCase()));
|
|
res = res.concat("&");
|
|
res = res.concat(DESTINATION_PARAM);
|
|
res = res.concat("=");
|
|
res = res.concat(this.cityCodes.getProperty(destination.toLowerCase()));
|
|
res = res.concat("&");
|
|
res = res.concat(YEAR_PARAM);
|
|
res = res.concat("=");
|
|
res = res.concat(year);
|
|
res = res.concat("&");
|
|
res = res.concat(MONTH_PARAM);
|
|
res = res.concat("=");
|
|
res = res.concat(month);
|
|
res = res.concat("&");
|
|
res = res.concat(DAY_PARAM);
|
|
res = res.concat("=");
|
|
res = res.concat(day);
|
|
// 'concat' is faster than '+' operator
|
|
|
|
return res;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param origin
|
|
* @param destination
|
|
* @param day
|
|
* @param month
|
|
* @param year
|
|
* @throws IllegalArgumentException
|
|
*/
|
|
protected boolean validateParams(String origin, String destination, String day,
|
|
String month, String year) {
|
|
|
|
if(!Pattern.matches("\\d{4}", year)){
|
|
return false;
|
|
}
|
|
if(!Pattern.matches("\\d{1,2}", month)){
|
|
return false;
|
|
}
|
|
if(!Pattern.matches("\\d{1,2}", day)){
|
|
return false;
|
|
}
|
|
|
|
int monthI = Integer.parseInt(month);
|
|
int dayI = Integer.parseInt(day);
|
|
int monthNumberOfDays[] = {31,29,31,30,31,30,31,31,30,31,30,31};
|
|
if(monthI < 1 || monthI > 12){
|
|
return false;
|
|
}
|
|
if(dayI < 1 || dayI > monthNumberOfDays[monthI-1]){
|
|
return false;
|
|
}
|
|
|
|
if(origin == null || !this.cityCodes.containsKey(origin.toLowerCase())) {
|
|
return false;
|
|
}
|
|
|
|
if(destination == null || !this.cityCodes.containsKey(destination.toLowerCase())) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
protected ErrorReport reportParamErrors (String origin, String destination, String day,
|
|
String month, String year) {
|
|
|
|
ErrorReport errors = new ErrorReport();
|
|
|
|
if(!Pattern.matches("\\d{4}", year)){
|
|
errors.put("year", "invalid format");
|
|
}
|
|
if(!Pattern.matches("\\d{1,2}", month)){
|
|
errors.put("month", "invalid format");
|
|
}
|
|
if(!Pattern.matches("\\d{1,2}", day)){
|
|
errors.put("day", "invalid format");
|
|
}
|
|
|
|
int monthI = Integer.parseInt(month);
|
|
int dayI = Integer.parseInt(day);
|
|
int monthNumberOfDays[] = {31,29,31,30,31,30,31,31,30,31,30,31};
|
|
if(monthI < 1 || monthI > 12){
|
|
errors.put("month", "out of range");
|
|
monthI = 1; // this lets check the day
|
|
}
|
|
if(dayI < 1 || dayI > monthNumberOfDays[monthI-1]){
|
|
errors.put("day", "out of range");
|
|
}
|
|
|
|
if(origin == null || !this.cityCodes.containsKey(origin.toLowerCase())) {
|
|
errors.put("origin", "no such location");
|
|
}
|
|
|
|
if(destination == null || !this.cityCodes.containsKey(destination.toLowerCase())) {
|
|
errors.put("destination", "no such location");
|
|
}
|
|
|
|
return errors;
|
|
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param arga
|
|
* @throws IOException
|
|
*/
|
|
public static void main(String [] arga) throws IOException{
|
|
|
|
// RenfeServiceConvenion rsc = new RenfeServiceConvenion();
|
|
// Properties newProperties = new Properties();
|
|
//
|
|
// for (Object key : rsc.cityCodes.keySet() ){
|
|
// String keyStr = (String)key;
|
|
// keyStr = keyStr.toLowerCase();
|
|
// newProperties.put(keyStr, rsc.cityCodes.get(key));
|
|
// if (keyStr.contains("á") ||
|
|
// keyStr.contains("é") ||
|
|
// keyStr.contains("í") ||
|
|
// keyStr.contains("ó") ||
|
|
// keyStr.contains("ú")) {
|
|
//
|
|
// keyStr = keyStr.replace("á", "a").replace("é", "e").replace("í", "i").replace("ó", "o").replace("ú", "u");
|
|
// newProperties.put(keyStr, rsc.cityCodes.get(key));
|
|
// }
|
|
// }
|
|
//
|
|
// newProperties.storeToXML(new FileOutputStream(DEFAULT_PATH_TO_CITY_CODES_FILE), "comment");
|
|
|
|
RenfeServiceConvenion rsc = new RenfeServiceConvenion();
|
|
String res = rsc.generateQuery("Madrid", "Ciudad Real", "15", "02", "2012");
|
|
System.out.println(res);
|
|
|
|
}
|
|
|
|
}
|