content: package hip.ch7.shortestpath;
  
  import org.apache.hadoop.io.Text;
  import org.apache.hadoop.mapreduce.Mapper;
  
  import java.io.IOException;
  
  public class Map
      extends Mapper<Text, Text, Text, Text> {
  
    private Text outKey = new Text();
    private Text outValue = new Text();
  
    @Override
    protected void map(Text key, Text value, Context context)
        throws IOException, InterruptedException {
  
      Node node = Node.fromMR(value.toString());
  
      System.out.println("input -> K[" + key + "],V[" + node + "]");
  
      // output this node's key/value pair again to preserve the information
      //
      System.out.println(
          "  output -> K[" + key + "],V[" + value + "]");
      context.write(key, value);
  
      // only output the neighbor details if we have an actual distance
      // from the source node
      //
      if (node.isDistanceSet()) {
        // our neighbors are just a hop away
        //
        int neighborDistance = node.getDistance() + 1;
  
        // create the backpointer, which will append our own
        // node name to the list
        //
        String backpointer = node.constructBackpointer(key.toString());
  
        // go through all the nodes and propagate the distance to them
        //
        for (int i = 0; i < node.getAdjacentNodeNames().length; i++) {
  
          String neighbor = node.getAdjacentNodeNames()[i];
  
          // output the neighbor with the propagated distance and backpointer
          //
          outKey.set(neighbor);
  
          Node adjacentNode = new Node()
              .setDistance(neighborDistance)
              .setBackpointer(backpointer);
  
          outValue.set(adjacentNode.toString());
          System.out.println(
              "  output -> K[" + outKey + "],V[" + outValue + "]");
          context.write(outKey, outValue);
        }
      }
    }
  }
  