package org.marketcetera.orderloader.system; import org.marketcetera.util.misc.ClassVersion; import org.marketcetera.util.log.I18NBoundMessage3P; import org.marketcetera.util.log.I18NBoundMessage2P; import org.marketcetera.trade.OrderSingle; import org.marketcetera.orderloader.OrderParsingException; import org.marketcetera.orderloader.Messages; import org.marketcetera.core.Pair; import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.LinkedList; /** * A field processor that extracts custom fields from an order row * and sets it on the supplied order instance. * * @author anshul@marketcetera.com * @version $Id: CustomFieldProcessor.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.0.0 */ @ClassVersion("$Id: CustomFieldProcessor.java 16154 2012-07-14 16:34:05Z colin $") final class CustomFieldProcessor implements FieldProcessor { @Override public void apply(String[] inRow, OrderSingle inOrder) throws OrderParsingException { Map<String,String> customs = new HashMap<String, String>(); for(Pair<Integer,String> custom: mCustomFields) { customs.put(custom.getSecondMember(), inRow[custom.getFirstMember()]); } inOrder.setCustomFields(customs); } /** * Add the custom field to the processor. * * @param inIndex the column index of the custom field. * @param inHeader the column header value. * * @throws OrderParsingException if the header value is not numeric or * if a duplicate header was specified. */ public void addField(int inIndex, String inHeader) throws OrderParsingException { try { int header = Integer.parseInt(inHeader); Integer oldIndex = mHeaders.put(header, inIndex); mCustomFields.add(new Pair<Integer,String>(inIndex, inHeader)); if (oldIndex != null) { //We have a duplicate throw new OrderParsingException(new I18NBoundMessage3P( Messages.DUPLICATE_HEADER, inHeader, oldIndex, inIndex)); } } catch (NumberFormatException e) { throw new OrderParsingException(e, new I18NBoundMessage2P( Messages.INVALID_CUSTOM_HEADER, inHeader, inIndex)); } } /** * If no custom fields will be processed by this processor. * * @return true if no custom fields will be processed by this processor. */ public boolean isEmpty() { return mCustomFields.isEmpty(); } private final List<Pair<Integer,String>> mCustomFields = new LinkedList<Pair<Integer, String>>(); private final Map<Integer,Integer> mHeaders = new HashMap<Integer,Integer>(); }