package com.bao.lc.site.s3.ai;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.chain.Context;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.bao.lc.AppConfig;
import com.bao.lc.site.s3.bean.ComparableFilter;
import com.bao.lc.site.s3.bean.TicketFilterCondition;
import com.bao.lc.site.s3.bean.TrainTicketInfo;
import com.bao.lc.site.s3.params.TdPNames;
import com.bao.lc.site.s3.params.TdParams;
import com.bao.lc.util.SortFilter;
public class TrainTicketSortFilterBuilder
{
private static Log log = LogFactory.getLog(TrainTicketSortFilterBuilder.class);
private List<SortFilter<TrainTicketInfo>> sortFilters = null;
public TrainTicketSortFilterBuilder(Context context)
{
sortFilters = new ArrayList<SortFilter<TrainTicketInfo>>(6);
init(context);
}
private void init(Context context)
{
TicketFilterCondition filterCond = TdParams.getFilterCond(context);
if(filterCond == null)
{
log.error("filterCond is null.");
return;
}
SortFilter<TrainTicketInfo> filter = null;
//Seat Class
int passengerCount = MapUtils.getIntValue(context, TdPNames.PARAM_PASSENGER_COUNT, 1);
filter = new SeatClassCondition(filterCond.seatClassList, passengerCount);
sortFilters.add(filter);
//Train Class
if(filterCond.trainClassList != null && !filterCond.trainClassList.isEmpty())
{
filter = new TrainClassCondition(filterCond.trainClassList);
sortFilters.add(filter);
}
//Train No: TODO
}
//TODO: delete
protected void init_old(Context context)
{
String conditions = AppConfig.getInstance().getPropConfig("td.ticket.sort.conditions");
String[] args = conditions.split(",");
for(String category : args)
{
String propName = "td.ticket.sort.cond." + category;
String value = AppConfig.getInstance().getPropConfig(propName);
SortFilter<TrainTicketInfo> filter = buildSortFilter(context, category, value);
if(filter != null)
{
sortFilters.add(filter);
}
}
}
private SortFilter<TrainTicketInfo> buildSortFilter(Context context, String category,
String value)
{
SortFilter<TrainTicketInfo> result = null;
if("0".equalsIgnoreCase(category))
{
if("Y".equalsIgnoreCase(value))
{
String from = MapUtils.getString(context, TdPNames.PARAM_FROM_STATION, "");
String to = MapUtils.getString(context, TdPNames.PARAM_TO_STATION, "");
result = new StationFromToCondition(from, to);
}
else
{
log.info("No need to exactly match the from-to station.");
}
}
else if("1".equalsIgnoreCase(category))
{
//TODO
}
else if("2".equalsIgnoreCase(category))
{
result = new TrainClassCondition(Arrays.asList(value.split(",")));
}
else if("3".equalsIgnoreCase(category))
{
}
else if("4".equalsIgnoreCase(category))
{
int passengerCount = MapUtils.getIntValue(context, TdPNames.PARAM_PASSENGER_COUNT, 1);
result = new SeatClassCondition(Arrays.asList(value.split(",")), passengerCount);
}
else
{
log.error("Unkown category filter: " + category);
}
return result;
}
private static class StationFromToCondition implements SortFilter<TrainTicketInfo>
{
private String from = null;
private String to = null;
public StationFromToCondition(String from, String to)
{
this.from = from;
this.to = to;
}
public int getCategory()
{
return TrainTicketInfo.CAT_STATION_FROM_TO;
}
public List<Boolean> getValues()
{
return null;
}
public boolean accept(TrainTicketInfo target)
{
if(from.equals(target.getFromStationName()) && to.equals(target.getToStationName()))
{
return true;
}
return false;
}
}
private static class TrainClassCondition implements SortFilter<TrainTicketInfo>
{
private List<?> values = null;
public TrainClassCondition(List<?> values)
{
this.values = values;
}
public int getCategory()
{
return TrainTicketInfo.CAT_TRAIN_CLASS;
}
public List<?> getValues()
{
return this.values;
}
public boolean accept(TrainTicketInfo target)
{
ComparableFilter<TrainTicketInfo, ?> acceptor = target.getColumn(getCategory(), getValues());
return acceptor.accept(target);
}
}
private static class SeatClassCondition implements SortFilter<TrainTicketInfo>
{
private List<Integer> values = null;
private int passengerCount = 1;
public SeatClassCondition(List<String> values, int passengerCount)
{
this.values = new ArrayList<Integer>();
for(String value : values)
{
value = value.trim();
try
{
Integer i = new Integer(value);
this.values.add(i);
}
catch(NumberFormatException e)
{
log.error("Failed to convert string [" + value + "] to number");
}
}
this.passengerCount = passengerCount;
}
public int getCategory()
{
return TrainTicketInfo.CAT_SEAT_CLASS;
}
public List<Integer> getValues()
{
return this.values;
}
public boolean accept(TrainTicketInfo target)
{
ComparableFilter<TrainTicketInfo, ?> acceptor = target.getColumn(getCategory(), getValues(), passengerCount);
return acceptor.accept(target);
}
}
public List<SortFilter<TrainTicketInfo>> build()
{
return sortFilters;
}
}