package ext;

import java.io.*;
import java.util.*;
import java.text.*;

public class ACL_Windu2XML
{
	public static void main(String[] args) {
        if(args.length == 0)
        {
            System.out.println("Usage: java ext.ACL_Windu2XML [Path to Windu DomainPolicyRule.txt]");
            return;
        }
        else
        {
			SimpleDateFormat df = new SimpleDateFormat ("MMddyy_HHmmss", Locale.getDefault());
			java.util.Date tm = new java.util.Date();
			String dtStg = df.format(tm);

			inPath = new File(args[0]+"\\DomainPolicyRule.txt");
			outPath = new File(args[0]+"\\DomainPolicyRule_ACL_LoadFromFile_"+dtStg+".xml");
		}
		new ACL_Windu2XML();
	}

	public ACL_Windu2XML(){
		try
		{
            PrintWriter printwriter = new PrintWriter(new FileWriter(outPath));

			//System.out.println(top);
			printwriter.println((new StringBuilder()).append(top).toString());

			BufferedReader bufferedreader = new BufferedReader(new FileReader(inPath));
			List inList = new ArrayList();

			String line = "";
			while ((line = bufferedreader.readLine()) != null) {
				inList.add(line);
			}

			inStgArr = new String[inList.size()];
			inList.toArray(inStgArr);

			for( int y = 0; y < inStgArr.length; y++ ) {
				if (inStgArr[y].indexOf("[")> 0){
					domStg = "";
					domStgArr = new String[0];

					domStgArr = inStgArr[y].split("\\(");

					domStg = ltrim(domStgArr[0]);
					domStg = rtrim(domStg);
				}
				else if (inStgArr[y].indexOf("Rule for Type")> 0){
					ruleStgArr = new String[0];
					ruleStgArr = inStgArr[y].split("\\|");

					String typStg = ltrim(ruleStgArr[1]);
					typStg = rtrim(typStg);

					String st8Stg = ltrim(ruleStgArr[2]);
					st8Stg = rtrim(st8Stg);

					prinStgArr = ruleStgArr[3].split("- ");
					String prinStg = ltrim(prinStgArr[1]);
					prinStg = rtrim(prinStg);

					permlStgArr = ruleStgArr[4].split(",");
					char permC = permlStgArr[0].charAt(1);

					String tmpStg = permlStgArr[0].substring( 3, permlStgArr[0].length() );
					permlStgArr[0] = permlStgArr[0].substring( 3, permlStgArr[0].length() );

					permlList = new ArrayList();

					for( int a = 0; a < permlStgArr.length; a++ ) {
						String permlTstStg = "";
						permlTstStg = ltrim(permlStgArr[a]);
						permlTstStg = rtrim(permlTstStg);

						for( int b = 0; b < permlListArr.length; b++ ) {
							tmpPermlArr = permlListArr[b].split("=");

							if (permlTstStg.equals(tmpPermlArr[1])){
								permlList.add(tmpPermlArr[0]);
							}
						}
					}

					permTmpArr = new String[0];
					permTmpArr = new String[permlList.size()];
					permlList.toArray(permTmpArr);

					permlStg = "";
					int intTmp = permTmpArr.length;

					for( int d = 0; d < permTmpArr.length; d++ ) {
						if ( d == (intTmp-1) ) {
							permlStg += permTmpArr[d];
						}
						else {
							permlStg += permTmpArr[d]+"/";
						}
					}

					//System.out.println(beg+"\n\t"+usr);
					printwriter.println((new StringBuilder()).append(beg+"\n\t"+usr).toString());

					//System.out.println("\t"+domB+domStg+domE);
					printwriter.println((new StringBuilder()).append("\t"+domB+domStg+domE).toString());

					//System.out.println("\t"+typidB+typStg+typidE);
					printwriter.println((new StringBuilder()).append("\t"+typidB+typStg+typidE).toString());

					//System.out.println("\t"+permB+permC+permE);
					printwriter.println((new StringBuilder()).append("\t"+permB+permC+permE).toString());

					//System.out.println("\t"+prinB+prinStg+prinE);
					printwriter.println((new StringBuilder()).append("\t"+prinB+prinStg+prinE).toString());

					//System.out.println("\t"+permlB+permlStg+permlE);
					printwriter.println((new StringBuilder()).append("\t"+permlB+permlStg+permlE).toString());

					//System.out.println("\t"+st8B+st8Stg+st8E);
					printwriter.println((new StringBuilder()).append("\t"+st8B+st8Stg+st8E).toString());

					//System.out.println(end+"\n");
					printwriter.println((new StringBuilder()).append(end+"\n").toString());
				}
			}

			//System.out.println("\n"+fin);
			printwriter.println((new StringBuilder()).append("\n"+fin).toString());

			printwriter.flush();
			printwriter.close();
		}
		catch(Exception exception)
		{
			exception.printStackTrace();
		}
		System.exit(0);
	}

