/*
* Copyright (C) 2012 Benjamin Boksa (http://www.boksa.de/)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.boksa.rt.rest.response.parser;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import de.boksa.rt.model.RTTicket;
import de.boksa.rt.rest.RTRESTResponse;
import de.boksa.rt.rest.response.parser.processor.FieldProcessor;
import de.boksa.rt.rest.response.parser.processor.FieldProcessorRegistry;
public final class MultilineTicketSearchResponseParser implements TicketSearchResponseParser {
private static MultilineTicketSearchResponseParser SINGLETON = new MultilineTicketSearchResponseParser();
private MultilineTicketSearchResponseParser() { }
public static MultilineTicketSearchResponseParser getInstance() {
return SINGLETON;
}
private static final String DELIMITER_TICKETS = "\n\n--\n\n";
private static final String DELIMITER_TICKET_LINES = "\n";
private static final Pattern PATTERN_START_FIELD = Pattern.compile("^(.*?): ?(.*)");
@Override
public List<RTTicket> parseTicketSearchResponse(RTRESTResponse response) {
List<Map<String,String>> resultData = new LinkedList<Map<String,String>>();
for (String ticketString : response.getBody().split(DELIMITER_TICKETS)) {
Map<String,String> ticketData = new HashMap<String,String>();
String fieldName = null;
StringBuffer tmp = new StringBuffer();
for (String ticketLine : ticketString.split(DELIMITER_TICKET_LINES)) {
Matcher m = PATTERN_START_FIELD.matcher(ticketLine);
if (m.matches()) {
if (fieldName != null) {
ticketData.put(fieldName, tmp.toString());
tmp.setLength(0); // delete the buffer
}
fieldName = m.group(1);
tmp.append(m.group(2));
} else {
tmp.append(ticketLine);
}
}
ticketData.put(fieldName, tmp.toString());
resultData.add(ticketData);
}
return MultilineTicketSearchResponseParser.processResultData(resultData);
}
private static List<RTTicket> processResultData(List<Map<String,String>> resultData) {
List<RTTicket> result = new LinkedList<RTTicket>();
for (Map<String,String> ticketData : resultData) {
result.add(MultilineTicketSearchResponseParser.processTicketData(ticketData));
}
return result;
}
private static RTTicket processTicketData(Map<String,String> ticketData) {
RTTicket ticket = new RTTicket();
FieldProcessor fieldProcessor = null;
for (Entry<String,String> e : ticketData.entrySet()) {
fieldProcessor = FieldProcessorRegistry.getInstance().getTicketFieldProcessor(ticket, e.getKey());
fieldProcessor.process(ticket, e.getKey(), e.getValue());
}
return ticket;
}
}