Android Open Source - lifx-sdk-android L F X Routing Table






From Project

Back to project page lifx-sdk-android.

License

The source code is released under:

MIT License

If you think the Android project lifx-sdk-android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

//
//  LFXRoutingTable.java
//  LIFX//from  ww  w .  j  a va  2  s  .  c om
//
//  Created by Jarrod Boyes on 24/03/14.
//  Copyright (c) 2014 LIFX Labs. All rights reserved.
//

package lifx.java.android.network_context.internal.routing_table;

import java.util.ArrayList;
import java.util.HashMap;

import lifx.java.android.entities.internal.LFXBinaryPath;
import lifx.java.android.entities.internal.LFXBinaryTargetID;
import lifx.java.android.entities.internal.LFXDeviceMapping;
import lifx.java.android.entities.internal.LFXMessage;
import lifx.java.android.entities.internal.LFXSiteID;
import lifx.java.android.entities.internal.LFXTagMapping;
import lifx.java.android.entities.internal.LFXTarget;
import lifx.java.android.entities.internal.LFXBinaryTargetID.TagField;
import lifx.java.android.entities.internal.structle.LxProtocolDevice;
import lifx.java.android.entities.internal.structle.LxProtocolLight;
import lifx.java.android.entities.internal.structle.LxProtocol.Type;

public class LFXRoutingTable
{
  private HashMap<String,LFXDeviceMapping> mutableDeviceMappingsByDeviceID;
  private ArrayList<LFXTagMapping> mutableTagMappings;
  private ArrayList<LFXSiteID> mutableSiteIDs;  // Could be derived from DeviceMappings, but is cached separately for performance reasons

  public LFXRoutingTable()
  {
    super();
    mutableDeviceMappingsByDeviceID = new HashMap<String,LFXDeviceMapping>();
    mutableTagMappings = new ArrayList<LFXTagMapping>();
    mutableSiteIDs = new ArrayList<LFXSiteID>();
  }

  public ArrayList<LFXDeviceMapping> getDeviceMappings()
  {
    ArrayList<LFXDeviceMapping> mappings = new ArrayList<LFXDeviceMapping>();
    mappings.addAll( mutableDeviceMappingsByDeviceID.values());
    return mappings;
  }

  public ArrayList<LFXTagMapping> getTagMappings()
  {
    ArrayList<LFXTagMapping> mappings = new ArrayList<LFXTagMapping>();
    mappings.addAll( this.mutableTagMappings);
    return mappings;
  }

  public ArrayList<LFXSiteID> getSiteIDs()
  {
    ArrayList<LFXSiteID> siteIDs = new ArrayList<LFXSiteID>();
    siteIDs.addAll( this.mutableSiteIDs);
    return siteIDs;
  }

  public void updateMappingsFromMessage( LFXMessage message)
  {
    if( message.isAResponseMessage() == false) 
    {
      return;
    }
    
    updateSiteID( message.getPath().getSiteID());
    updateDeviceMappingWithDeviceIDSiteID( message.getPath().getBinaryTargetID().getStringValue(), message.getPath().getSiteID());
    
    if( message.getType() == Type.LX_PROTOCOL_LIGHT_STATE)
    {
      String path = message.getPath().getBinaryTargetID().getStringValue();
      LFXSiteID siteID = message.getPath().getSiteID();
      
      LxProtocolLight.State payload = (LxProtocolLight.State) message.getPayload();
      TagField tagField = new TagField();
      tagField.tagData = payload.getTags().getBytes();
      
      updateDeviceMappingWithDeviceID( path, siteID, tagField);
    }
    
    if( message.getType() == Type.LX_PROTOCOL_DEVICE_STATE_TAGS)
    {
      String path = message.getPath().getBinaryTargetID().getStringValue();
      LFXSiteID siteID = message.getPath().getSiteID();
      
      LxProtocolDevice.StateTags payload = (LxProtocolDevice.StateTags) message.getPayload();
      TagField tagField = new TagField();
      tagField.tagData = payload.getTags().getBytes();
      
      updateDeviceMappingWithDeviceID( path, siteID, tagField);
    }
    
    if( message.getType() == Type.LX_PROTOCOL_DEVICE_STATE_TAG_LABELS)
    {
      LFXSiteID siteID = message.getPath().getSiteID();
      
      LxProtocolDevice.StateTagLabels payload = (LxProtocolDevice.StateTagLabels) message.getPayload();
      TagField tagField = new TagField();
      tagField.tagData = payload.getTags().getBytes();
      
      ArrayList<TagField> singularTagFields = LFXBinaryTargetID.enumerateTagField( tagField);
      
      for( TagField aTagField : singularTagFields)
      {
        updateTagMappingWithTag( payload.getLabel(), siteID, aTagField);
      }
    }
  }