	/* remove leading whitespace */
	public static String ltrim(String source) {
		return source.replaceAll("^\\s+", "");
	}

	/* remove trailing whitespace */
	public static String rtrim(String source) {
		return source.replaceAll("\\s+$", "");
	}

	static String top		= "<?xml version=\"1.0\"?>\n<!DOCTYPE NmLoader SYSTEM \"standardX10.dtd\">\n<NmLoader>\n";
	static String beg		= "<csvAccessRule handler=\"wt.load.LoadUser.createAccessRule\">";

	static String usr		= "<csvuser></csvuser>";
	static String domB		= "<csvdomain>";
	static String domE		= "</csvdomain>";
	static String typidB	= "<csvtypeId>";
	static String typidE	= "</csvtypeId>";
	static String permB		= "<csvpermission>";
	static String permE		= "</csvpermission>";
	static String prinB		= "<csvprincipal>";
	static String prinE		= "</csvprincipal>";
	static String permlB	= "<csvpermissionList>";
	static String permlE	= "</csvpermissionList>";
	static String st8B		= "<csvstate>";
	static String st8E		= "</csvstate>";

	static String end		= "</csvAccessRule>";
	static String fin		= "</NmLoader>";

	static String permlListArr[] 	= {"-1=Full Control (All)","0=Read","1=Modify","2=Create","5=Delete","6=Administrative","7=Revise","8=New View Version","9=Change Permissions","10=Download","11=Modify Content","12=Change Domain","13=Create By Move","14=Change Context","15=Set State","16=Modify Identity"};

	static String[] inStgArr,domStgArr,ruleStgArr,prinStgArr;
	static String[] permlStgArr,tmpPermlArr,permTmpArr;
	static String domStg,permlStg;
	static File inPath,outPath;
	static List permlList;

	/*
	-1.value=Full Control (All)
	0.value=Read
	1.value=Modify
	2.value=Create
	5.value=Delete
	6.value=Administrative
	7.value=Revise
	8.value=New View Version
	9.value=Change Permissions
	10.value=Download
	11.value=Modify Content
	12.value=Change Domain
	13.value=Create By Move
	14.value=Change Context
	15.value=Set State
	16.value=Modify Identity

	<?xml version="1.0"?>
	<!DOCTYPE NmLoader SYSTEM "standardX05.dtd">
	<NmLoader>
	<csvAccessRule handler="wt.load.LoadUser.createAccessRule">
		<csvuser></csvuser>
		<csvdomain>[/wt.inf.container.OrgContainer=DJ_WC]/System</csvdomain>
		<csvtypeId>wt.inf.team.ContainerTeam</csvtypeId>
		<csvpermission>+</csvpermission>
		<csvprincipal>Shared Team Creator</csvprincipal>
		<csvpermissionList>0/1/2/5</csvpermissionList>
		<csvstate>ALL</csvstate>
	</csvAccessRule>
	</NmLoader>
	*/
}
