package org.juxtapose.fxtradingclient; import static org.juxtapose.fxtradingclient.ViewDataObjectState.*; import static org.juxtapose.fxtradingclient.tools.ClientViewMethods.createEntryKey; import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; import org.juxtapose.streamline.producer.ISTMEntryKey; import org.juxtapose.streamline.tools.DataConstants; import org.juxtapose.streamline.util.PersistentArrayList; import org.juxtapose.streamline.util.data.DataType; import org.juxtapose.streamline.util.data.DataTypeArrayList; import com.trifork.clj_ds.IPersistentMap; import com.trifork.clj_ds.PersistentHashMap; /** * @author Pontus J�rgne * 3 jun 2013 * Copyright (c) Pontus J�rgne. All rights reserved */ public class ViewDataObject { ViewDataObjectState state; IPersistentMap<String, DataType<?>> metaData; IPersistentMap<String, DataType<?>> data; String service; String type; PersistentArrayList<DataType<?>> keyList; ISTMEntryKey entryKey; HashSet<String> updatedKeys = new HashSet<String>(); public ViewDataObject( String inService, String inType, IPersistentMap<String, DataType<?>> inData, IPersistentMap<String, DataType<?>> inMetaData ) { data = inData; metaData = inMetaData; service = inService; type = inType; DataTypeArrayList listType = (DataTypeArrayList)inMetaData.valAt( DataConstants.FIELD_KEYS ); if( listType != null ) keyList = (PersistentArrayList<DataType<?>>) listType.get(); entryKey = createEntryKey( service, type, keyList, inData ); state = CREATED; updatedKeys.clear(); } public ViewDataObject( String inService, String inType, IPersistentMap<String, DataType<?>> inData, IPersistentMap<String, DataType<?>> inMetaData, ISTMEntryKey inEntryKey ) { data = inData; metaData = inMetaData; service = inService; type = inType; DataTypeArrayList listType = (DataTypeArrayList)inMetaData.valAt( DataConstants.FIELD_KEYS ); if( listType != null ) keyList = (PersistentArrayList<DataType<?>>) listType.get(); entryKey = inEntryKey; state = MIRROR; updatedKeys.clear(); } public void updateData( IPersistentMap<String, DataType<?>> inData, String inKey ) { data = inData; entryKey = createEntryKey( service, type, keyList, inData ); state = state == MIRROR ? UPDATED : state; updatedKeys.add( inKey ); } public IPersistentMap<String, DataType<?>> getData() { return data; } public String validate() { Iterator<Entry<String, DataType<?>>> iter = metaData.iterator(); while( iter.hasNext() ) { Entry<String, DataType<?>> entry = iter.next(); if( !DataConstants.FIELD_KEYS.equals( entry.getKey() )) { if( data.valAt( entry.getKey() ) == null ) { return "Required field "+entry.getKey()+" is missing "; } } } if( entryKey == null ) return "Entry key could not be created"; return null; } public void setData( IPersistentMap<String, DataType<?>> inData ) { data = inData; entryKey = createEntryKey( service, type, keyList, inData ); updatedKeys.clear(); state = MIRROR; } public ISTMEntryKey getKey() { return entryKey; } public ViewDataObjectState getState() { return state; } public IPersistentMap<String, DataType<?>> getUpdateData() { IPersistentMap<String, DataType<?>> updateData = PersistentHashMap.EMPTY; for( String key : updatedKeys ) { DataType<?> dt = data.valAt( key ); if( dt != null ) updateData = updateData.assoc( key, dt ); } return updateData; } }