package org.juxtapose.fxtradingclient; import java.awt.event.ContainerListener; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; import org.juxtapose.streamline.producer.ISTMEntryKey; import org.juxtapose.streamline.tools.STMUtil; import org.juxtapose.streamline.util.ISTMContainerListener; import org.juxtapose.streamline.util.ISTMEntry; import org.juxtapose.streamline.util.ISTMEntryListener; import org.juxtapose.streamline.util.STMEntrySubscriber; import org.juxtapose.streamline.util.data.DataType; import org.juxtapose.streamline.util.data.DataTypeLazyRef; import org.juxtapose.streamline.util.data.DataTypeNull; import com.trifork.clj_ds.IPersistentMap; public class ContainerSubscriber extends STMEntrySubscriber implements ISTMEntryListener { HashMap<String, STMEntrySubscriber> entryToSubscribers = new HashMap<String, STMEntrySubscriber>(); ArrayList<ISTMContainerListener> containerListeners = new ArrayList<ISTMContainerListener>(); @Override public void queryNotAvailible( Object inTag ) { // TODO Auto-generated method stub } private void fieldUpdated( DataType<?> inValue ) { if( inValue instanceof DataTypeNull ) { System.out.println("Should delete data "); } else if( inValue instanceof DataTypeLazyRef ) { DataTypeLazyRef lRef = (DataTypeLazyRef)inValue; if( entryToSubscribers.get( lRef.get().toString() ) != null ) return; STMEntrySubscriber subscriber = new STMEntrySubscriber() { @Override public void queryNotAvailible( Object inTag ) { } @Override public void updateData( ISTMEntryKey inKey, ISTMEntry inData, boolean inFullUpdate ) { super.updateData( inKey, inData, inFullUpdate ); System.out.println("got reference data for "+inData.getDataMap()); updateListeners( inKey, inData, inFullUpdate ); } }; entryToSubscribers.put( lRef.get().toString(), subscriber ); subscriber.addListener( this ); subscriber.initialize( stm, lRef.get() ); } } private void doFullUpdate( ISTMEntry inData ) { Iterator<Entry<String, DataType<?>>> iter = inData.getDataMap().iterator(); while( iter.hasNext() ) { Entry<String, DataType<?>> entry = iter.next(); fieldUpdated( entry.getValue() ); } } private void doPartialUpdate( ISTMEntry inData ) { IPersistentMap<String, DataType<?>> data = inData.getDataMap(); Set<String> deltaSet = inData.getDeltaSet(); for( String s : deltaSet ) { DataType<?> value = data.valAt( s ); fieldUpdated( value ); } } @Override public void updateData( ISTMEntryKey inKey, ISTMEntry inData, boolean inFullUpdate ) { if( inFullUpdate ) { doFullUpdate( inData ); } else { doPartialUpdate( inData); } updateListeners( inKey, inData, inFullUpdate ); } public void addContainerListener( ISTMContainerListener inContainerListener ) { assert !containerListeners.contains( inContainerListener ) : "Listener is already added to container"; containerListeners.add( inContainerListener ); for( STMEntrySubscriber subscriber : entryToSubscribers.values() ) { ISTMEntry entry = subscriber.getLastUpdate(); if( STMUtil.isStatusOk( entry )) { inContainerListener.onContainerRefAdded( subscriber.getEntryKey(), entry ); } } } public void removeContainerListener( ISTMContainerListener inContainerListener ) { assert containerListeners.contains( inContainerListener ) : "Listener is not attached to container"; containerListeners.remove( inContainerListener ); } @Override public void STMEntryUpdated( ISTMEntryKey inKey, ISTMEntry inEntry, boolean inFullUpdate ) { if( STMUtil.isStatusUpdatedToOk( inEntry, inFullUpdate )) updateListeners( inKey, inEntry ); } /** * @param inKey * @param inEntry */ private void updateListeners( ISTMEntryKey inKey, ISTMEntry inEntry ) { System.out.println("updatign reference listenrs"); for( ISTMContainerListener listener : containerListeners ) { listener.onContainerRefAdded( inKey, inEntry ); } } }