package in.partake.controller.action.event;
import in.partake.base.Pair;
import in.partake.base.PartakeException;
import in.partake.controller.action.AbstractPartakeAction;
import in.partake.model.EventEx;
import in.partake.model.EventTicketHolderList;
import in.partake.model.UserEx;
import in.partake.model.UserTicketEx;
import in.partake.model.dao.DAOException;
import in.partake.model.dto.EventTicket;
import in.partake.model.dto.auxiliary.EnqueteQuestion;
import in.partake.resource.ServerErrorCode;
import in.partake.resource.UserErrorCode;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import play.mvc.Result;
import au.com.bytecode.opencsv.CSVWriter;
public class ShowParticipantsCSVAction extends AbstractPartakeAction {
String eventId;
public static Result get(String eventId) throws DAOException, PartakeException {
ShowParticipantsCSVAction action = new ShowParticipantsCSVAction();
action.eventId = eventId;
return action.execute();
}
@Override
protected Result doExecute() throws DAOException, PartakeException {
UserEx user = ensureLogin();
checkIdParameterIsValid(eventId, UserErrorCode.INVALID_NOTFOUND, UserErrorCode.INVALID_NOTFOUND);
ParticipantsListTransaction transaction = new ParticipantsListTransaction(user, eventId);
transaction.execute();
EventEx event = transaction.getEvent();
List<Pair<EventTicket, EventTicketHolderList>> ticketAndHolders = transaction.getTicketAndHolders();
Map<String, List<String>> userTicketInfoMap = transaction.getUserTicketInfoMap();
try {
byte[] body = createCSVInputStream(event, ticketAndHolders, userTicketInfoMap);
return render(body, "text/csv; charset=UTF-8", "attachment");
} catch (IOException e) {
return renderError(ServerErrorCode.ERROR_IO, e);
}
}
private byte[] createCSVInputStream(EventEx event, List<Pair<EventTicket, EventTicketHolderList>> ticketAndHolders, Map<String, List<String>> userTicketInfoMap) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
CSVWriter writer = new CSVWriter(new OutputStreamWriter(baos, Charset.forName("UTF-8")));
writeHeader(writer, event);
for (int i = 0; i < ticketAndHolders.size(); ++i) {
EventTicket ticket = ticketAndHolders.get(i).getFirst();
EventTicketHolderList list = ticketAndHolders.get(i).getSecond();
writeTicket(writer, event, ticket, list, i, userTicketInfoMap);
}
writer.flush();
writer.close();
return baos.toByteArray();
}
private void writeHeader(CSVWriter writer, EventEx event) {
List<String> headers = new ArrayList<String>();
headers.add("チケット名");
headers.add("順番");
headers.add("名前");
headers.add("予約状況");
headers.add("コメント");
headers.add("登録日時");
headers.add("出欠状況");
if (event.getEnquetes() != null && !event.getEnquetes().isEmpty()) {
for (EnqueteQuestion question : event.getEnquetes())
headers.add(question.getText());
}
writer.writeNext(headers.toArray(new String[0]));
}
private void writeTicket(CSVWriter writer, EventEx event, EventTicket ticket, EventTicketHolderList holderList, int ticketIndex, Map<String, List<String>> userTicketInfoMap) {
int order = 0;
for (UserTicketEx userTicket : holderList.getEnrolledParticipations()) {
List<String> body = new ArrayList<String>();
body.add(ticket.getName());
body.add(String.valueOf(++order));
body.add(userTicket.getUser().getScreenName());
body.add(userTicket.getStatus().toHumanReadableString(false));
body.add(userTicket.getComment());
body.add(userTicket.getAppliedAt().toHumanReadableFormat());
body.add(userTicket.getAttendanceStatus().toHumanReadableString());
if (event.getEnquetes() != null && !event.getEnquetes().isEmpty()) {
for (EnqueteQuestion question : event.getEnquetes()) {
List<String> values = userTicket.getEnqueteAnswers().get(question.getId());
body.add(values != null ? StringUtils.join(values.iterator(), ',') : "");
}
}
writer.writeNext(body.toArray(new String[0]));
}
for (UserTicketEx userTicket : holderList.getSpareParticipations()) {
List<String> body = new ArrayList<String>();
body.add(ticket.getName());
body.add(String.valueOf(++order));
body.add(userTicket.getUser().getScreenName());
body.add(userTicket.getStatus().toHumanReadableString(false));
body.add(userTicket.getComment());
body.add(userTicket.getAppliedAt().toHumanReadableFormat());
body.add(userTicket.getAttendanceStatus().toHumanReadableString());
if (event.getEnquetes() != null && !event.getEnquetes().isEmpty()) {
for (EnqueteQuestion question : event.getEnquetes()) {
List<String> values = userTicket.getEnqueteAnswers().get(question.getId());
body.add(values != null ? StringUtils.join(values.iterator(), ',') : "");
}
}
writer.writeNext(body.toArray(new String[0]));
}
}
}