import java.util.LinkedList;
import java.util.List;
import qual.Encrypted;

abstract class EncryptionDemo {

  public @Encrypted String encrypt(String text) {
    byte[] b = text.getBytes();
    for (int i = 0; i < b.length; b[i++]++) {
      // side effect is in increment expression of for loop
    }
    // :: warning: (cast.unsafe)
    return (@Encrypted String) new String(b);
  }

  // Only send encrypted data!
  abstract void sendOverTheInternet(@Encrypted String msg);

  void sendText() {
    @Encrypted String s = encrypt("foo"); // valid
    sendOverTheInternet(s); // valid

    String t = encrypt("bar"); // valid (subtype)
    sendOverTheInternet(t); // valid (flow)

    List<@Encrypted String> lst = new LinkedList<@Encrypted String>();
    lst.add(s);
    lst.add(t);

    for (String str : lst) // valid
    sendOverTheInternet(str);
  }

  void sendPassword() {
    String password = "unencrypted";
    sendOverTheInternet(password); // invalid
  }
}