  public void updateSiteID( LFXSiteID siteID)
  {
    if( mutableSiteIDs.contains( siteID))
    {
      return;
    }
    
    mutableSiteIDs.add( siteID);
  }

  public void updateDeviceMappingWithDeviceIDSiteID( String deviceID, LFXSiteID siteID)
  {
    LFXDeviceMapping deviceMapping = getDeviceMappingForDeviceID( deviceID);
    
    if( deviceMapping == null)
    {
      deviceMapping = new LFXDeviceMapping();
      mutableDeviceMappingsByDeviceID.put( deviceID, deviceMapping);
    }
    
    deviceMapping.setDeviceID( deviceID);
    deviceMapping.setSiteID( siteID);
  }

  public void updateDeviceMappingWithDeviceID( String deviceID, LFXSiteID siteID, TagField tagField)
  {
    LFXDeviceMapping deviceMapping = getDeviceMappingForDeviceID( deviceID);
    
    if( deviceMapping == null)
    {
      deviceMapping = new LFXDeviceMapping();
      mutableDeviceMappingsByDeviceID.put( deviceID, deviceMapping);
    }
    
    deviceMapping.setDeviceID( deviceID);
    deviceMapping.setSiteID( siteID);
    deviceMapping.setTagField( tagField);
  }

  public void updateTagMappingWithTag( String tag, LFXSiteID siteID, TagField tagField)
  {
    if( siteID.isZeroSite()) 
    {
      return;
    }

    LFXTagMapping tagMapping = getTagMappingForSiteIDAndTagField( siteID, tagField);
    
    if( tag.length() > 0)
    {
      if( tagMapping == null)
      {
        tagMapping = new LFXTagMapping();
        mutableTagMappings.add( tagMapping);
      }
      
      tagMapping.setTag( tag);
      tagMapping.setSiteID( siteID);
      tagMapping.setTagField( tagField);
    }
    else
    {
      if( tagMapping != null)
      {
        mutableTagMappings.remove( tagMapping);
      }
    }
  }

  public void resetRoutingTable()
  {
    mutableDeviceMappingsByDeviceID.clear();
    mutableTagMappings.clear();
    mutableSiteIDs.clear();
  }

  public ArrayList<String> getAllTags()
  {
    ArrayList<String> allTags = new ArrayList<String>();
    
    for( LFXTagMapping aTagMapping : mutableTagMappings)
    {
      allTags.add( aTagMapping.getTag());
    }
    
    return allTags;
  }

  @SuppressWarnings( "unchecked")
  public ArrayList<LFXSiteID> getAllSiteIDs()
  {
    return (ArrayList<LFXSiteID>) mutableSiteIDs.clone();
  }

  public LFXDeviceMapping getDeviceMappingForDeviceID( String deviceID)
  {
    return mutableDeviceMappingsByDeviceID.get( deviceID);
  }

  public ArrayList<LFXDeviceMapping> getDeviceMappingsForSiteID( LFXSiteID siteID)
  {
    ArrayList<LFXDeviceMapping> deviceMappings = new ArrayList<LFXDeviceMapping>();
    
    for( LFXDeviceMapping aDeviceMapping : mutableDeviceMappingsByDeviceID.values())
    {
      if( aDeviceMapping.getSiteID().equals( siteID))
      {
        deviceMappings.add( aDeviceMapping);
      }
    }
    
    return deviceMappings;
  }

