/*
* Copyright 2003,2004,2005 Colin Crist
*
* 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 hermes.fix;
import java.util.HashSet;
import java.util.Set;
import java.util.Vector;
import org.apache.log4j.Logger;
import quickfix.field.ClOrdID;
import quickfix.field.OrigClOrdID;
/**
* @author colincrist@hermesjms.com
* @version $Id: ChainByClOrdID.java,v 1.5 2006/08/01 07:29:35 colincrist Exp $
*/
public class ChainByClOrdID
{
private static final Logger log = Logger.getLogger(ChainByClOrdID.class);
private FIXMessageTable messages;
private Set<String> baseTypes = new HashSet<String>() ;
private Set<String> followTypes = new HashSet<String>() ;
private Set<String> orderIds = new HashSet<String> () ;
public ChainByClOrdID(FIXMessageTable messages)
{
this.messages = messages;
baseTypes.add("8") ;
baseTypes.add("9") ;
baseTypes.add("D") ;
followTypes.add("F") ;
followTypes.add("G") ;
}
public boolean canChain(FIXMessage message) throws FIXException
{
final String s = message.getMsgType() ;
return baseTypes.contains(s) || followTypes.contains(s) ;
}
private boolean matches(FIXMessage message)
{
try
{
if (baseTypes.contains(message.getMsgType()))
{
if (orderIds.contains(message.getString(ClOrdID.FIELD)))
{
return true ;
}
}
else if (followTypes.contains(message.getMsgType()))
{
if (orderIds.contains(message.getString(OrigClOrdID.FIELD)))
{
orderIds.add(message.getString(OrigClOrdID.FIELD)) ;
return true ;
}
if (orderIds.contains(message.getString(ClOrdID.FIELD)))
{
orderIds.add(message.getString(OrigClOrdID.FIELD)) ;
return true ;
}
}
}
catch (Exception ex)
{
log.error(ex.getMessage(), ex);
}
return false ;
}
public int filterByClOrdID(String clOrdID, FIXMessageListener listener, int startRow)
{
int nmessages = 0 ;
orderIds.add(clOrdID) ;
Vector<FIXMessage> cached = new Vector<FIXMessage> () ;
for (int row = startRow ; row >= 0 ; row-- )
{
FIXMessage message = messages.getMessageAt(row) ;
if (matches(message))
{
cached.add(0, message) ;
}
}
for (FIXMessage message : cached)
{
listener.onMessage(message) ;
nmessages++ ;
}
for (int row = startRow + 1; row < messages.getRowCount() ; row++ )
{
FIXMessage message = messages.getMessageAt(row) ;
if (matches(message))
{
listener.onMessage(message) ;
nmessages++ ;
}
}
return nmessages ;
}
}