public List<MutableShardRouting> shardsWithState(ShardRoutingState... state) {
   List<MutableShardRouting> shards = newArrayList();
   for (RoutingNode routingNode : this) {
     shards.addAll(routingNode.shardsWithState(state));
   }
   return shards;
 }
 public RoutingNodes(MetaData metaData, RoutingTable routingTable) {
   this.metaData = metaData;
   this.routingTable = routingTable;
   Map<String, List<MutableShardRouting>> nodesToShards = newHashMap();
   for (IndexRoutingTable indexRoutingTable : routingTable.indicesRouting().values()) {
     for (IndexShardRoutingTable indexShard : indexRoutingTable) {
       for (ShardRouting shard : indexShard) {
         if (shard.assignedToNode()) {
           List<MutableShardRouting> entries = nodesToShards.get(shard.currentNodeId());
           if (entries == null) {
             entries = newArrayList();
             nodesToShards.put(shard.currentNodeId(), entries);
           }
           entries.add(new MutableShardRouting(shard));
           if (shard.relocating()) {
             entries = nodesToShards.get(shard.relocatingNodeId());
             if (entries == null) {
               entries = newArrayList();
               nodesToShards.put(shard.relocatingNodeId(), entries);
             }
             // add the counterpart shard with relocatingNodeId reflecting the source from which
             // it's relocating from.
             entries.add(
                 new MutableShardRouting(
                     shard.index(),
                     shard.id(),
                     shard.relocatingNodeId(),
                     shard.currentNodeId(),
                     shard.primary(),
                     ShardRoutingState.INITIALIZING));
           }
         } else {
           unassigned.add(new MutableShardRouting(shard));
         }
       }
     }
   }
   for (Map.Entry<String, List<MutableShardRouting>> entry : nodesToShards.entrySet()) {
     String nodeId = entry.getKey();
     this.nodesToShards.put(nodeId, new RoutingNode(nodeId, entry.getValue()));
   }
 }
 public boolean hasUnassigned() {
   return !unassigned.isEmpty();
 }