package org.juxtapose.streamline.util.producerservices; import java.util.HashSet; import org.juxtapose.streamline.producer.ISTMEntryKey; import org.juxtapose.streamline.producer.executor.IExecutor; import org.juxtapose.streamline.stm.ISTM; import org.juxtapose.streamline.util.ISTMEntrySubscriber; import org.juxtapose.streamline.util.ISTMEntry; import org.juxtapose.streamline.util.Status; /** * @author Pontus J�rgne * Jan 7, 2012 * Copyright (c) Pontus J�rgne. All rights reserved * * Class to initiate subscription and hence creation of predefined data, effectively making them cached and available throughout the life of the producer. * Running during startup in single thread context and does not need sync. * DataInitializer should only be used to initialize services. */ public class DataInitializer implements ISTMEntrySubscriber { private final HashSet<ISTMEntryKey> keys = new HashSet<ISTMEntryKey>(); private final ISTM stm; private volatile boolean allOK = false; private final IDataInitializerListener listener; private final int priority; /** * @param inSTM * @param inListener * @param inPriority */ public DataInitializer( ISTM inSTM, IDataInitializerListener inListener, int inPriority ) { stm = inSTM; listener = inListener; priority = inPriority; } public DataInitializer( ISTM inSTM, IDataInitializerListener inListener ) { this(inSTM, inListener, IExecutor.LOW ); } /** * @param inSTM * @param inListener * @param inPriority * @param inKeys */ public DataInitializer( ISTM inSTM, IDataInitializerListener inListener, int inPriority, ISTMEntryKey... inKeys ) { stm = inSTM; listener = inListener; priority = inPriority; for( ISTMEntryKey key : inKeys ) { addDataKey( key ); } } public DataInitializer( ISTM inSTM, IDataInitializerListener inListener, ISTMEntryKey... inKeys ) { this(inSTM, inListener, IExecutor.LOW, inKeys ); } /** * @param inKey */ public void addDataKey( ISTMEntryKey inKey ) { keys.add( inKey ); } public void init() { for( ISTMEntryKey key : keys.toArray( new ISTMEntryKey[]{} ) ) { stm.subscribeToData( key, this ); } } /* (non-Javadoc) * @see org.juxtapose.streamline.util.ISTMEntrySubscriber#updateData(org.juxtapose.streamline.producer.ISTMEntryKey, org.juxtapose.streamline.util.ISTMEntry, boolean) */ @Override public void updateData( ISTMEntryKey inKey, ISTMEntry inData, boolean inFirstUpdate ) { if( allOK ) return; synchronized( keys ) { if( inData.getStatus() == Status.OK ) { keys.remove( inKey ); } if( keys.isEmpty() ) { allOK = true; } } if( allOK ) { listener.dataInitialized(); } } @Override public int getPriority() { return priority; } }