package ext;

import java.io.*;
import java.util.*;
import java.text.*;

public class ACL_Windu_2_XML_TXT
{
	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();
			dtStg = df.format(tm);

			inArgPath = args[0];

			inPath = new File(inArgPath+"\\DomainPolicyRule.txt");
			outPath = new File(inArgPath+"\\ACL_LoadFromFile_"+dtStg+".xml");
			outList = new File(inArgPath+"\\ACL_FileList_"+dtStg+".txt");
		}

		try
		{
			PrintWriter prwr = new PrintWriter(new FileWriter(outPath));
			PrintWriter prwrList = new PrintWriter(new FileWriter(outList));

			prwr.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){
					if ( y < 5 ) { xmlOut = top+"\n"; }
					if ( tmpInt > 0 && tmpInt < y ) {
						xmlOut += fin+"\n";
						outpath_sh = new File(inArgPath+"\\"+TotOut+"_"+dtStg+".xml");
						prwrsh = new PrintWriter(new FileWriter(outpath_sh));
						prwrsh.println((new StringBuilder()).append(xmlOut).toString());
						prwrsh.flush();
						prwrsh.close();
						xmlOut = top+"\n";
					}

					tmpInt = y;
					condomStg = "";
					TotOut = "";
					AccOut = "";
					TdomOut = "";
					TconOut = "";

					condomStgArr = new String[0];
					condomStgArr = inStgArr[y].split("\\(");
					condomStg = ltrim(condomStgArr[0]);
					condomStg = rtrim(condomStg);

					AccOut = condomStg+"\n";
					condomSp = condomStg.split("\\]");		// Split Container & Domain

					// Org - Container
					conStg = condomSp[0];					// Container
					conSp = conStg.split("\\/");			// Container Split
					conSpEq = new String[0];

					if (conSp.length < 2 ){ TconOut = "Root"; }
					else {
						for( int z = 1; z < conSp.length; z++ ) {
							conSpEq = conSp[z].split("\\=");
							conOut = conSpEq[1];

							if (conOut.indexOf(" ")> 0){ conOut = conOut.replaceAll(" ", "_"); }
							if ( z > 1 ) { TconOut = TconOut +"-"+ conOut; }
							else if (conOut.equals("/")) { TconOut = "Root"; }
							else { TconOut = conOut; }
						}
					}

					// Domain
					domStg = condomSp[1];

					if (domStg.equals("/") ) { TdomOut = "Root"; }
					else {
						domSp = domStg.split("\\/");		// Domain Split
						domSpEq = new String[0];
						domOut = "";

						for( int x = 0; x < domSp.length; x++ ) {
							domOut = domSp[x];

							if (domOut.indexOf(" ")> 0){ domOut = domOut.replaceAll(" ", "_"); }
							if (x > 1 ) { TdomOut = TdomOut +"-"+ domOut; }
							else { TdomOut = domOut; }
						}
					}

					TotOut = TdomOut +"."+ TconOut;
					if (condomStg.equals("[/]/") ) { TotOut = "Root.Root"; }

					System.out.println(condomStg+"\n\t"+TotOut+"\n");
					prwrList.println((new StringBuilder()).append(condomStg+"\n\t"+TotOut+"\n").toString());
				}
				else if (inStgArr[y].indexOf("Rule for Type")> 0){
					ruleStgArr = new String[0];
					ruleStgArr = inStgArr[y].split("\\|");

					String ruleStg = ruleStgArr[1]+"|"+ruleStgArr[2]+"|"+ruleStgArr[3]+"|"+ruleStgArr[4];
					AccOut += ruleStg+"\n";

					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);
					xmlOut += beg+"\n\t"+usr+"\n";
					prwr.println((new StringBuilder()).append(beg+"\n\t"+usr).toString());

					//System.out.println("\t"+domB+condomStg+domE);
					xmlOut += "\t"+domB+condomStg+domE+"\n";
					prwr.println((new StringBuilder()).append("\t"+domB+condomStg+domE).toString());

					//System.out.println("\t"+typidB+typStg+typidE);
					xmlOut += "\t"+typidB+typStg+typidE+"\n";
					prwr.println((new StringBuilder()).append("\t"+typidB+typStg+typidE).toString());

					//System.out.println("\t"+permB+permC+permE);
					xmlOut += "\t"+permB+permC+permE+"\n";
					prwr.println((new StringBuilder()).append("\t"+permB+permC+permE).toString());

					//System.out.println("\t"+prinB+prinStg+prinE);
					xmlOut += "\t"+prinB+prinStg+prinE+"\n";
					prwr.println((new StringBuilder()).append("\t"+prinB+prinStg+prinE).toString());

					//System.out.println("\t"+permlB+permlStg+permlE);
					xmlOut += "\t"+permlB+permlStg+permlE+"\n";
					prwr.println((new StringBuilder()).append("\t"+permlB+permlStg+permlE).toString());

					//System.out.println("\t"+st8B+st8Stg+st8E);
					xmlOut += "\t"+st8B+st8Stg+st8E+"\n";
					prwr.println((new StringBuilder()).append("\t"+st8B+st8Stg+st8E).toString());

					//System.out.println(end+"\n");
					xmlOut += end+"\n\n";
					prwr.println((new StringBuilder()).append(end+"\n").toString());

					if ( y == inStgArr.length-1 ) {
						xmlOut += fin+"\n";
						outpath_sh = new File(inArgPath+"\\"+TotOut+"_"+dtStg+".xml");
						prwrsh = new PrintWriter(new FileWriter(outpath_sh));
						prwrsh.println((new StringBuilder()).append(xmlOut).toString());
						prwrsh.flush();
						prwrsh.close();
					}
				}

				outpath_sh = new File(inArgPath+"\\"+TotOut+"_"+dtStg+".txt");
				prwrsh = new PrintWriter(new FileWriter(outpath_sh));
				prwrsh.println((new StringBuilder()).append(AccOut).toString());
				prwrsh.flush();
				prwrsh.close();
			}

			//System.out.println("\n"+fin);
			prwr.println((new StringBuilder()).append("\n"+fin).toString());

			prwr.flush();
			prwr.close();
			prwrList.flush();
			prwrList.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+$", "");
	}

	public static String lrtrim(String source){
		return ltrim(rtrim(source));
	}

	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,condomStgArr,ruleStgArr,prinStgArr,conSp,conSpEq,condomSp;
	static String[] permlStgArr,tmpPermlArr,permTmpArr,domSp,domSpEq;
	static String condomStg,permlStg,inArgPath,TotOut,TdomOut,TconOut,AccOut,xmlOut;
;
	static String conStg,conOut,domStg,domOut,dtStg;
	static int tmpInt;
	static PrintWriter prwrsh;
	static File inPath,outPath,outpath_sh,outList;
	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>
	*/
}
