code: public void run()
          throws ExecutionException
      {
          // Check parameters are initialized.
          checkParameters();
  
          // Initialize targets.
          for ( ExecutionTarget target : getTargets() )
          {
              try
              {
                  target.init();
              }
              catch ( ExecutionTargetInitializationException e )
              {
                  throw new ExecutionException( e.getMessage() );
              }
          }
  
          // Process files.
          for ( ChecksumFile file : getFiles() )
          {
              for ( String algorithm : getAlgorithms() )
              {
                  try
                  {
                      // Calculate the hash for the file/algo
                      FileDigester digester = DigesterFactory.getInstance().getFileDigester( algorithm );
                      String hash = digester.calculate( file.getFile() );
  
                      // Write it to each target defined
                      for ( ExecutionTarget target : getTargets() )
                      {
                          try
                          {
                              target.write( hash, file, algorithm );
                          }
                          catch ( ExecutionTargetWriteException e )
                          {
                              throw new ExecutionException( e.getMessage() );
                          }
                      }
                  }
                  catch ( NoSuchAlgorithmException e )
                  {
                      throw new ExecutionException( "Unsupported algorithm " + algorithm + "." );
                  }
                  catch ( DigesterException e )
                  {
                      throw new ExecutionException(
                          "Unable to calculate " + algorithm + " hash for " + file.getFile().getName() + ": " + e.getMessage() );
                  }
              }
          }
  
          // Close targets.
          for ( ExecutionTarget target : getTargets() )
          {
              try
              {
                  target.close( subPath );
              }
              catch ( ExecutionTargetCloseException e )
              {
                  throw new ExecutionException( e.getMessage() );
              }
          }
      }
docs: {@inheritDoc}