  public ArrayList<LFXDeviceMapping> getDeviceMappingsForSiteIDTagField( LFXSiteID siteID, TagField tagField)
  {
    ArrayList<LFXDeviceMapping> deviceMappings = new ArrayList<LFXDeviceMapping>();
    
    for( LFXDeviceMapping aDeviceMapping : mutableDeviceMappingsByDeviceID.values())
    {
      if( aDeviceMapping.getSiteID().equals( siteID) &&
        aDeviceMapping.getTagField().equals( tagField))
      {
        deviceMappings.add( aDeviceMapping);
      }
    }
    
    return deviceMappings;
  }

  public LFXTagMapping getTagMappingForSiteIDAndTagField( LFXSiteID siteID, TagField tagField)
  {
    for( LFXTagMapping aTagMapping : mutableTagMappings)
    {
      if( aTagMapping.getSiteID().equals( siteID) &&
        aTagMapping.getTagField().equals( tagField))
      {
        return aTagMapping;
      }
    }
    
    return null;
  }

  public ArrayList<LFXTagMapping> getTagMappingsForTag( String tag)
  {
    ArrayList<LFXTagMapping> tagMappings = new ArrayList<LFXTagMapping>();
    
    for( LFXTagMapping aTagMapping : mutableTagMappings)
    {
      if( aTagMapping.getTag().equals( tag))
      {
        tagMappings.add( aTagMapping);
      }
    }
    
    return tagMappings;
  }

  public ArrayList<LFXBinaryPath> getBinaryPathsForTarget( LFXTarget target)
  {
    ArrayList<LFXBinaryPath> returnPaths = new ArrayList<LFXBinaryPath>();
    
    switch( target.getTargetType())
    {
      case BROADCAST:
      {
        for( LFXSiteID aSiteID : mutableSiteIDs)
        {
          LFXBinaryPath path = LFXBinaryPath.getPathWithSiteIDAndTargetID( aSiteID, LFXBinaryTargetID.getBroadcastTargetID());
          returnPaths.add( path);
        }
        
        break;
      }
      case DEVICE:
      {
        // If we know what site the device is in, send it there, otherwise
        // send to each
        LFXDeviceMapping deviceMapping = getDeviceMappingForDeviceID( target.getDeviceID());
        
        if( deviceMapping != null)
        {
          LFXBinaryPath binaryPath = LFXBinaryPath.getPathWithSiteIDAndTargetID( deviceMapping.getSiteID(), LFXBinaryTargetID.getDeviceTargetIDWithString( target.getDeviceID()));// targetID:[LFXBinaryTargetID deviceTargetIDWithString:target.deviceID]];
          returnPaths.add( binaryPath);
          break;
        }
        
        for( LFXSiteID aSiteID : mutableSiteIDs)
        {
          LFXBinaryPath binaryPath = LFXBinaryPath.getPathWithSiteIDAndTargetID( aSiteID, LFXBinaryTargetID.getDeviceTargetIDWithString( target.getDeviceID()));
          returnPaths.add( binaryPath);
          // TODO: decide if to // break; here
        }
      }
      case TAG:
      {
        // Look up the Tag Mappings
        for( LFXTagMapping aTagMapping : getTagMappingsForTag( target.getTag()))
        {
          LFXBinaryTargetID targetID = LFXBinaryTargetID.getGroupTargetIDWithTagField( aTagMapping.getTagField());
          LFXBinaryPath binaryPath = LFXBinaryPath.getPathWithSiteIDAndTargetID( aTagMapping.getSiteID(), targetID);
          returnPaths.add( binaryPath);
        }
      }
    }
    
    return returnPaths;
  }

  public ArrayList<String> getDeviceIDsForBinaryPath( LFXBinaryPath binaryPath)
  {
    switch( binaryPath.getBinaryTargetID().getTargetType())
    {
      case BROADCAST:
      {
        ArrayList<String> deviceIds = new ArrayList<String>();
        
        for( LFXDeviceMapping aDeviceMapping : getDeviceMappingsForSiteID( binaryPath.getSiteID()))
        {
          deviceIds.add( aDeviceMapping.getDeviceId());
        }
        
        return deviceIds;
      }
      case DEVICE:
      {
        ArrayList<String> deviceIds = new ArrayList<String>();
        deviceIds.add( binaryPath.getBinaryTargetID().getStringValue());
        return deviceIds;
      }
      case TAG:
      {
        ArrayList<String> deviceIds = new ArrayList<String>();
        
        for( LFXDeviceMapping aDeviceMapping : getDeviceMappingsForSiteIDTagField( binaryPath.getSiteID(), binaryPath.getBinaryTargetID().getGroupTagField()))
        {
          deviceIds.add( aDeviceMapping.getDeviceId());
        }
        
        return deviceIds;        
      }
    }
    
    return new ArrayList<String>();
  }
  
