
import java.io.*;
import java.beans.*;
import java.net.URL;
import java.text.*;

import java.awt.*;
import java.awt.Window;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.JOptionPane;
import javax.swing.border.*;
import javax.swing.plaf.*;
import javax.swing.event.*;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.DefaultListModel;

import java.util.*;
import java.util.List;
import java.util.Vector;
import java.util.ResourceBundle;

import sun.net.ftp.FtpClient;

public class NCRh23c implements ListSelectionListener {
	JFrame container;
	JList LnumJList;
	JTextField PnumField, LnumField, SnumField, ProgField, ftp_Field;
	JButton ButQry, ButRQry, ExitBut, ResBut, OpenBut, GetBut, RInBut, RStatBut, RQuBut;
	JScrollPane PtextScroller, LtextScroller, StextScroller;
	ListSelectionModel listSelectionModel;
	DefaultListModel LlistModel;

	String Fstg, Pnum, Lnum, Snum, query, ftp_stg, ftp_Fstg, OutFileNm, dirStg, dirStg2;
	String LnumSnm, TmpFileNm, getDataNm, dataOutStg, DOSubNm, DataOutSubStg, delStg, SubStg;
	String LotStg, PartStg, dirStg12, paramStg, statStg, tfulStg, codeStg, sName, finFlStg;
	String lfulStg, tmpStg, cnStg1, fileStg;

	Vector ncrV, fulV;
	String[] sn_array = new String[3];
	String[] cam_array = new String[4];
	String[] fulText, finText, fulNcr, lfText, lotReadStg;

	int trackWord, cntr, scntr, nctr, rcntr, h, i, j, k, mtPos = 0;

	long tBefCon1, tBefCon2, tBefCon3, tBefCon4, tAftCon1, tAftCon2, tAftCon3, tAftCon4;

	public static void main(String[] arg){
		new NCRh23c();
	}

