import java.io.File;
import java.io.PrintWriter;
import java.io.IOException;
import java.security.AccessController;
import java.security.ProtectionDomain;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.text.MessageFormat;

public class PTest
{
  private static final String SUB_DIR = "ptestdir";
  private static final String FILE_TO_READ = "zdummy.txt";
  private static final String POLICY_FILE_NAME = "PTest.policy";
  
  private static final String POLICY_FILE =
    "grant codeBase \"file:JAR_FILE\" {\n" +
      "  permission java.io.FilePermission \"CUR_DIR/" + SUB_DIR + "/-\", \"write\";\n" +
      "  permission java.io.FilePermission \"CUR_DIR/" + SUB_DIR + "/-\", \"read\";\n" +
    "};\n";
  
  public static void main(String... args) throws Exception
  {
    File currentDirectory = new File(args[0]);
    boolean setupMode = (args.length > 1);

    if (setupMode)
    {
      File jarFile = new File(args[1]);
      File policyFile = new File(args[2]);
      setup(currentDirectory, jarFile, policyFile);
    }
    else
    {
      File subdir = new File(currentDirectory, SUB_DIR);
      File fileToRead = new File(subdir, FILE_TO_READ);
      checkFileExists(fileToRead.getAbsolutePath());
    }
  }

  private static void setup
    (File currentDirectory, File jarFile, File policyFile)
    throws Exception
  {
    // create the subdirectory
    File subdir = new File(currentDirectory, SUB_DIR);
    subdir.mkdir();

    String policyFileContents = POLICY_FILE
      .replace("JAR_FILE", jarFile.getAbsolutePath())
      .replace("CUR_DIR", currentDirectory.getAbsolutePath());
    writePolicyFile(policyFile, policyFileContents);
  }

  private static void writePolicyFile(File policyFile, String contents) throws Exception
  {
    PrintWriter pw = new PrintWriter(policyFile);
    pw.println(contents);
    pw.flush();
    pw.close();
  }


  private static void checkFileExists(final String fileName)
  {
    try
    {
      boolean fileExists =
        (
         AccessController.doPrivileged
         (
          new PrivilegedExceptionAction<Boolean>()
          {
            public Boolean run()
            throws SecurityException, IOException
            {
              println("Checking for existence of " + fileName);
              File f = new File(fileName);
              boolean exists = f.exists();
              return exists;
            }
          }
          )
         );

      println("'" + fileName + "' exists = " + fileExists);
    }
    catch (Throwable t) { printThrowable(t); }
  }

  private static void printThrowable(Throwable t)
  {
    println("Caught a " + t.getClass().getName() + " bearing this message: " + t.getMessage());
  }

  private static void println(String text) { System.out.println(text); }
}