  public ArrayList<LFXTagMapping> getTagMappingsForSiteIDAndTag( LFXSiteID siteID, String tag)
  {
    ArrayList<LFXTagMapping> mappings = new ArrayList<LFXTagMapping>();
    
    for( LFXTagMapping aMapping : mutableTagMappings)
    {
      if( aMapping.getSiteID().equals( siteID) && aMapping.getTag().equals( tag))  
      {
        mappings.add( aMapping);
      }
    }
    
    return mappings;
  }
}




Java Source Code List

com.example.lifx_sdk_samples.LFXSDKLightEditLabelActivity.java
com.example.lifx_sdk_samples.LFXSDKLightListAdapter.java
com.example.lifx_sdk_samples.LFXSDKLightPowerActivity.java
com.example.lifx_sdk_samples.LFXSDKLightRandomColorActivity.java
com.example.lifx_sdk_samples.LFXSDKSamplesActivity.java
com.example.lifx_sdk_samples.LFXSDKTaggedLightCollectionListAdapter.java
lifx.java.android.client.LFXClient.java
lifx.java.android.constant.LFXSDKConstants.java
lifx.java.android.entities.LFXHSBKColor.java
lifx.java.android.entities.LFXLightTarget.java
lifx.java.android.entities.LFXTypes.java
lifx.java.android.entities.internal.LFXBinaryPath.java
lifx.java.android.entities.internal.LFXBinaryTargetID.java
lifx.java.android.entities.internal.LFXBinaryTypes.java
lifx.java.android.entities.internal.LFXDeviceMapping.java
lifx.java.android.entities.internal.LFXGatewayDescriptor.java
lifx.java.android.entities.internal.LFXMessageObservationDescriptor.java
lifx.java.android.entities.internal.LFXMessage.java
lifx.java.android.entities.internal.LFXSiteID.java
lifx.java.android.entities.internal.LFXTagMapping.java
lifx.java.android.entities.internal.LFXTarget.java
lifx.java.android.entities.internal.structle.LxProtocolDevice.java
lifx.java.android.entities.internal.structle.LxProtocolLight.java
lifx.java.android.entities.internal.structle.LxProtocolSensor.java
lifx.java.android.entities.internal.structle.LxProtocolWan.java
lifx.java.android.entities.internal.structle.LxProtocolWifi.java
lifx.java.android.entities.internal.structle.LxProtocol.java
lifx.java.android.entities.internal.structle.Lx.java
lifx.java.android.entities.internal.structle.StructleTypes.java
lifx.java.android.internal.LFXWiFiObserver.java
lifx.java.android.light.LFXLightCollection.java
lifx.java.android.light.LFXLight.java
lifx.java.android.light.LFXTaggedLightCollection.java
lifx.java.android.light.internal.LFXAllLightsCollection.java
lifx.java.android.network_context.LFXNetworkContext.java
lifx.java.android.network_context.internal.routing_table.LFXRoutingTable.java
lifx.java.android.network_context.internal.transport_manager.LFXTransportManager.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXGatewayConnection.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXSocketGeneric.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXSocketTCP.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXSocketUDP.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXTCPGatewayConnection.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXUDPGatewayConnection.java
lifx.java.android.network_context.internal.transport_manager.lan.LFXLANTransportManager.java
lifx.java.android.network_context.internal.transport_manager.lan.gateway_discovery.LFXGatewayDiscoveryController.java
lifx.java.android.network_context.internal.transport_manager.lan.gateway_discovery.LFXGatewayDiscoveryTableEntry.java
lifx.java.android.util.LFXByteUtils.java
lifx.java.android.util.LFXLog.java
lifx.java.android.util.LFXNetworkUtils.java
lifx.java.android.util.LFXTimerUtils.java