	public NCRh23c() {
		WindowListener l = new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				DelOut();
				System.exit(0);
			}
		};

		container=new JFrame("NCR Query");
		container.addWindowListener(l);

		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		Dimension frameSize=new Dimension((int)(screenSize.width/2),(int)(screenSize.height/2));
		int x=(int)(frameSize.width/2);
		int y=(int)(frameSize.height/2);
		container.setBounds(x,y,frameSize.width,frameSize.height);
		container.getContentPane().setLayout( new BorderLayout() );

		JPanel jb_out = new JPanel();
		jb_out.setLayout(new BorderLayout());
		jb_out.add(buildJBallPanel(), BorderLayout.NORTH);

		JPanel buttonPanel = new JPanel();
		buttonPanel.setLayout ( new FlowLayout(FlowLayout.CENTER) );

		ExitBut = new JButton("RUN");
		ExitBut.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				svr_cyc();
		}});
		buttonPanel.add(ExitBut);

		container.getContentPane().add(jb_out, BorderLayout.NORTH);
		container.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
		container.pack();
		container.setVisible(true);
	}

	public JPanel buildJBallPanel() {
		JPanel JBallGrid = new JPanel();
		GridBagLayout gbc0 = new GridBagLayout();
		JBallGrid.setLayout(gbc0);

		//		Part, Lot & Serial Number Panels

		JPanel JBtaPanel = new JPanel();
		GridBagLayout gbc2 = new GridBagLayout();
		JBtaPanel.setLayout(gbc2);
		JBtaPanel.setBorder( new TitledBorder("INPUT") );

		//		Lot Number List/Panel

		JPanel LnumJl_StgPanel = new JPanel();
		LnumJl_StgPanel.setLayout(new BorderLayout());

		JLabel LnumJl_StgLabel = new JLabel (" Lot Number: ");
		LnumJl_StgPanel.add(LnumJl_StgLabel, BorderLayout.NORTH);

		LlistModel = new DefaultListModel();
		LnumJList = new JList(LlistModel);
		LnumJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		//LnumJList.setSelectedIndex(0);
		LnumJList.addListSelectionListener(this);

		LtextScroller = new JScrollPane( LnumJList,
			ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
			ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		LtextScroller.setPreferredSize(new Dimension(80, 360));
		LnumJl_StgPanel.add(LtextScroller);

		LnumField = new JTextField(35);
		LnumJl_StgPanel.add(LnumField, BorderLayout.SOUTH);

		JBtaPanel.add(LnumJl_StgPanel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
				,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 5, 0));

		//		All Panel Grid

		JBallGrid.add(JBtaPanel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
				,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 3, 3, 3), 5, 0));

		return JBallGrid;
	}

	public void svr_cyc() {
		fulV = new Vector();

		if ( LnumJList.getModel().getSize() > 0 ) {
			LnumJList.setModel(LlistModel = new DefaultListModel());
			LnumField.setText("");
		}

		sn_array[0] = "blacmm1.heico-dc.com";
		sn_array[1] = "meatii.heico-dc.com";
		sn_array[2] = "heisco1.heico-dc.com";
		//sn_array[0] = "www.datajett.com";

		for (i = 0; i < sn_array.length; i++) { DirListGet( sn_array[i] ); }

		String[] serStgArr = new String[ fulV.size() ];
		fulV.copyInto( serStgArr );

		String[] serStgArr1 = sortStrings( serStgArr );
		String[] serStgArrS = reverseStrings( serStgArr1 );

		for (int s = 0; s < serStgArrS.length; s++) { LlistModel.addElement(serStgArrS[s]); }
	}

	public void DirListGet( String sn_array_in ) {
		//String uNm = "datajett";
		//String pWd = "rbjllj69";
		String uNm = "transfer";
		String pWd = "transfer";

		String jbStg = "/JB_FILES/";
		//String path1 = "/public_html/HC";
		String path1 = "/u/mm4";

		String cdP = path1 + jbStg;
		//System.out.println("cdP: " + cdP);

		tBefCon2 = System.currentTimeMillis();
		DirGet( sn_array_in, uNm, pWd, cdP );
		tAftCon2 = System.currentTimeMillis();
		System.out.println( "1) " + sn_array_in + " Connect time(ms): " + java.lang.Long.toString(tAftCon2-tBefCon2) + "\n" );
	}

	public void DirGet( String sName, String uName, String pWord, String cdPath ) {
		try {
			FtpWr ftpt = new FtpWr();
			String[] fulTextR = null;
			String[] fulTextR2 = null;

			ftpt.openServer(sName);
			if (ftpt.serverIsOpen()) {
				//System.out.println("Connected to " + sName);
				try {
					ftpt.login(uName, pWord);
					ftpt.cdDir(cdPath);
					fulTextR=ftpt.listRawStg();

					for (int i = 0; i < fulTextR.length; i++) {
						int spPos = fulTextR[i].lastIndexOf(" ");
						dirStg = fulTextR[i].substring(spPos+1,fulTextR[i].length());

						int dotPos = dirStg.indexOf(".");
						int dPos = fulTextR[i].indexOf("d");
						int revPos = dirStg.indexOf("rev");
						int tmpPos = dirStg.indexOf("TMP");

						if ( dotPos < 0  && dPos == 0 && revPos < 0 && tmpPos < 0 ) {

							String tmpDirStg = cdPath+"/"+dirStg;
							//System.out.println(tmpDirStg);

							ftpt.cdDir(tmpDirStg);
							fulTextR2=ftpt.listRawStg();

							for (int i2 = 0; i2 < fulTextR2.length; i2++) {
								int spPos2 = fulTextR2[i2].lastIndexOf(" ");

								//System.out.println("\nfulTextR2[i2]: " + fulTextR2[i2]);

								dirStg2 = fulTextR2[i2].substring(spPos2+1,fulTextR2[i2].length());

								//System.out.println("View: dirStg2: " + dirStg2);

								int dotPos2 = dirStg2.indexOf(".");
								int dPos2 = fulTextR2[i2].indexOf("d");
								int revPos2 = dirStg2.indexOf("rev");
								int tmpPos2 = dirStg.indexOf("TMP");

								if ( dotPos2 < 0  && dPos2 == 0 && revPos2 < 0 && tmpPos2 < 0 ) {
									String dirStg3 = dirStg2 + ":@:" + dirStg + ":@:" + sName;
									//System.out.println("Accepted: dirStg3: " + dirStg3);

									fulV.addElement( dirStg3 );
									//if (!alreadyInLList(dirStg2)) { LlistModel.addElement(dirStg3); }
								}
							}
						}
					}
				} catch (Exception ftpe) {
					System.out.println("Exception: ");
					ftpe.printStackTrace();
				} finally {
					ftpt.closeServer();
				}
			} else {
				System.out.println("Unable to connect to: " + sName);
			}
		} catch(Exception e) {
			System.out.println("Exception: " );
			e.printStackTrace();
		}
	}

	public void valueChanged(ListSelectionEvent e) {
		if (e.getValueIsAdjusting() == false) {
			if (LnumJList.getSelectedIndex() != -1) {
				LnumSnm = LnumJList.getSelectedValue().toString();
				//System.out.println(LnumSnm);
				LnumField.setText("");
				LnumField.setText(LnumSnm);
				LnumJList.clearSelection();

				tBefCon1 = System.currentTimeMillis();
				//System.out.println("Ssize: " + LnumJList.getModel().getSize());
				DirGetFeed( LnumSnm );
				tAftCon1 = System.currentTimeMillis();
				System.out.println("\n2) " + LnumSnm + " Connect time(ms): " + java.lang.Long.toString(tAftCon1-tBefCon1) );
			}
		}
	}

	public void DirGetFeed( String LnumSnm2 ) {
		int Pos1 = LnumSnm2.lastIndexOf(":@:");
		dirStg12 = LnumSnm2.substring(0,Pos1);
		Fstg = LnumSnm2.substring(Pos1+3,LnumSnm2.length());

		int Pos2 = dirStg12.lastIndexOf(":@:");
		LotStg = dirStg12.substring(0,Pos2);
		PartStg = dirStg12.substring(Pos2+3,dirStg12.length());

		//String uNm = "datajett";
		//String pWd = "rbjllj69";
		String uNm = "transfer";
		String pWd = "transfer";

		String jbStg = "/JB_FILES/";
		//String path1 = "/public_html/HC";
		String path1 = "/u/mm4";

		String cdP = path1 + jbStg + PartStg + "/" + LotStg;
		System.out.println("cdP: " + cdP);

		LnumQuery( Fstg, uNm, pWd, cdP );
	}

	public void LnumQuery( String sName, String uName, String pWord, String cdPath ) {
		try {
			String outInPut = "ftp://" + uName + ":" + pWord + "@" + sName + cdPath + "/MRB.TXT";
			System.out.println("Scanning File: " + outInPut);

			String surl = outInPut;
			URL url = new URL(surl);
			BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
			Vector lines = new Vector();
			String aLine = reader.readLine();

			while( aLine != null ) {
				lines.addElement( aLine );
				aLine = reader.readLine();
			}

			fulText = new String[ lines.size() ];
			lines.copyInto( fulText );

			reader.close();
		}
		catch (IOException exc2) {
			System.out.println("Exception: ");
			exc2.printStackTrace();
		}

		stgRead();
		getDataNm = getDataNm();

		SaveSelected( getDataNm );
		RunCmdInt( getDataNm );
	}

	public void stgRead() {
		Vector entV = new Vector();
		int tcntr = cntr;
		int scntr = 0;

		//paramStg = "SECT   CN  PARAM VALUE";
		statStg = "STATISTICAL PROCESS CONTROL";

		// "SECTFF 133 LEA -0.2400"
		// "SECTPP 148 N_ANGLE -0.0200"

		for (i = 2; i < fulText.length; i++) {
			if ( fulText[i].indexOf(statStg) < 0 ) {
				String[] varArr = creSArray( fulText[i], " " );
				//for (h = 0; h < trackWord+1; h++) { System.out.println("varArr[h]: " + varArr[h]); }
				//System.out.println("%%%fulText[i]: " + fulText[i]);

				codeStg = "AIRFOIL";
				if ( varArr[2].compareTo("N_ANGLE") == 0 || varArr[2].compareTo("LEA") == 0
					|| varArr[2].compareTo("TEA") == 0 ) { codeStg = "ROOT"; }

				String secfStg = varArr[0].substring(4,varArr[0].length()); // Found "FF"

				tfulStg = varArr[1]+",0,1,"+codeStg+","+secfStg+"|"+varArr[2]+"|"+varArr[3];
				//System.out.println("@@@tfulStg: " + tfulStg);

				entV.addElement( tfulStg );
			}
			else {
				i = fulText.length;
			}
		}

		tBefCon4 = System.currentTimeMillis();
		String[] ncrLocal = rtnNcrStg();
		tAftCon4 = System.currentTimeMillis();
		System.out.println("\n4) Cameleon Connect time(secs): " + java.lang.Long.toString(tAftCon4-tBefCon4) + "\n" );

		for (int t = 0; t < ncrLocal.length; t++) {
			//System.out.println("XXX-ncrLocal[t]: " + ncrLocal[t] + " & t: " + t );
			entV.addElement( ncrLocal[t] );
		}

		finText = new String[ entV.size() ];
		//for (h = 0; h < finText.length; h++) {finText[h] = "";}
		entV.copyInto( finText );

		for (int s = 0; s < finText.length; s++) {
			//System.out.println("F@@@-finText[s]: " + finText[s] + " & s: " + s );
		}
	}

	public String[] rtnNcrStg() {
		ncrV = new Vector();
		fulNcr = null;

		cam_array[0] = "\\\\Chameleon-1\\PC-DMIS\\LOT_DATA";
		cam_array[1] = "\\\\Chameleon-2\\PC-DMIS\\LOT_DATA";
		cam_array[2] = "\\\\Chameleon-3\\PC-DMIS\\LOT_DATA";
		cam_array[3] = "\\\\Chameleon-4\\PC-DMIS\\LOT_DATA";
		//cam_array[0] = "D:\\Dev\\HTML\\datajett.com\\public_html\\HC\\NCR";

		for (i = 0; i < cam_array.length; i++) {
			tBefCon3 = System.currentTimeMillis();

			String tmpCamStg = cam_array[i];
			//System.out.println( "tmpCamStg: " + tmpCamStg );

			File aFile = new File(cam_array[i]);
			if(!aFile.exists())
				System.out.println("Directory: " + tmpCamStg + " does not exist");
			else if(!aFile.isDirectory())
				System.out.println( tmpCamStg + " is not a directory" );
			else{
				PrintDir(0, aFile);
				System.out.println( " Completed: " + tmpCamStg);
				//System.out.println( "Complete......");
			}
			tAftCon3 = System.currentTimeMillis();
			System.out.println("\n3) " + tmpCamStg + " Connect time(ms): " + java.lang.Long.toString(tAftCon3-tBefCon3) );
		}

		fulNcr = new String[ ncrV.size() ];
		//for (h = 0; h < finText.length; h++) {finText[h] = "";}
		ncrV.copyInto( fulNcr );
		return fulNcr;
	}

	public void PrintDir(int indent, File aFile){
		File[] theFiles = aFile.listFiles();
		Vector vec = new Vector();

		System.out.println("LotStg: " + LotStg );

		for(int x=0; x<theFiles.length; x++){

			fileStg = theFiles[x].toString();
			mtPos = fileStg.indexOf(LotStg);

			if(theFiles[x].isDirectory()){
				vec.add(theFiles[x]);
				//ncrV.addElement( theFiles[x].toString() );
				System.out.println("Dir - No Add: " + fileStg);
			}
			else if ( mtPos > 0 ) {

				System.out.println("%%%[IS1] LotStg: " + LotStg + " == fileStg: " + fileStg );

				for(int i=1; i<=indent; i++) {
					System.out.println("  *File - Add: " + fileStg);

					int spPos = fileStg.lastIndexOf("/");
					finFlStg = fileStg.substring(spPos+1,fileStg.length());

					int lotPos = finFlStg.lastIndexOf(LotStg);
					int prtPos = finFlStg.lastIndexOf(PartStg);

					if ( lotPos >= 0  && prtPos >= 0 ) {
						//ncrV.addElement( fileStg );
						String[] LotFileStg = lotFlRead( fileStg );

						for (int s = 0; s < LotFileStg.length; s++) {
							System.out.println("    ***LotFileStg[s]: " + LotFileStg[s] + " & s: " + s );
							ncrV.addElement( LotFileStg[s] );
						}
					}
				}
			}
		}

		int count = 0;
		while(count != vec.size()){
			PrintDir(indent+1, (File)vec.elementAt(count));
			count++;
		}
	}

	public String[] lotFlRead( String filename ) {
		try {
			FileInputStream fis = new FileInputStream(filename);
			InputStreamReader isr = new InputStreamReader(fis);
			LineNumberReader lnr = new LineNumberReader(isr);

			Vector flines = new Vector();
			String afLine = lnr.readLine();

			while( afLine != null ) {
				flines.addElement( afLine );
				afLine = lnr.readLine();
			}

			lfText = new String[ flines.size() ];
			flines.copyInto( lfText );

			isr.close();

			lotReadStg = QueryRead( lfText );
		}
		catch (IOException exc2) {
			System.out.println("Exception: ");
			exc2.printStackTrace();
		}
		return lotReadStg;
	}

	public String[] QueryRead( String[] fulText ) {
		Vector lotV = new Vector();

		for (i = 0; i < fulText.length; i++) {
			int cnPos, dimPos, snPos = 0;

			cnPos = fulText[i].indexOf("C/N");
			snPos = fulText[i].indexOf("S/N");
			dimPos = fulText[i].indexOf("DIM");

			//System.out.println( "cnPos: " + cnPos + " & dimPos: " + dimPos );

			if ( cnPos > -1 || snPos > -1 ) {
				int spPos = fulText[i].lastIndexOf(" ");
				cnStg1 = fulText[i].substring(spPos+1,fulText[i].length()); // Found C/N
			}
			else if ( dimPos > -1 ) {
				tmpStg = fulText[i+2];
				//System.out.println( "tmpStg: " + tmpStg );

				String[] varArr = creSArray( tmpStg, "   " );

				for (int h = 0; h < trackWord+1; h++) {
					//System.out.println("varArr[h]: " + varArr[h] + " & h: " + h );
				}

				lfulStg = cnStg1+",0,1,Other,NOM="+varArr[4]+"|+TOL="+varArr[7]+"|-TOL="+varArr[10]+"|MEAS="+varArr[13];
				//System.out.println("lfulStg: " + lfulStg);

				lotV.addElement( lfulStg );
				i++;i++;
			}
		}

		String[] cnStgArr = new String[ lotV.size() ];
		lotV.copyInto( cnStgArr );

		for (int s = 0; s < cnStgArr.length; s++) {
			//System.out.println("C/N||S/N: cnStgArr[s]: " + cnStgArr[s] + " & s: " + s );
		}
		return cnStgArr;
	}

	public String[] creSArray(String toArray, String splitChar) {
		String newArray[] = new String[toArray.length()];
		String tmpWord = "";
		trackWord=0;

		for(int i=0;i<toArray.length();i++) {
			String tmpLtr = toArray.charAt(i) + "";
			if(tmpLtr.compareTo(splitChar)>0) {
				tmpWord+=toArray.charAt(i);
			} else {
				newArray[trackWord] = tmpWord;
				trackWord++;
				tmpWord="";
			}
		}

		int tmpPos = toArray.lastIndexOf(splitChar);
		newArray[trackWord] = toArray.substring(tmpPos+1, toArray.length());

		return newArray;
	}

	public void RunCmdInt ( String getDataNm ) {
		String s = null;
		try {
			String wordpad = ("\"C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe\"");
			Process p = Runtime.getRuntime().exec("cmd /C " + wordpad + " " + getDataNm );

			BufferedReader stdInput = new BufferedReader(new
				InputStreamReader(p.getInputStream()));

			BufferedReader stdError = new BufferedReader(new
				InputStreamReader(p.getErrorStream()));

			while ((s = stdInput.readLine()) != null) {
				System.out.println( s );
			}
		}
		catch (IOException e) {
			System.out.println("Exception: " );
			e.printStackTrace();
			System.exit(-1);
		}
	}

	public void SaveSelected( String getDataNm ) {
		try {
			PrintStream expfl = new PrintStream(new FileOutputStream(getDataNm));
			for (j = 0; j < finText.length; j++) {
				//System.out.println("F2@@@-finText[j]: " + finText[j] );
				if ( finText[j] != "" ) { expfl.println( finText[j] ); }
			}
			expfl.flush();
			expfl.close();
		} catch(java.io.IOException IOEx) {
			System.out.println("Cannot create " + getDataNm + " file.");
		}
	}

	protected boolean alreadyInLList(String name) { return LlistModel.contains(name); }

	public void DelOut() {
		String s2 = null;
		try {
			String delStg = ("\"del *_out.txt\"");
			Process p2 = Runtime.getRuntime().exec("cmd /C " + delStg );

			BufferedReader stdInput2 = new BufferedReader(new
				InputStreamReader(p2.getInputStream()));

			BufferedReader stdError2 = new BufferedReader(new
				InputStreamReader(p2.getErrorStream()));

			while ((s2 = stdInput2.readLine()) != null) {
				System.out.println( s2 );
			}
		}
		catch (IOException e9) {
			System.out.println("Exception: ");
			e9.printStackTrace();
			System.exit(-1);
		}
	}

	public String[] sortStrings( String[] strings ) {
		for ( int i = 0; i < strings.length - 1; ++i ) {
			for ( int j = i + 1; j < strings.length; ++j ) {
				if ( strings[i].compareTo( strings[j] ) > 0 ) {
		 			String t = strings[i];
		 			strings[i] = strings[j];
		 			strings[j] = t;
				}
			}
		}
		return strings;
	}

	public String[] reverseStrings( String[] strings ) {
		String temp;
		int left = 0;
		int right = strings.length - 1;

		while (left < right) {
			temp = strings[left];
			strings[left] = strings[right];
			strings[right] = temp;
			right--;
			left++;
		}
		return strings;
	}

	public String getDataNm() {
		OutFileNm = LotStg + "." + PartStg + "." + sName + "_out.txt";
		return OutFileNm;
	}

	public String getPnum() {
		Pnum = PnumField.getText();
		return Pnum;
	}

	public String getLnum(){
		Lnum = LnumField.getText();
		return Lnum;
	}

	public String getSnum() {
		Snum = SnumField.getText();
		return Snum;
	}

	public void CancelPressed() {
		System.exit(0);
	}
}

class FtpWr extends FtpClient {
	public boolean cdDir (String dirPath) throws IOException {
		issueCommand("CWD " + dirPath);
		return isValidResponse();
	}

	public String[] listRawStg() throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(list()));
		Vector lines = new Vector();

		String aLine = reader.readLine();
		while( aLine != null )
		{
			lines.addElement( aLine );
			aLine = reader.readLine();
		}

		String[] lineArray = new String[ lines.size() ];
		lines.copyInto( lineArray );
		return lineArray;
	}

	public boolean isValidResponse() {
		try {
			int respCode = Integer.parseInt(getResponseString().substring(0, 3));
			return (respCode  >= 200 && respCode < 300);
		} catch (Exception e) {
			return false;
		}
	}
}
